Windows Audio / WaveInAddBuffer() blocks
Windows Audio / WaveInAddBuffer() blocks
我的应用程序从连接到电脑的麦克风录制音频样本。因此,我选择Windows WaveInXXX
API来完成这项工作。
在阅读了文档后,我决定避免使用WaveInProc
的回调机制,以避免同步线程的麻烦。整个应用程序相当大,我认为这会使调试更简单。当应用程序请求一个样本块时,我只需迭代我的缓冲区队列,取出一个,复制数据,取消准备,准备并将其添加回缓冲区队列。基本程序结构是这样的,我希望它能使基本程序流程清晰:
WaveInOpen()
WaveInStart()
FunctionAddingPreparedBuffersToTheQueue()
while(someConditionThatEventuallyBecomesFalse)
if(NextBufferInQueueIsMarkedDone)
GetDataFromBuffer()
UnpreparePrepareHeaderAndAddBuffer()
else
WaitForAShortTime()
WaveInStop()
WaveInClose()
现在问题出现了:一段时间后(我无法重现确切的情况),WaveInAddBuffer()
会导致死锁,尽管它与其他线程在同一个线程中。死锁发生时应添加的缓冲区的标头已准备好,dwFlags == WHDR_PREPARED == 2
也已准备好。
有什么想法会导致这种僵局吗?
我没有看到这样的问题,但猜测可能是与所有未准备/准备周期相关的碎片。它们不是必需的。您可以为每个缓冲区准备一次,然后在录制完成后取消准备。(Prepare将缓冲区锁定到物理内存中。)
相关文章:
- 如何更改输出的位置或光标在输出处,以便在"Code Blocks"中C++
- 从Turbo转移到Code :: Blocks
- 我可以删除 *.o文件(代码:: blocks)
- wxTimer 在启动时运行.需要在需要时启动它.(wxWidgets, Code::Blocks, C++)
- 是否可以将"non-static blocks"代码放在类定义中?
- 在 Code::Blocks 中使用自定义安装目录在 Windows 上链接 SDL-bgi
- 在 Linux Mint 中使用 Code::Blocks 设置C++
- 代码:: blocks printf double windows中的固定精度
- ofstream在极其简单的程序(GCC/Code::Blocks)中首次输出时崩溃
- 如何在代码中使用 Rcpp::Blocks IDE
- IWebBrowser2 blocks IFileDialog
- 代码::blocks无法从 sdl 库中找到SDL_FreeTexture命令
- 代码:: Blocks Console黑屏?没有错误
- C++ Builder 10.2: Thread blocks WaitForInputIdle
- pthread_mutex_lock blocks but __lock = 0
- wxSmith Code::Blocks Hello World errors
- C++编译和运行在Geany中,而不是在Netbeans,Eclipse,Code::Blocks中。为什么?
- 在 "Code Blocks" IDE 中混合编程语言?
- 在Windows 7(Mingw,Code :: Blocks)下进行编译,以获取Botan Library测试程序
- 在Windows C 代码:: Blocks上的Boost Regex