From c7a1c10ff001077ce1f56b1f8213f27193fd9bc2 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Mon, 2 Sep 2024 12:59:49 -0400 Subject: [PATCH] Removed spinning audio thread --- Nuake/Engine.cpp | 2 + Nuake/src/Audio/AudioManager.cpp | 77 +++++++++++--------------------- Nuake/src/Audio/AudioManager.h | 8 ++-- 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/Nuake/Engine.cpp b/Nuake/Engine.cpp index 5446bf1f..2667e6d4 100644 --- a/Nuake/Engine.cpp +++ b/Nuake/Engine.cpp @@ -51,6 +51,8 @@ namespace Nuake { JobSystem::Get().Update(); + AudioManager::Get().AudioUpdate(); + s_Time = static_cast(glfwGetTime()); s_TimeStep = s_Time - s_LastFrameTime; s_LastFrameTime = s_Time; diff --git a/Nuake/src/Audio/AudioManager.cpp b/Nuake/src/Audio/AudioManager.cpp index 914ca01c..cda8b190 100644 --- a/Nuake/src/Audio/AudioManager.cpp +++ b/Nuake/src/Audio/AudioManager.cpp @@ -11,8 +11,7 @@ namespace Nuake { - AudioManager::AudioManager() : - m_AudioThreadRunning(true) + AudioManager::AudioManager() { } @@ -20,9 +19,6 @@ namespace Nuake { { Deinitialize(); - m_AudioThreadRunning = false; - m_AudioThread.join(); - m_Soloud->deinit(); } @@ -37,15 +33,6 @@ namespace Nuake { m_Soloud->init(SoLoud::Soloud::CLIP_ROUNDOFF, SoLoud::Soloud::ALSA); #endif - if (m_AudioThread.joinable()) - { - m_AudioThreadRunning = false; - m_AudioThread.join(); - } - - m_AudioThreadRunning = true; - m_AudioThread = std::thread(&AudioManager::AudioThreadLoop, this); - Logger::Log("Audio manager initialized", "audio", VERBOSE); } @@ -79,9 +66,6 @@ namespace Nuake { void AudioManager::QueueWavAudio(const AudioRequest& request) { - // Acquire mutex lock and push to queue - const std::lock_guard lock(m_AudioQueueMutex); - // Check if file exists and load const bool fileExists = FileSystem::FileExists(request.audioFile, true); if (fileExists && !IsWavLoaded(request.audioFile)) @@ -94,9 +78,6 @@ namespace Nuake { void AudioManager::UpdateVoice(const AudioRequest& request) { - // Acquire mutex lock - const std::lock_guard lock(m_AudioQueueMutex); - auto& audioClip = m_ActiveClips[request.audioFile]; if (IsVoiceActive(request.audioFile)) { @@ -125,8 +106,6 @@ namespace Nuake { void AudioManager::StopVoice(const std::string& filePath) { - const std::lock_guard lock(m_AudioQueueMutex); - if (!IsVoiceActive(filePath)) { return; // We can't stop a voice that isn't active. @@ -169,41 +148,35 @@ namespace Nuake { } - void AudioManager::AudioThreadLoop() + void AudioManager::AudioUpdate() { - while(m_AudioThreadRunning) + // Check if we have audio queued + while (!m_AudioQueue.empty()) { - // Acquire mutex lock - const std::lock_guard lock(m_AudioQueueMutex); + AudioRequest& audioRequest = m_AudioQueue.front(); + Ref audio = m_WavSamples[audioRequest.audioFile]; - // Check if we have audio queued - while (!m_AudioQueue.empty()) + SoLoud::handle soloudHandle; + if (!audioRequest.spatialized) { - AudioRequest& audioRequest = m_AudioQueue.front(); - Ref audio = m_WavSamples[audioRequest.audioFile]; - - SoLoud::handle soloudHandle; - if (!audioRequest.spatialized) - { - soloudHandle = m_Soloud->play(*audio); - m_Soloud->setVolume(soloudHandle, audioRequest.volume); - m_Soloud->setPan(soloudHandle, audioRequest.pan); - } - else - { - const Vector3& position = audioRequest.position; - soloudHandle = m_Soloud->play3d(*audio, position.x, position.y, position.z); - m_Soloud->set3dSourceMinMaxDistance(soloudHandle, audioRequest.MinDistance, audioRequest.MaxDistance); - m_Soloud->set3dSourceAttenuation(soloudHandle, SoLoud::AudioSource::ATTENUATION_MODELS::EXPONENTIAL_DISTANCE, audioRequest.AttenuationFactor); - } - - m_Soloud->setRelativePlaySpeed(soloudHandle, audioRequest.speed); - m_Soloud->setLooping(soloudHandle, audioRequest.Loop); - - m_ActiveClips[audioRequest.audioFile] = soloudHandle; - - m_AudioQueue.pop(); + soloudHandle = m_Soloud->play(*audio); + m_Soloud->setVolume(soloudHandle, audioRequest.volume); + m_Soloud->setPan(soloudHandle, audioRequest.pan); } + else + { + const Vector3& position = audioRequest.position; + soloudHandle = m_Soloud->play3d(*audio, position.x, position.y, position.z); + m_Soloud->set3dSourceMinMaxDistance(soloudHandle, audioRequest.MinDistance, audioRequest.MaxDistance); + m_Soloud->set3dSourceAttenuation(soloudHandle, SoLoud::AudioSource::ATTENUATION_MODELS::EXPONENTIAL_DISTANCE, audioRequest.AttenuationFactor); + } + + m_Soloud->setRelativePlaySpeed(soloudHandle, audioRequest.speed); + m_Soloud->setLooping(soloudHandle, audioRequest.Loop); + + m_ActiveClips[audioRequest.audioFile] = soloudHandle; + + m_AudioQueue.pop(); } } diff --git a/Nuake/src/Audio/AudioManager.h b/Nuake/src/Audio/AudioManager.h index 7ea1fc5a..706d7683 100644 --- a/Nuake/src/Audio/AudioManager.h +++ b/Nuake/src/Audio/AudioManager.h @@ -39,10 +39,7 @@ namespace Nuake Ref m_Soloud; - bool m_AudioThreadRunning; - std::thread m_AudioThread; - std::mutex m_AudioQueueMutex; - std::atomic m_AudioQueued = { false }; + bool m_AudioQueued = false; std::queue m_AudioQueue; Vector3 m_ListenerPosition; @@ -87,8 +84,9 @@ namespace Nuake bool IsVoiceActive(const std::string & voice) const; void LoadWavAudio(const std::string& filePath); + void AudioUpdate(); + private: - void AudioThreadLoop(); void CleanupInactiveVoices(); };