问题背景
录音播音实际需求
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)<

这篇博客探讨了在Windows音频API中使用waveInReset和waveOutReset时可能出现的死锁问题。问题源于非同步回调函数与reset操作在同一时刻处理缓冲区导致的线程冲突。解决方案包括设置标记并延时调用reset,或创建单独线程处理音频操作以避免死锁。
最低0.47元/天 解锁文章
746

被折叠的 条评论
为什么被折叠?



