mediaplayer构架研究之二关于音频的播放控制
代码的作者说,音频播放是个实时线程,在程序中通过一个播放线
程来执行,线程不断读入解码后的音频数据,然后播放。
问题就出在如何控制播放的暂停,实际检测的结果是播放无法暂停。
关于暂停,代码是这样设计的:
void setPause()
{
audioMutex->lock();
threadGoOk = FALSE;
audioMutex->unlock()
}
void auidoThread(void *)
{
....
while(threadGoOk&&haveMoreAudioData)
{
audioMutex->lock();
playSound();
audioMutex->unlock();
}
}
实际DEBUG发现setPause在audioMutex->lock();处锁定。
而那个音频线程auidoThread在while循环里执行audioMutex->unlock释放了锁后,又很快
锁了,而不是另一个线程即setPause去锁audioMutex.
未完...
先来复习一下多线程的相关概念:
http://dev.csdn.net/Develop/article/19/19763.shtm
问题的核心在于如何在一个CPU密集线程中高效的处理同步。
这就要采用条件变量来实施.比如暂停功能,要暂停音频的播放,
音频线程又不能在那空轮询一个标志位(这个标志位又用户界面线
程设置和清除),那么这时候采用条件变量是最佳的.值得注意的是
条件变量与MUTEX是不同的,后者的用意在于互斥,而条件变量在于
同步。同步更加有序。条件变量用MUTEX达到释放互斥,用条件变量
(信号)达到阻塞自己的目的。释放互斥给了另一个线程以调度的机会,
但最关键的还是阻塞了自己才使别的线程能够调度。
程来执行,线程不断读入解码后的音频数据,然后播放。
问题就出在如何控制播放的暂停,实际检测的结果是播放无法暂停。
关于暂停,代码是这样设计的:
void setPause()
{
audioMutex->lock();
threadGoOk = FALSE;
audioMutex->unlock()
}
void auidoThread(void *)
{
....
while(threadGoOk&&haveMoreAudioData)
{
audioMutex->lock();
playSound();
audioMutex->unlock();
}
}
实际DEBUG发现setPause在audioMutex->lock();处锁定。
而那个音频线程auidoThread在while循环里执行audioMutex->unlock释放了锁后,又很快
锁了,而不是另一个线程即setPause去锁audioMutex.
未完...
先来复习一下多线程的相关概念:
http://dev.csdn.net/Develop/article/19/19763.shtm
问题的核心在于如何在一个CPU密集线程中高效的处理同步。
这就要采用条件变量来实施.比如暂停功能,要暂停音频的播放,
音频线程又不能在那空轮询一个标志位(这个标志位又用户界面线
程设置和清除),那么这时候采用条件变量是最佳的.值得注意的是
条件变量与MUTEX是不同的,后者的用意在于互斥,而条件变量在于
同步。同步更加有序。条件变量用MUTEX达到释放互斥,用条件变量
(信号)达到阻塞自己的目的。释放互斥给了另一个线程以调度的机会,
但最关键的还是阻塞了自己才使别的线程能够调度。