2016-02-24 7 views
0

Моя игра приложение использует XAudio2.lib и был предназначен для Windows 8 и Windows, 10. Код следующим образом:Почему OnCriticalError вызывается в DirectX версии XAudio2?

#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, то система использует виртуальный Аудио Клиент для представления конечной точки аудио. В этом случае, если , лежащее в основе устройства визуализации WASAPI, становится недоступным, система автоматически выбирает новое устройство рендеринга аудио для рендеринга, обработка звука продолжается, а OnCriticalError не поднимается.

Что это значит? Что такое

Если вы указали параметр NULL или szDeviceId?

Может кто-нибудь объяснить, как я могу позвонить CreateMasteringVoice, чтобы избежать OnCriticalError?

+0

Я не вижу этого примечания. Я вижу, цитирую: «Обратите внимание, что версия CreateMasteringVoice DirectX SDK XAUDIO2 приняла аргумент DeviceIndex вместо аргумента szDeviceId и StreamCategory, что отражает изменения, необходимые для стандартной модели перечисления устройств Windows». Так звучит так, будто вы ввернуты, когда используете 5-летний SDK. –

+0

Я знаю, что CreateMasteringVoice имеет несколько разные подписи в DX и Windows SDK. Но по умолчанию параметры являются нулями, поэтому он компилируется просто отлично. Поэтому я до сих пор не понимаю, как избежать ошибок при удалении наушников. – Nick

ответ

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 Tool Kit for Audio для примеров использования этого сценария «потерянного устройства».