C++ Windows音频/WaveInAddBuffer()块

C++ Windows音频/WaveInAddBuffer()块,c++,multithreading,winapi,audio,waveform,C++,Multithreading,Winapi,Audio,Waveform,我的应用程序通过连接到电脑的麦克风录制音频样本。因此,我选择了WindowsWaveInXXXAPI来完成这项工作 阅读文档后,我决定避免使用带有WaveInProc的回调机制,以省去同步线程的麻烦。整个应用程序相当大,我认为这将使调试更简单。当应用程序请求一个样本块时,我只需迭代我的缓冲队列,取出一个,复制数据,取消准备,准备并将其添加回缓冲队列。基本程序结构如下所示,我希望它能使基本程序流程清晰: WaveInOpen() WaveInStart() FunctionAddingPrepar

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

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

WaveInOpen()
WaveInStart()
FunctionAddingPreparedBuffersToTheQueue()
while(someConditionThatEventuallyBecomesFalse)
    if(NextBufferInQueueIsMarkedDone)
        GetDataFromBuffer()
        UnpreparePrepareHeaderAndAddBuffer()
    else
        WaitForAShortTime()
WaveInStop()
WaveInClose()
现在问题出现了:一段时间后(我无法重现确切的条件),
WaveInAddBuffer()
会导致死锁,尽管它与其他线程位于同一个线程中。当死锁发生时应添加的缓冲区标头已准备就绪,且
dwFlags==WHDR\u prepared==2


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

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

即使您还不知道问题的原因,也请尝试发布一个,以说明您面临的问题。那么您使用的回调机制是什么,
callback\u NULL
?在死锁时,您可以破门而入并捕获冻结的线程调用堆栈——这将非常有用。我猜问题出在
NextBufferInQueueIsMarkedDone
附近,您正在检查缓冲区标志是否立即访问它们(检查
WHDR\u DONE
)。如果是这样,您不应该这样做,您应该通过首选项的回调机制获得有关缓冲区可用性的通知。@RomanR。我听从了你的建议,使用了
CALLBACK\u函数
而不是
CALLBACK\u NULL
,现在死锁消失了,谢谢你!不幸的是,我仍然不能说最初的问题是什么,这有点不令人满意。为什么您认为像我之前做的那样检查缓冲区标志是一个问题?API读取/写入工作线程上的标志。直接访问它们时,您无法将访问和API同步,所以您必须依赖API将缓冲区返回给您,而不是依赖您可以直接读取的缓冲区标志。