我的游戏应用程序使用 XAudio2.lib 并针对 Windows 8 和 Windows 10。代码如下:
#include <Xaudio2.h>
HRESULT hr = XAudio2Create(&s_audioEngine, 0);
hr = s_audioEngine->CreateMasteringVoice(&s_masteringVoice);
s_audioEngine->RegisterForCallbacks(&s_callbacks);
一切都很好。我可以拔下耳机,然后再插回去,没有问题。IXAudio2EngineCallback::OnCriticalError(HRESULT error)
从来没有被叫过。
在我们决定支持 Windows 7 之前一切都很好。我了解到在这种情况下我必须使用 DirectX 版本的 XAudio2。所以我_WIN32_WINNT=0x0601
在预处理器定义中设置,XAudio2.lib
从依赖项中删除并将代码更改为
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
#include <Xaudio2.h>
#else
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xaudio2.h>
#endif
它现在启动,播放声音,但是当我拔下耳机时,它会调用IXAudio2EngineCallback::OnCriticalError
这意味着我必须重新启动音频引擎并重新创建所有音频内容。
我不想有这样的痛苦,所以我在阅读MSDN,我看到:
如果您为 IXAudio2::CreateMasteringVoice 指定 NULL 或 szDeviceId 参数,则系统使用虚拟音频客户端来表示音频端点。在这种情况下,如果底层 WASAPI 渲染设备不可用,系统会自动选择新的音频渲染设备进行渲染,音频处理继续进行,并且不会引发 OnCriticalError。
这是什么意思?什么是
如果指定 NULL 或 szDeviceId 参数?
谁能解释我如何打电话CreateMasteringVoice
来避免OnCriticalError
?