繁体   English   中英

Windows Audio / WaveInAddBuffer()块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM