From 42e124a90cc51da1f8b41995539141ea0b6c9e29 Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 28 May 2020 23:05:32 -0400 Subject: [PATCH] Fix crash if audio init fails (especially if there are no output devices) --- GpApp/Music.cpp | 8 +++++++- PortabilityLayer/PLSound.cpp | 12 ++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/GpApp/Music.cpp b/GpApp/Music.cpp index 9365a74..67eaaec 100644 --- a/GpApp/Music.cpp +++ b/GpApp/Music.cpp @@ -134,7 +134,7 @@ void ToggleMusicWhilePlaying (void) void SetMusicalMode (short newMode) { - if (dontLoadMusic) + if (dontLoadMusic || failedMusic) return; musicMutex->Lock(); @@ -302,6 +302,12 @@ void InitMusic (void) return; } theErr = OpenMusicChannel(); + if (theErr != PLErrors::kNone) + { + YellowAlert(kYellowNoMusic, theErr); + failedMusic = true; + return; + } musicScore[0] = 0; musicScore[1] = 1; diff --git a/PortabilityLayer/PLSound.cpp b/PortabilityLayer/PLSound.cpp index 492cab8..699a4af 100644 --- a/PortabilityLayer/PLSound.cpp +++ b/PortabilityLayer/PLSound.cpp @@ -353,12 +353,15 @@ namespace PortabilityLayer AudioChannel *SoundSystemImpl::CreateChannel() { + IGpAudioDriver *audioDriver = PortabilityLayer::HostAudioDriver::GetInstance(); + if (!audioDriver) + return nullptr; + PortabilityLayer::MemoryManager *mm = PortabilityLayer::MemoryManager::GetInstance(); void *storage = mm->Alloc(sizeof(PortabilityLayer::AudioChannelImpl)); if (!storage) return nullptr; - IGpAudioDriver *audioDriver = PortabilityLayer::HostAudioDriver::GetInstance(); IGpAudioChannel *audioChannel = audioDriver->CreateChannel(); if (!audioChannel) { @@ -388,7 +391,12 @@ namespace PortabilityLayer void SoundSystemImpl::SetVolume(uint8_t vol) { - PortabilityLayer::HostAudioDriver::GetInstance()->SetMasterVolume(vol, 255); + IGpAudioDriver *audioDriver = PortabilityLayer::HostAudioDriver::GetInstance(); + + if (!audioDriver) + return; + + audioDriver->SetMasterVolume(vol, 255); m_volume = vol; }