mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-15 20:08:54 +03:00
Removed spinning audio thread
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user