• <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死鎖原因與解決方案

            轉載自:http://blog.csdn.net/soliddream66/article/details/5353960

            問題背景

             

            錄音播音實際需求

            1、隨時終止

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

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

             

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

            大致如下調用的循環

             

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

            循環周期40ms,我采用的是回調函數。問題是有時候調用waveInReset/waveOutReset會形成死鎖,調用waveInReset/waveOutReset的線程與回調函數所在的線程死鎖在一塊了。

             

            原因分析

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

             

            解決方案

            方案一

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

             

            標記作用如下

            if(!bReset)

            {

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

            }

            延時調用waveInReset/waveOutReset,延時時間長度以循環周期為妙,我這個例子中也就是采用40ms。

             

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


            方案二

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

            錄音

            waveInUnprepareHeader

            waveInPrepareHeader

            waveInAddBuffer

             

            播音

            waveOutUnprepareHeader

            waveOutPrepareHeader

            waveOutWrite

             

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

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

            无码AV波多野结衣久久| 国产高潮久久免费观看| 久久婷婷色综合一区二区| 一级女性全黄久久生活片免费| 国产综合成人久久大片91| 亚洲精品无码久久毛片| 午夜精品久久久久久久| 亚洲一本综合久久| 亚洲国产视频久久| 国产精品久久久久9999| 色偷偷91久久综合噜噜噜噜| 亚洲国产精品一区二区久久hs| 久久精品国产69国产精品亚洲| 久久亚洲国产精品123区| 熟妇人妻久久中文字幕| 久久91精品综合国产首页| 国产综合久久久久久鬼色| 久久精品免费一区二区三区| 天堂无码久久综合东京热| 久久不见久久见免费视频7| 人妻无码精品久久亚瑟影视| 久久婷婷成人综合色综合| 一本久久综合亚洲鲁鲁五月天| 亚洲av伊人久久综合密臀性色| 久久av免费天堂小草播放| 久久久久夜夜夜精品国产| 亚洲国产精品久久电影欧美| 色偷偷88欧美精品久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 九九久久99综合一区二区| 777午夜精品久久av蜜臀| 久久久久97国产精华液好用吗| 久久国产精品-久久精品| 奇米综合四色77777久久| 久久久久久曰本AV免费免费| 亚洲欧美日韩精品久久亚洲区 | 国产精品伦理久久久久久| 欧美丰满熟妇BBB久久久| 久久偷看各类wc女厕嘘嘘| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国产巨作麻豆欧美亚洲综合久久|