• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            waveInReset/waveOutReset死鎖原因與解決方案

            轉(zhuǎn)載自:http://blog.csdn.net/soliddream66/article/details/5353960

            問(wèn)題背景

             

            錄音播音實(shí)際需求

            1、隨時(shí)終止

            2、錄音并非文件,而是形成rtp發(fā)送

            3、播音并非源于文件,而是源于rtp

             

            因此Waveform audio使用的buffer較小,不斷的裝載/發(fā)送 buffer,終止的時(shí)候Reset并且close.

            大致如下調(diào)用的循環(huán)

             

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

            循環(huán)周期40ms,我采用的是回調(diào)函數(shù)。問(wèn)題是有時(shí)候調(diào)用waveInReset/waveOutReset會(huì)形成死鎖,調(diào)用waveInReset/waveOutReset的線程與回調(diào)函數(shù)所在的線程死鎖在一塊了。

             

            原因分析

            這方面網(wǎng)上有文章提到,就是調(diào)用waveInReset/waveOutReset的同時(shí)調(diào)用了錄音/播音循環(huán)調(diào)用的某個(gè)函數(shù)會(huì)形成死鎖。我再稍作解釋下,我們知道buffer滿了或是調(diào)用Reset都會(huì)觸發(fā)消息(回調(diào)函數(shù)方式的話就是MM_WOM_DONE/MM_WIM_DATA),由于調(diào)用waveInReset/waveOutReset所在的線程,與回調(diào)函數(shù)所在的線程不是一個(gè)線程,因此很容易撞車,也就是說(shuō),你調(diào)用reset的時(shí)候,另一個(gè)線程正好在處理MM_WOM_DONE/MM_WIM_DATA,于是就這樣死鎖了。

             

            解決方案

            方案一

            先加上標(biāo)記(假設(shè)標(biāo)記bReset:bool),令bReset為true;

             

            標(biāo)記作用如下

            if(!bReset)

            {

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

            }

            延時(shí)調(diào)用waveInReset/waveOutReset,延時(shí)時(shí)間長(zhǎng)度以循環(huán)周期為妙,我這個(gè)例子中也就是采用40ms。

             

            當(dāng)然也可以采用臨界保護(hù)。


            方案二

            換一個(gè)角度去考慮問(wèn)題,之所以死鎖,是因?yàn)閮蓚€(gè)線程沖突了的緣故,所以可以建立一個(gè)線程

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

            與waveInReset/waveOutReset都放到這個(gè)線程去處理,自然不會(huì)發(fā)生死鎖了。

            posted on 2013-01-21 02:17 楊粼波 閱讀(2581) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++Windows

            亚洲精品国产第一综合99久久| 精品乱码久久久久久久| 日本精品久久久久久久久免费| 午夜视频久久久久一区| 久久精品九九亚洲精品| 亚洲国产成人久久精品动漫| 久久午夜无码鲁丝片午夜精品| 亚洲国产欧美国产综合久久| 91久久精品国产91性色也| 囯产极品美女高潮无套久久久| 久久夜色精品国产亚洲| 777午夜精品久久av蜜臀| 久久97久久97精品免视看| 久久午夜无码鲁丝片| 香蕉久久夜色精品国产尤物| 久久精品成人免费看| 亚洲伊人久久精品影院| 亚洲精品无码久久久| 国产午夜精品理论片久久| 国产精品久久久久久久久鸭| 亚洲精品无码专区久久久| 亚洲国产精品无码久久青草| 伊人久久综在合线亚洲2019| 国产成人久久精品区一区二区| 99久久国产综合精品女同图片| 久久亚洲国产成人影院网站| 91精品国产高清久久久久久91| 久久久久夜夜夜精品国产| 日韩精品久久无码人妻中文字幕 | 国产美女亚洲精品久久久综合| 国产成人精品久久| 99久久99久久精品国产片果冻| 99久久精品影院老鸭窝| 国产精品一区二区久久国产| 久久久久久午夜成人影院| 久久久久久九九99精品| 久久精品99久久香蕉国产色戒 | 国产精品一区二区久久| 四虎国产永久免费久久| a级毛片无码兔费真人久久| 久久97久久97精品免视看秋霞|