Windows Audio / WaveInAddBuffer() blocks

Windows Audio / WaveInAddBuffer() blocks

本文关键字:blocks WaveInAddBuffer Audio Windows      更新时间:2023-10-16

我的应用程序从连接到电脑的麦克风录制音频样本。因此,我选择Windows WaveInXXX API来完成这项工作。

在阅读了文档后,我决定避免使用WaveInProc的回调机制,以避免同步线程的麻烦。整个应用程序相当大,我认为这会使调试更简单。当应用程序请求一个样本块时,我只需迭代我的缓冲区队列,取出一个,复制数据,取消准备,准备并将其添加回缓冲区队列。基本程序结构是这样的,我希望它能使基本程序流程清晰:

WaveInOpen()
WaveInStart()
FunctionAddingPreparedBuffersToTheQueue()
while(someConditionThatEventuallyBecomesFalse)
    if(NextBufferInQueueIsMarkedDone)
        GetDataFromBuffer()
        UnpreparePrepareHeaderAndAddBuffer()
    else
        WaitForAShortTime()
WaveInStop()
WaveInClose()

现在问题出现了:一段时间后(我无法重现确切的情况),WaveInAddBuffer()会导致死锁,尽管它与其他线程在同一个线程中。死锁发生时应添加的缓冲区的标头已准备好,dwFlags == WHDR_PREPARED == 2也已准备好。

有什么想法会导致这种僵局吗?

我没有看到这样的问题,但猜测可能是与所有未准备/准备周期相关的碎片。它们不是必需的。您可以为每个缓冲区准备一次,然后在录制完成后取消准备。(Prepare将缓冲区锁定到物理内存中。)