Removed spinning audio thread

This commit is contained in:
Antoine Pilote
2024-09-02 12:59:49 -04:00
parent 5077b1b7f8
commit c7a1c10ff0
3 changed files with 30 additions and 57 deletions

View File

@@ -51,6 +51,8 @@ namespace Nuake
{
JobSystem::Get().Update();
AudioManager::Get().AudioUpdate();
s_Time = static_cast<float>(glfwGetTime());
s_TimeStep = s_Time - s_LastFrameTime;
s_LastFrameTime = s_Time;

View File

@@ -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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> lock(m_AudioQueueMutex);
AudioRequest& audioRequest = m_AudioQueue.front();
Ref<SoLoud::AudioSource> 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<SoLoud::AudioSource> 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();
}
}

View File

@@ -39,10 +39,7 @@ namespace Nuake
Ref<SoLoud::Soloud> m_Soloud;
bool m_AudioThreadRunning;
std::thread m_AudioThread;
std::mutex m_AudioQueueMutex;
std::atomic<bool> m_AudioQueued = { false };
bool m_AudioQueued = false;
std::queue<AudioRequest> 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();
};