0

我的游戏应用程序使用 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

4

1 回答 1

1

基本上对于 XAudio 2.7 或 XAudio 2.8,如果扬声器或耳机被拔出,WASAPI 会告诉 XAudio 端点已消失。恢复的唯一方法是销毁整个 XAudio 图并重新创建它。在 Windows 10、XAudio 2.9 上,使用“默认”设备而不是特定设备,WASAPI 将负责自动迁移端点,因此 XAudio 不会被告知端点丢失。

如果您使用XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT.

有关处理此“丢失设备”场景的示例,请参阅DirectX Tool Kit for Audio

于 2016-02-25T07:59:42.897 回答