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达到释放互斥,用条件变量
(信号)达到阻塞自己的目的。释放互斥给了另一个线程以调度的机会,
但最关键的还是阻塞了自己才使别的线程能够调度。

posted on 2004-07-21 14:52  embed  阅读(601)  评论(0编辑  收藏  举报

导航