为什么在DirectX版本的XAudio2中调用OnCriticalError?

时间:2016-02-24 11:29:59

标签: c++ audio visual-c++ directx xaudio2

我的游戏应用使用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,我看到了:

  

如果指定了NULL或szDeviceId参数   IXAudio2 :: CreateMasteringVoice,然后系统使用虚拟音频   客户端代表音频端点。在这种情况下,如果   基础WASAPI渲染设备变得不可用,系统   自动选择新的音频渲染设备进行渲染,   音频处理继续,并且不会引发OnCriticalError。

这是什么意思?什么是

  

如果指定了NULL或szDeviceId参数?

任何人都可以解释如何致电CreateMasteringVoice以避免OnCriticalError

1 个答案:

答案 0 :(得分:1)

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

如果您使用XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT,则可以在Windows 10上重现相同的行为。

请参阅DirectX Tool Kit for Audio,了解处理此设备丢失的设备&#39;场景。