From 5b2af6b3d55518b5e4f17c43d73830b290823265 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 4 May 2024 22:16:20 +0200 Subject: [PATCH] Refactor Audio Backend to not depend on `AudioListener` object --- Source/Engine/Audio/Audio.cpp | 6 +- Source/Engine/Audio/AudioBackend.h | 31 ++--- Source/Engine/Audio/AudioBackendTools.h | 7 ++ Source/Engine/Audio/AudioListener.cpp | 5 +- Source/Engine/Audio/None/AudioBackendNone.cpp | 10 +- Source/Engine/Audio/None/AudioBackendNone.h | 8 +- .../Engine/Audio/OpenAL/AudioBackendOAL.cpp | 27 ++--- Source/Engine/Audio/OpenAL/AudioBackendOAL.h | 8 +- .../Audio/XAudio2/AudioBackendXAudio2.cpp | 107 ++---------------- .../Audio/XAudio2/AudioBackendXAudio2.h | 8 +- 10 files changed, 53 insertions(+), 164 deletions(-) diff --git a/Source/Engine/Audio/Audio.cpp b/Source/Engine/Audio/Audio.cpp index 6db9baa87..25b6f39e4 100644 --- a/Source/Engine/Audio/Audio.cpp +++ b/Source/Engine/Audio/Audio.cpp @@ -2,6 +2,7 @@ #include "Audio.h" #include "AudioBackend.h" +#include "AudioListener.h" #include "AudioSettings.h" #include "FlaxEngine.Gen.h" #include "Engine/Scripting/ScriptingType.h" @@ -159,14 +160,15 @@ void Audio::OnAddListener(AudioListener* listener) } Listeners.Add(listener); - AudioBackend::Listener::OnAdd(listener); + AudioBackend::Listener::Reset(); + AudioBackend::Listener::TransformChanged(listener->GetPosition(), listener->GetOrientation()); } void Audio::OnRemoveListener(AudioListener* listener) { if (!Listeners.Remove(listener)) { - AudioBackend::Listener::OnRemove(listener); + AudioBackend::Listener::Reset(); } } diff --git a/Source/Engine/Audio/AudioBackend.h b/Source/Engine/Audio/AudioBackend.h index 7726bd627..e7424e1ad 100644 --- a/Source/Engine/Audio/AudioBackend.h +++ b/Source/Engine/Audio/AudioBackend.h @@ -15,7 +15,6 @@ class AudioBackend friend class AudioService; public: - enum class FeatureFlags { None = 0, @@ -26,12 +25,10 @@ public: static AudioBackend* Instance; private: - // Listener - virtual void Listener_OnAdd(AudioListener* listener) = 0; - virtual void Listener_OnRemove(AudioListener* listener) = 0; - virtual void Listener_VelocityChanged(AudioListener* listener) = 0; - virtual void Listener_TransformChanged(AudioListener* listener) = 0; + virtual void Listener_Reset() = 0; + virtual void Listener_VelocityChanged(const Vector3& velocity) = 0; + virtual void Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) = 0; virtual void Listener_ReinitializeAll() = 0; // Source @@ -73,35 +70,27 @@ private: virtual void Base_Dispose() = 0; public: - virtual ~AudioBackend() { } public: - class Listener { public: - - FORCE_INLINE static void OnAdd(AudioListener* listener) + FORCE_INLINE static void Reset() { - Instance->Listener_OnAdd(listener); + Instance->Listener_Reset(); } - FORCE_INLINE static void OnRemove(AudioListener* listener) + FORCE_INLINE static void VelocityChanged(const Vector3& velocity) { - Instance->Listener_OnRemove(listener); + Instance->Listener_VelocityChanged(velocity); } - FORCE_INLINE static void VelocityChanged(AudioListener* listener) + FORCE_INLINE static void TransformChanged(const Vector3& position, const Quaternion& orientation) { - Instance->Listener_VelocityChanged(listener); - } - - FORCE_INLINE static void TransformChanged(AudioListener* listener) - { - Instance->Listener_TransformChanged(listener); + Instance->Listener_TransformChanged(position, orientation); } FORCE_INLINE static void ReinitializeAll() @@ -113,7 +102,6 @@ public: class Source { public: - FORCE_INLINE static void OnAdd(AudioSource* source) { Instance->Source_OnAdd(source); @@ -223,7 +211,6 @@ public: class Buffer { public: - FORCE_INLINE static uint32 Create() { return Instance->Buffer_Create(); diff --git a/Source/Engine/Audio/AudioBackendTools.h b/Source/Engine/Audio/AudioBackendTools.h index 2630dca6f..8ef709144 100644 --- a/Source/Engine/Audio/AudioBackendTools.h +++ b/Source/Engine/Audio/AudioBackendTools.h @@ -21,6 +21,13 @@ public: Vector3 Velocity; Vector3 Position; Quaternion Orientation; + + void Reset() + { + Velocity = Vector3::Zero; + Position = Vector3::Zero; + Orientation = Quaternion::Identity; + } }; struct Source diff --git a/Source/Engine/Audio/AudioListener.cpp b/Source/Engine/Audio/AudioListener.cpp index 5202b62ec..ce5243869 100644 --- a/Source/Engine/Audio/AudioListener.cpp +++ b/Source/Engine/Audio/AudioListener.cpp @@ -9,6 +9,7 @@ AudioListener::AudioListener(const SpawnParams& params) : Actor(params) , _velocity(Vector3::Zero) + , _prevPos(Vector3::Zero) { } @@ -27,7 +28,7 @@ void AudioListener::Update() _prevPos = pos; if (_velocity != prevVelocity) { - AudioBackend::Listener::VelocityChanged(this); + AudioBackend::Listener::VelocityChanged(_velocity); } } @@ -68,6 +69,6 @@ void AudioListener::OnTransformChanged() if (IsActiveInHierarchy() && IsDuringPlay()) { - AudioBackend::Listener::TransformChanged(this); + AudioBackend::Listener::TransformChanged(GetPosition(), GetOrientation()); } } diff --git a/Source/Engine/Audio/None/AudioBackendNone.cpp b/Source/Engine/Audio/None/AudioBackendNone.cpp index 1b86872a8..a28fb91b2 100644 --- a/Source/Engine/Audio/None/AudioBackendNone.cpp +++ b/Source/Engine/Audio/None/AudioBackendNone.cpp @@ -6,19 +6,15 @@ #include "Engine/Audio/Audio.h" #include "Engine/Audio/AudioSource.h" -void AudioBackendNone::Listener_OnAdd(AudioListener* listener) +void AudioBackendNone::Listener_Reset() { } -void AudioBackendNone::Listener_OnRemove(AudioListener* listener) +void AudioBackendNone::Listener_VelocityChanged(const Vector3& velocity) { } -void AudioBackendNone::Listener_VelocityChanged(AudioListener* listener) -{ -} - -void AudioBackendNone::Listener_TransformChanged(AudioListener* listener) +void AudioBackendNone::Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) { } diff --git a/Source/Engine/Audio/None/AudioBackendNone.h b/Source/Engine/Audio/None/AudioBackendNone.h index 8206c5942..5a28331b6 100644 --- a/Source/Engine/Audio/None/AudioBackendNone.h +++ b/Source/Engine/Audio/None/AudioBackendNone.h @@ -12,12 +12,10 @@ class AudioBackendNone : public AudioBackend { public: - // [AudioBackend] - void Listener_OnAdd(AudioListener* listener) override; - void Listener_OnRemove(AudioListener* listener) override; - void Listener_VelocityChanged(AudioListener* listener) override; - void Listener_TransformChanged(AudioListener* listener) override; + void Listener_Reset() override; + void Listener_VelocityChanged(const Vector3& velocity) override; + void Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) override; void Listener_ReinitializeAll() override; void Source_OnAdd(AudioSource* source) override; void Source_OnRemove(AudioSource* source) override; diff --git a/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp b/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp index 86850e0c4..77d8f43c9 100644 --- a/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp +++ b/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp @@ -65,13 +65,11 @@ namespace ALC namespace Listener { - void Rebuild(AudioListener* listener) + void Rebuild(const AudioListener* listener) { - AudioBackend::Listener::TransformChanged(listener); - - const Float3 velocity = listener->GetVelocity(); - alListener3f(AL_VELOCITY, FLAX_VEL_TO_OAL(velocity)); - alListenerf(AL_GAIN, Audio::GetVolume()); + AudioBackend::Listener::Reset(); + AudioBackend::Listener::TransformChanged(listener->GetPosition(), listener->GetOrientation()); + AudioBackend::Listener::VelocityChanged(listener->GetVelocity()); } } @@ -244,35 +242,24 @@ const Char* GetOpenALErrorString(int error) return TEXT("???"); } -void AudioBackendOAL::Listener_OnAdd(AudioListener* listener) +void AudioBackendOAL::Listener_Reset() { - AudioBackend::Listener::TransformChanged(listener); alListenerf(AL_GAIN, Audio::GetVolume()); } -void AudioBackendOAL::Listener_OnRemove(AudioListener* listener) +void AudioBackendOAL::Listener_VelocityChanged(const Vector3& velocity) { -} - -void AudioBackendOAL::Listener_VelocityChanged(AudioListener* listener) -{ - const Float3 velocity = listener->GetVelocity(); alListener3f(AL_VELOCITY, FLAX_VEL_TO_OAL(velocity)); } -void AudioBackendOAL::Listener_TransformChanged(AudioListener* listener) +void AudioBackendOAL::Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) { - const Float3 position = listener->GetPosition(); - const Quaternion orientation = listener->GetOrientation(); const Float3 flipX(-1, 1, 1); const Float3 alOrientation[2] = { - // Forward orientation * Float3::Forward * flipX, - // Up orientation * Float3::Up * flipX }; - alListenerfv(AL_ORIENTATION, (float*)alOrientation); alListener3f(AL_POSITION, FLAX_POS_TO_OAL(position)); } diff --git a/Source/Engine/Audio/OpenAL/AudioBackendOAL.h b/Source/Engine/Audio/OpenAL/AudioBackendOAL.h index 23e8c08cf..3375251a4 100644 --- a/Source/Engine/Audio/OpenAL/AudioBackendOAL.h +++ b/Source/Engine/Audio/OpenAL/AudioBackendOAL.h @@ -12,12 +12,10 @@ class AudioBackendOAL : public AudioBackend { public: - // [AudioBackend] - void Listener_OnAdd(AudioListener* listener) override; - void Listener_OnRemove(AudioListener* listener) override; - void Listener_VelocityChanged(AudioListener* listener) override; - void Listener_TransformChanged(AudioListener* listener) override; + void Listener_Reset() override; + void Listener_VelocityChanged(const Vector3& velocity) override; + void Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) override; void Listener_ReinitializeAll() override; void Source_OnAdd(AudioSource* source) override; void Source_OnRemove(AudioSource* source) override; diff --git a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp index 37fab4f1d..4f24013e1 100644 --- a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp +++ b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp @@ -9,7 +9,6 @@ #include "Engine/Core/Log.h" #include "Engine/Audio/Audio.h" #include "Engine/Audio/AudioSource.h" -#include "Engine/Audio/AudioListener.h" #include "Engine/Threading/Threading.h" #if PLATFORM_WINDOWS @@ -42,33 +41,6 @@ namespace XAudio2 { struct Listener : AudioBackendTools::Listener { - AudioListener* AudioListener; - - Listener() - { - Init(); - } - - void Init() - { - AudioListener = nullptr; - } - - bool IsFree() const - { - return AudioListener == nullptr; - } - - void UpdateTransform() - { - Position = AudioListener->GetPosition(); - Orientation = AudioListener->GetOrientation(); - } - - void UpdateVelocity() - { - Velocity = AudioListener->GetVelocity(); - } }; class VoiceCallback : public IXAudio2VoiceCallback @@ -188,41 +160,17 @@ namespace XAudio2 int32 Channels; bool ForceDirty = true; AudioBackendTools::Settings Settings; - Listener Listeners[AUDIO_MAX_LISTENERS]; + Listener Listener; CriticalSection Locker; ChunkedArray Sources; ChunkedArray Buffers; // TODO: use ChunkedArray for better performance or use buffers pool? EngineCallback Callback; - Listener* GetListener() - { - for (int32 i = 0; i < AUDIO_MAX_LISTENERS; i++) - { - if (Listeners[i].AudioListener) - return &Listeners[i]; - } - - return nullptr; - } - - Listener* GetListener(const AudioListener* listener) - { - for (int32 i = 0; i < AUDIO_MAX_LISTENERS; i++) - { - if (Listeners[i].AudioListener == listener) - return &Listeners[i]; - } - - return nullptr; - } - Source* GetSource(const AudioSource* source) { if (source->SourceID == 0) return nullptr; - const uint32 sourceId = source->SourceID; - // 0 is invalid ID so shift them - return &Sources[sourceId - 1]; + return &Sources[source->SourceID - 1]; // 0 is invalid ID so shift them } void MarkAllDirty() @@ -266,56 +214,23 @@ namespace XAudio2 } } -void AudioBackendXAudio2::Listener_OnAdd(AudioListener* listener) +void AudioBackendXAudio2::Listener_Reset() { - // Get first free listener - XAudio2::Listener* aListener = nullptr; - for (int32 i = 0; i < AUDIO_MAX_LISTENERS; i++) - { - if (XAudio2::Listeners[i].IsFree()) - { - aListener = &XAudio2::Listeners[i]; - break; - } - } - ASSERT(aListener); - - // Setup - aListener->AudioListener = listener; - aListener->UpdateTransform(); - aListener->UpdateVelocity(); - + XAudio2::Listener->Reset(); XAudio2::MarkAllDirty(); } -void AudioBackendXAudio2::Listener_OnRemove(AudioListener* listener) +void AudioBackendXAudio2::Listener_VelocityChanged(const Vector3& velocity) { - XAudio2::Listener* aListener = XAudio2::GetListener(listener); - if (aListener) - { - aListener->Init(); - XAudio2::MarkAllDirty(); - } + XAudio2::Listener.Velocity = velocity; + XAudio2::MarkAllDirty(); } -void AudioBackendXAudio2::Listener_VelocityChanged(AudioListener* listener) +void AudioBackendXAudio2::Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) { - XAudio2::Listener* aListener = XAudio2::GetListener(listener); - if (aListener) - { - aListener->UpdateVelocity(); - XAudio2::MarkAllDirty(); - } -} - -void AudioBackendXAudio2::Listener_TransformChanged(AudioListener* listener) -{ - XAudio2::Listener* aListener = XAudio2::GetListener(listener); - if (aListener) - { - aListener->UpdateTransform(); - XAudio2::MarkAllDirty(); - } + XAudio2::Listener.Position = position; + XAudio2::Listener.Orientation = orientation; + XAudio2::MarkAllDirty(); } void AudioBackendXAudio2::Listener_ReinitializeAll() diff --git a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.h b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.h index 6d9961775..073dbfdc3 100644 --- a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.h +++ b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.h @@ -12,12 +12,10 @@ class AudioBackendXAudio2 : public AudioBackend { public: - // [AudioBackend] - void Listener_OnAdd(AudioListener* listener) override; - void Listener_OnRemove(AudioListener* listener) override; - void Listener_VelocityChanged(AudioListener* listener) override; - void Listener_TransformChanged(AudioListener* listener) override; + void Listener_Reset() override; + void Listener_VelocityChanged(const Vector3& velocity) override; + void Listener_TransformChanged(const Vector3& position, const Quaternion& orientation) override; void Listener_ReinitializeAll() override; void Source_OnAdd(AudioSource* source) override; void Source_OnRemove(AudioSource* source) override;