Почему OnCriticalError вызывается в 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. Я узнал, что в этом случае я должен использовать версию 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?

0

Решение

В основном с XAudio 2.7 или XAudio 2.8, если динамик или наушники отключены, WASAPI сообщает XAudio, что конечная точка пропала. Единственный способ восстановить это уничтожить весь график XAudio и воссоздать его. В Windows 10, XAudio 2.9, используя устройство «по умолчанию», а не конкретное устройство, WASAPI позаботится об автоматической миграции конечной точки, чтобы XAudio не сообщал, что конечная точка пропала.

Вы можете воспроизвести то же поведение в Windows 10, если вы используете XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT,

Увидеть Набор инструментов DirectX для аудио для примеров обработки этого сценария «потерянного устройства».

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]