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

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            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

            問題背景

             

            錄音播音實際需求

            1、隨時終止

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

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

             

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

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

             

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

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

             

            原因分析

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

             

            解決方案

            方案一

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

             

            標記作用如下

            if(!bReset)

            {

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

            }

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

             

            當然也可以采用臨界保護。


            方案二

            換一個角度去考慮問題,之所以死鎖,是因為兩個線程沖突了的緣故,所以可以建立一個線程

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

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

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

            久久亚洲sm情趣捆绑调教 | 伊人久久大香线蕉AV一区二区| 精品久久久无码人妻中文字幕| 国产欧美一区二区久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久精品三级视频| 99久久综合国产精品二区| 久久夜色精品国产噜噜噜亚洲AV| 久久久久精品国产亚洲AV无码 | 久久精品中文字幕久久| 99久久久国产精品免费无卡顿| 久久精品人人做人人爽电影蜜月| 99久久免费国产精品特黄| 久久久久久久久66精品片| 香蕉久久久久久狠狠色| 亚洲伊人久久精品影院| 久久亚洲美女精品国产精品| 九九精品99久久久香蕉| 国产一区二区精品久久| 99久久精品国产一区二区三区| 国産精品久久久久久久| 7777精品伊人久久久大香线蕉| 久久伊人精品一区二区三区| 国产aⅴ激情无码久久| 国产人久久人人人人爽| 精品综合久久久久久88小说| 亚洲国产天堂久久综合| 伊人久久大香线蕉av一区| 国产成人精品久久二区二区| 国内精品伊人久久久久网站| 亚洲欧美另类日本久久国产真实乱对白 | 品成人欧美大片久久国产欧美| 久久精品夜色噜噜亚洲A∨ | 亚洲中文字幕久久精品无码喷水| 久久w5ww成w人免费| 久久九九免费高清视频| 无码日韩人妻精品久久蜜桃| 大蕉久久伊人中文字幕| 久久九九久精品国产免费直播| 国产精品九九九久久九九| 日韩欧美亚洲综合久久影院Ds|