From 25206be1aa81878c01832e3463667e9882ef1ddd Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Tue, 8 May 2018 17:39:33 -0500 Subject: [PATCH] [APU] Handle XAudio2 initialization failures --- src/xenia/apu/xaudio2/xaudio2_audio_driver.cc | 38 ++++++++++++------- src/xenia/apu/xaudio2/xaudio2_audio_driver.h | 2 +- src/xenia/apu/xaudio2/xaudio2_audio_system.cc | 6 ++- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc b/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc index d6bc18023..c83bc0fcd 100644 --- a/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc +++ b/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc @@ -64,7 +64,7 @@ const DWORD ChannelMasks[] = { 0, }; -void XAudio2AudioDriver::Initialize() { +bool XAudio2AudioDriver::Initialize() { HRESULT hr; voice_callback_ = new VoiceCallback(semaphore_); @@ -73,7 +73,7 @@ void XAudio2AudioDriver::Initialize() { if (FAILED(hr)) { XELOGE("XAudio2Create failed with %.8X", hr); assert_always(); - return; + return false; } XAUDIO2_DEBUG_CONFIGURATION config; @@ -89,7 +89,7 @@ void XAudio2AudioDriver::Initialize() { if (FAILED(hr)) { XELOGE("CreateMasteringVoice failed with %.8X", hr); assert_always(); - return; + return false; } WAVEFORMATIEEEFLOATEX waveformat; @@ -116,19 +116,21 @@ void XAudio2AudioDriver::Initialize() { if (FAILED(hr)) { XELOGE("CreateSourceVoice failed with %.8X", hr); assert_always(); - return; + return false; } hr = pcm_voice_->Start(); if (FAILED(hr)) { XELOGE("Start failed with %.8X", hr); assert_always(); - return; + return false; } if (FLAGS_mute) { pcm_voice_->SetVolume(0.0f); } + + return true; } void XAudio2AudioDriver::SubmitFrame(uint32_t frame_ptr) { @@ -177,17 +179,27 @@ void XAudio2AudioDriver::SubmitFrame(uint32_t frame_ptr) { } void XAudio2AudioDriver::Shutdown() { - pcm_voice_->Stop(); - pcm_voice_->DestroyVoice(); - pcm_voice_ = NULL; + if (pcm_voice_) { + pcm_voice_->Stop(); + pcm_voice_->DestroyVoice(); + pcm_voice_ = NULL; + } - mastering_voice_->DestroyVoice(); - mastering_voice_ = NULL; + if (mastering_voice_) { + mastering_voice_->DestroyVoice(); + mastering_voice_ = NULL; + } - audio_->StopEngine(); - audio_->Release(); + if (audio_) { + audio_->StopEngine(); + audio_->Release(); + audio_ = nullptr; + } - delete voice_callback_; + if (voice_callback_) { + delete voice_callback_; + voice_callback_ = nullptr; + } } } // namespace xaudio2 diff --git a/src/xenia/apu/xaudio2/xaudio2_audio_driver.h b/src/xenia/apu/xaudio2/xaudio2_audio_driver.h index fe0a4c4dc..8640ef85d 100644 --- a/src/xenia/apu/xaudio2/xaudio2_audio_driver.h +++ b/src/xenia/apu/xaudio2/xaudio2_audio_driver.h @@ -26,7 +26,7 @@ class XAudio2AudioDriver : public AudioDriver { XAudio2AudioDriver(Memory* memory, xe::threading::Semaphore* semaphore); ~XAudio2AudioDriver() override; - void Initialize(); + bool Initialize(); void SubmitFrame(uint32_t frame_ptr) override; void Shutdown(); diff --git a/src/xenia/apu/xaudio2/xaudio2_audio_system.cc b/src/xenia/apu/xaudio2/xaudio2_audio_system.cc index 2515de343..37869a196 100644 --- a/src/xenia/apu/xaudio2/xaudio2_audio_system.cc +++ b/src/xenia/apu/xaudio2/xaudio2_audio_system.cc @@ -35,7 +35,11 @@ X_STATUS XAudio2AudioSystem::CreateDriver(size_t index, AudioDriver** out_driver) { assert_not_null(out_driver); auto driver = new XAudio2AudioDriver(memory_, semaphore); - driver->Initialize(); + if (!driver->Initialize()) { + driver->Shutdown(); + return X_STATUS_UNSUCCESSFUL; + } + *out_driver = driver; return X_STATUS_SUCCESS; }