我在Windows 7 x86应用程序上使用XAudio2.7来传输音频样本。源语音以 8KHz、单声道和每采样波形格式 16 位创建。然后我运行一个后台线程,该线程等待语音回调并提交新的缓冲区。一切都很好,直到我停止语音并且它使应用程序崩溃并出现访问冲突异常。创建转储文件后,我注意到 XAudio2 内部处理线程上发生崩溃:
堆栈跟踪
我尝试在停止语音之前停止引擎线程,但结果是一样的。
请指教,谢谢
何时释放缓冲区提交指向的内存?请记住,您必须保持所有内存指针有效,直到语音完成处理该缓冲区。数据由工作线程从应用程序内存中实时读取,而不是复制。
在语音上调用Stop
并不意味着线程在返回后立即完全停止工作。如果要确保语音的所有缓冲区都已完成,请在Stop
后使用 FlushSourceBuffers
。
(void)voice->Stop( 0 );
(void)voice->FlushSourceBuffers();
您应该查看用于音频实现的 DirectX 工具包。
顺便说一句,由于您使用的是XAudio 2.7,因此您应该知道这个已知问题。