From 41a81e52790c7f5a20eb827c2de0c63cc52c09f5 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Mon, 2 Oct 2023 01:36:49 -0400 Subject: [PATCH] Added audio streaming --- Nuake/src/Audio/AudioManager.cpp | 45 ++++++++++++++++++++------------ Nuake/src/Audio/AudioManager.h | 2 +- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/Nuake/src/Audio/AudioManager.cpp b/Nuake/src/Audio/AudioManager.cpp index 6e24c3e3..7a48aae1 100644 --- a/Nuake/src/Audio/AudioManager.cpp +++ b/Nuake/src/Audio/AudioManager.cpp @@ -6,6 +6,7 @@ #include "soloud_speech.h" #include "soloud_thread.h" #include +#include namespace Nuake { @@ -88,30 +89,30 @@ namespace Nuake { // Acquire mutex lock const std::lock_guard lock(m_AudioQueueMutex); + auto& audioClip = m_ActiveClips[request.audioFile]; if (IsVoiceActive(request.audioFile)) { - if (!m_Soloud->isValidVoiceHandle(m_ActiveClips[request.audioFile])) + if (!m_Soloud->isValidVoiceHandle(audioClip)) { m_ActiveClips.erase(request.audioFile); return; } } - SoLoud::handle& voice = m_ActiveClips[request.audioFile]; - if (request.spatialized) { - m_Soloud->set3dSourcePosition(voice, request.position.x, request.position.y, request.position.z); - m_Soloud->set3dSourceMinMaxDistance(voice, request.MinDistance, request.MaxDistance); - m_Soloud->set3dSourceAttenuation(voice, 1, request.AttenuationFactor); + m_Soloud->set3dSourcePosition(audioClip, request.position.x, request.position.y, request.position.z); + m_Soloud->set3dSourceMinMaxDistance(audioClip, request.MinDistance, request.MaxDistance); + m_Soloud->set3dSourceAttenuation(audioClip, 1, request.AttenuationFactor); m_Soloud->update3dAudio(); } else { - m_Soloud->setPan(voice, request.pan); + m_Soloud->setPan(audioClip, request.pan); } - m_Soloud->setLooping(voice, request.Loop); - m_Soloud->setRelativePlaySpeed(voice, request.speed); + + m_Soloud->setLooping(audioClip, request.Loop); + m_Soloud->setRelativePlaySpeed(audioClip, request.speed); } void AudioManager::StopVoice(const std::string& filePath) @@ -120,8 +121,7 @@ namespace Nuake { if (!IsVoiceActive(filePath)) { - // We can't stop a voice that isn't active. - return; + return; // We can't stop a voice that isn't active. } SoLoud::handle& voice = m_ActiveClips[filePath]; @@ -145,8 +145,20 @@ namespace Nuake { void AudioManager::LoadWavAudio(const std::string& filePath) { - m_WavSamples[filePath] = SoLoud::Wav(); - m_WavSamples[filePath].load(filePath.c_str()); + const bool STREAMING = true; + if (STREAMING) + { + Ref wavStream = CreateRef(); + wavStream->load(filePath.c_str()); + m_WavSamples[filePath] = wavStream; + } + else + { + auto wav = CreateRef(); + wav->load(filePath.c_str()); + m_WavSamples[filePath] = wav; + } + } void AudioManager::AudioThreadLoop() @@ -160,19 +172,19 @@ namespace Nuake { while (!m_AudioQueue.empty()) { AudioRequest& audioRequest = m_AudioQueue.front(); - SoLoud::Wav& audio = m_WavSamples[audioRequest.audioFile]; + Ref audio = m_WavSamples[audioRequest.audioFile]; SoLoud::handle soloudHandle; if (!audioRequest.spatialized) { - soloudHandle = m_Soloud->play(audio); + 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); + 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); } @@ -182,7 +194,6 @@ namespace Nuake { m_ActiveClips[audioRequest.audioFile] = soloudHandle; - // Remove item from queue. m_AudioQueue.pop(); } } diff --git a/Nuake/src/Audio/AudioManager.h b/Nuake/src/Audio/AudioManager.h index 00197178..283f16f8 100644 --- a/Nuake/src/Audio/AudioManager.h +++ b/Nuake/src/Audio/AudioManager.h @@ -49,7 +49,7 @@ namespace Nuake Vector3 m_ListenerDirection; Vector3 m_ListenerUp; - std::unordered_map m_WavSamples; + std::unordered_map> m_WavSamples; std::unordered_map m_ActiveClips; public: