From 83758de2843a80612e345412f16567db59bc5fc0 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 28 Jun 2022 00:16:40 +0100 Subject: [PATCH 1/2] Prevent ride music popping in loudly --- src/openrct2/ride/RideAudio.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2/ride/RideAudio.cpp b/src/openrct2/ride/RideAudio.cpp index 645606dd6c..842420da97 100644 --- a/src/openrct2/ride/RideAudio.cpp +++ b/src/openrct2/ride/RideAudio.cpp @@ -202,7 +202,7 @@ namespace OpenRCT2::RideAudio auto source = audioObj->GetSample(0); if (source != nullptr) { - auto channel = CreateAudioChannel(source, MixerGroup::Sound, false); + auto channel = CreateAudioChannel(source, MixerGroup::Sound, false, 0); if (channel != nullptr) { _musicChannels.emplace_back(instance, channel, nullptr); @@ -226,7 +226,7 @@ namespace OpenRCT2::RideAudio if (source != nullptr) { auto shouldLoop = musicObj->GetTrackCount() == 1; - auto channel = CreateAudioChannel(source, MixerGroup::RideMusic, shouldLoop); + auto channel = CreateAudioChannel(source, MixerGroup::RideMusic, shouldLoop, 0); if (channel != nullptr) { _musicChannels.emplace_back(instance, channel, source); From 00014adec9174a4f0e2687667f633a65139fb3b6 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 28 Jun 2022 00:17:57 +0100 Subject: [PATCH 2/2] Fix #17462: Crash when zooming or moving around park Lock the mixer while disposing an audio source. --- src/openrct2-ui/audio/SDLAudioSource.cpp | 25 ++++++++++++++++++++++++ src/openrct2-ui/audio/SDLAudioSource.h | 5 +++++ 2 files changed, 30 insertions(+) diff --git a/src/openrct2-ui/audio/SDLAudioSource.cpp b/src/openrct2-ui/audio/SDLAudioSource.cpp index 6be5672dce..babbd60f59 100644 --- a/src/openrct2-ui/audio/SDLAudioSource.cpp +++ b/src/openrct2-ui/audio/SDLAudioSource.cpp @@ -9,6 +9,8 @@ #include "SDLAudioSource.h" +#include +#include #include using namespace OpenRCT2::Audio; @@ -30,11 +32,34 @@ void SDLAudioSource::Release() { if (!_released) { + // Lock the mixer to make sure we aren't mixing + // the source as we dispose it + auto mixer = GetMixer(); + if (mixer != nullptr) + mixer->Lock(); + Unload(); + + if (mixer != nullptr) + mixer->Unlock(); + _released = true; } } +IAudioMixer* SDLAudioSource::GetMixer() +{ + auto ctx = GetContext(); + if (ctx == nullptr) + return nullptr; + + auto audioContext = ctx->GetAudioContext(); + if (audioContext == nullptr) + return nullptr; + + return audioContext->GetMixer(); +} + int32_t SDLAudioSource::GetBytesPerSecond() const { auto format = GetFormat(); diff --git a/src/openrct2-ui/audio/SDLAudioSource.h b/src/openrct2-ui/audio/SDLAudioSource.h index e9db2c07f8..fc51d8811d 100644 --- a/src/openrct2-ui/audio/SDLAudioSource.h +++ b/src/openrct2-ui/audio/SDLAudioSource.h @@ -18,6 +18,8 @@ namespace OpenRCT2::Audio { + struct IAudioMixer; + #ifdef __WARN_SUGGEST_FINAL_METHODS__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wsuggest-final-methods" @@ -38,6 +40,9 @@ namespace OpenRCT2::Audio protected: virtual void Unload() = 0; + + private: + IAudioMixer* GetMixer(); }; #ifdef __WARN_SUGGEST_FINAL_METHODS__ # pragma GCC diagnostic pop