From bb102cc1ec2fef528df17dd527ab5eb3b33f3d00 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 18 May 2022 01:08:51 +0100 Subject: [PATCH] Remove null audio source and fix crash on exit --- src/openrct2-ui/audio/AudioChannel.cpp | 3 +- src/openrct2-ui/audio/AudioContext.h | 1 - src/openrct2-ui/audio/AudioMixer.cpp | 10 ++----- src/openrct2-ui/audio/AudioMixer.h | 2 -- src/openrct2/audio/AudioSource.h | 6 +--- src/openrct2/audio/NullAudioSource.cpp | 40 -------------------------- src/openrct2/libopenrct2.vcxproj | 1 - 7 files changed, 5 insertions(+), 58 deletions(-) delete mode 100644 src/openrct2/audio/NullAudioSource.cpp diff --git a/src/openrct2-ui/audio/AudioChannel.cpp b/src/openrct2-ui/audio/AudioChannel.cpp index 920e36c234..51ea9d477b 100644 --- a/src/openrct2-ui/audio/AudioChannel.cpp +++ b/src/openrct2-ui/audio/AudioChannel.cpp @@ -232,8 +232,7 @@ namespace OpenRCT2::Audio [[nodiscard]] AudioFormat GetFormat() const override { AudioFormat result = {}; - // The second check is there because NullAudioSource does not implement GetFormat. Avoid calling it. - if (_source != nullptr && _source->GetLength() > 0) + if (_source != nullptr) { result = _source->GetFormat(); } diff --git a/src/openrct2-ui/audio/AudioContext.h b/src/openrct2-ui/audio/AudioContext.h index d2e4ef32e1..a353ec6297 100644 --- a/src/openrct2-ui/audio/AudioContext.h +++ b/src/openrct2-ui/audio/AudioContext.h @@ -50,7 +50,6 @@ namespace OpenRCT2::Audio struct ISDLAudioSource : public IAudioSource { - [[nodiscard]] virtual bool IsReleased() const abstract; [[nodiscard]] virtual AudioFormat GetFormat() const abstract; }; diff --git a/src/openrct2-ui/audio/AudioMixer.cpp b/src/openrct2-ui/audio/AudioMixer.cpp index 41d14563f6..0bf27de966 100644 --- a/src/openrct2-ui/audio/AudioMixer.cpp +++ b/src/openrct2-ui/audio/AudioMixer.cpp @@ -17,15 +17,9 @@ using namespace OpenRCT2::Audio; -AudioMixer::AudioMixer() -{ - _nullSource = AudioSource::CreateNull(); -} - AudioMixer::~AudioMixer() { Close(); - delete _nullSource; } void AudioMixer::Init(const char* device) @@ -153,7 +147,9 @@ void AudioMixer::GetNextAudioChunk(uint8_t* dst, size_t length) while (it != _channels.end()) { auto channel = *it; - if ((channel->IsDone() && channel->DeleteOnDone()) || channel->IsStopping()) + auto channelSource = channel->GetSource(); + auto channelSourceReleased = channelSource == nullptr || channelSource->IsReleased(); + if (channelSourceReleased || (channel->IsDone() && channel->DeleteOnDone()) || channel->IsStopping()) { delete channel; it = _channels.erase(it); diff --git a/src/openrct2-ui/audio/AudioMixer.h b/src/openrct2-ui/audio/AudioMixer.h index d8499b3089..4d011d7c8e 100644 --- a/src/openrct2-ui/audio/AudioMixer.h +++ b/src/openrct2-ui/audio/AudioMixer.h @@ -29,7 +29,6 @@ namespace OpenRCT2::Audio { private: std::vector> _sources; - IAudioSource* _nullSource = nullptr; SDL_AudioDeviceID _deviceId = 0; AudioFormat _format = {}; @@ -47,7 +46,6 @@ namespace OpenRCT2::Audio std::mutex _mutex; public: - AudioMixer(); ~AudioMixer() override; void Init(const char* device) override; void Close() override; diff --git a/src/openrct2/audio/AudioSource.h b/src/openrct2/audio/AudioSource.h index 414690a09c..73894f5028 100644 --- a/src/openrct2/audio/AudioSource.h +++ b/src/openrct2/audio/AudioSource.h @@ -22,12 +22,8 @@ namespace OpenRCT2::Audio virtual ~IAudioSource() = default; virtual void Release() abstract; + virtual bool IsReleased() const abstract; virtual uint64_t GetLength() const abstract; virtual size_t Read(void* dst, uint64_t offset, size_t len) abstract; }; - - namespace AudioSource - { - IAudioSource* CreateNull(); - } } // namespace OpenRCT2::Audio diff --git a/src/openrct2/audio/NullAudioSource.cpp b/src/openrct2/audio/NullAudioSource.cpp deleted file mode 100644 index 6090680df9..0000000000 --- a/src/openrct2/audio/NullAudioSource.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2020 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#include "AudioSource.h" -#include "audio.h" - -namespace OpenRCT2::Audio -{ - /** - * An audio source representing silence. - */ - class NullAudioSource : public IAudioSource - { - public: - void Release() override - { - } - - uint64_t GetLength() const override - { - return 0; - } - - size_t Read([[maybe_unused]] void* dst, [[maybe_unused]] uint64_t offset, [[maybe_unused]] size_t len) override - { - return 0; - } - }; - - IAudioSource* AudioSource::CreateNull() - { - return new NullAudioSource(); - } -} // namespace OpenRCT2::Audio diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 355d35f6e8..fdc0872262 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -625,7 +625,6 @@ -