[英]Windows Audio / WaveInAddBuffer() blocks
我的应用程序记录了连接到PC上的麦克风的音频样本。 因此,我选择了Windows WaveInXXX
API来完成这项工作。
阅读文档后,我决定避免将回调机制与WaveInProc
一起使用, WaveInProc
给我带来同步线程的麻烦。 整个应用程序很大,我认为这会使调试更加简单。 当应用程序请求一块样本时,我只需要遍历我的缓冲区队列,取出一个,复制数据,取消准备,准备好并将其添加回缓冲区队列。 基本程序结构如下所示,希望它使基本程序流程清晰明了:
WaveInOpen()
WaveInStart()
FunctionAddingPreparedBuffersToTheQueue()
while(someConditionThatEventuallyBecomesFalse)
if(NextBufferInQueueIsMarkedDone)
GetDataFromBuffer()
UnpreparePrepareHeaderAndAddBuffer()
else
WaitForAShortTime()
WaveInStop()
WaveInClose()
现在问题出现了:经过一段时间(我无法重现确切的条件), WaveInAddBuffer()
会导致死锁,尽管它与其余所有线程处于同一线程中。 准备发生死锁时应添加的缓冲区的头,并且dwFlags == WHDR_PREPARED == 2
。
有什么想法会导致这种僵局吗?
我还没有看到这样的问题,但是猜测可能是与所有未准备/准备周期相关的碎片。 它们不是必需的。 您可以为每个缓冲区进行一次准备,然后在完成录制后取消准备。 (准备将缓冲区锁定到物理内存中。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.