• <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

            无码精品久久久天天影视| 亚洲国产成人久久综合碰| 亚洲熟妇无码另类久久久| AV色综合久久天堂AV色综合在| 久久精品国产亚洲AV高清热| 精品久久久久中文字幕一区| 国产精品成人久久久| 国产成人精品久久免费动漫| 亚洲国产精品成人久久蜜臀 | 久久婷婷国产剧情内射白浆| 久久免费的精品国产V∧| 理论片午午伦夜理片久久| 国内精品久久久久伊人av| 无码任你躁久久久久久久| 91精品国产91久久久久福利| 久久天天躁夜夜躁狠狠躁2022| 久久国产精品国语对白| 久久久久亚洲AV成人片| 久久91精品国产91| 久久精品国产福利国产琪琪| 久久99精品国产一区二区三区| 思思久久99热只有频精品66| 国产精自产拍久久久久久蜜| 精品999久久久久久中文字幕| 久久久久人妻一区二区三区| 久久精品国产亚洲AV大全| 一日本道伊人久久综合影| 色综合久久久久| 久久婷婷五月综合色高清 | 久久久精品日本一区二区三区| 色欲av伊人久久大香线蕉影院| 久久婷婷色综合一区二区| 一本色道久久88综合日韩精品 | 性做久久久久久久久| 久久久久国产精品三级网| 超级碰久久免费公开视频| 国产精品欧美久久久久天天影视| 久久久国产精品网站| 2021国产成人精品久久| 久久亚洲国产精品123区| 综合久久给合久久狠狠狠97色|