Мое игровое приложение использует 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. Я узнал, что в этом случае я должен использовать версию XAudio2 для DirectX. Итак, я установил _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, тогда система использует Virtual Audio
Клиент для представления конечной точки аудио. В этом случае, если
базовое устройство рендеринга WASAPI становится недоступным, система
автоматически выбирает новое устройство рендеринга аудио,
обработка аудио продолжается, и OnCriticalError не вызывается.
Что это значит? Что такое
Если вы указали параметр NULL или szDeviceId?
Может кто-нибудь объяснить, как мне позвонить CreateMasteringVoice
избежать OnCriticalError
?
В основном с XAudio 2.7 или XAudio 2.8, если динамик или наушники отключены, WASAPI сообщает XAudio, что конечная точка пропала. Единственный способ восстановить это уничтожить весь график XAudio и воссоздать его. В Windows 10, XAudio 2.9, используя устройство «по умолчанию», а не конкретное устройство, WASAPI позаботится об автоматической миграции конечной точки, чтобы XAudio не сообщал, что конечная точка пропала.
Вы можете воспроизвести то же поведение в Windows 10, если вы используете XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT
,
Увидеть Набор инструментов DirectX для аудио для примеров обработки этого сценария «потерянного устройства».
Других решений пока нет …