我的游戏应用使用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
?
答案 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;场景。