From 0c6f3eb3dd9bf82e0edc002df9b9a879c15fd31d Mon Sep 17 00:00:00 2001 From: hiker <henrichsjoerg@gmail.com> Date: Fri, 27 Mar 2015 11:07:38 +1100 Subject: [PATCH 1/3] Tried to increase accuracy by measuing the sleeping time exactly. --- src/audio/sfx_manager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/audio/sfx_manager.cpp b/src/audio/sfx_manager.cpp index 7973e8254..e6975bbb8 100644 --- a/src/audio/sfx_manager.cpp +++ b/src/audio/sfx_manager.cpp @@ -364,7 +364,9 @@ void* SFXManager::mainLoop(void *obj) { // Wait some time to let other threads run, then queue an // update event to keep music playing. + double t = StkTime::getRealTime(); StkTime::sleep(1); + t = StkTime::getRealTime() - t; me->queue(SFX_UPDATE, (SFXBase*)NULL, 0.001f); } me->m_sfx_commands.lock(); From efcfdcced7bf585a9f39239acd342a478c80d4cd Mon Sep 17 00:00:00 2001 From: hiker <henrichsjoerg@gmail.com> Date: Fri, 27 Mar 2015 11:14:34 +1100 Subject: [PATCH 2/3] Oops - fixed typo in previous commit ... where I ignored the nicely computed 'accurate' values in the end :) --- src/audio/sfx_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio/sfx_manager.cpp b/src/audio/sfx_manager.cpp index e6975bbb8..b484d3eb1 100644 --- a/src/audio/sfx_manager.cpp +++ b/src/audio/sfx_manager.cpp @@ -367,7 +367,7 @@ void* SFXManager::mainLoop(void *obj) double t = StkTime::getRealTime(); StkTime::sleep(1); t = StkTime::getRealTime() - t; - me->queue(SFX_UPDATE, (SFXBase*)NULL, 0.001f); + me->queue(SFX_UPDATE, (SFXBase*)NULL, float(t)); } me->m_sfx_commands.lock(); From 26bd5a89a00a3fdd43d3460e508d45e1c62b0744 Mon Sep 17 00:00:00 2001 From: Marianne Gagnon <auria.mg@gmail.com> Date: Thu, 26 Mar 2015 20:49:36 -0400 Subject: [PATCH 3/3] Use accurate timing for sounds. Fixes #2049 --- src/audio/sfx_manager.cpp | 16 +++++++++++++--- src/audio/sfx_manager.hpp | 4 +++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/audio/sfx_manager.cpp b/src/audio/sfx_manager.cpp index b484d3eb1..d026b559f 100644 --- a/src/audio/sfx_manager.cpp +++ b/src/audio/sfx_manager.cpp @@ -74,6 +74,7 @@ SFXManager::SFXManager() // The sound manager initialises OpenAL m_initialized = music_manager->initialized(); m_master_gain = UserConfigParams::m_sfx_volume; + m_last_update_time = -1.0f; // Init position, since it can be used before positionListener is called. // No need to use lock here, since the thread will be created later. m_listener_position.getData() = Vec3(0, 0, 0); @@ -669,9 +670,9 @@ void SFXManager::deleteSFXMapping(const std::string &name) * adds an update command for the music manager. * \param dt Time step size. */ -void SFXManager::update(float dt) +void SFXManager::update() { - queue(SFX_UPDATE, (SFXBase*)NULL, dt); + queue(SFX_UPDATE, (SFXBase*)NULL); // Wake up the sfx thread to handle all queued up audio commands. pthread_cond_signal(&m_cond_request); } // update @@ -683,8 +684,17 @@ void SFXManager::update(float dt) */ void SFXManager::reallyUpdateNow(SFXCommand *current) { + if (m_last_update_time < 0.0) + { + // first time + m_last_update_time = StkTime::getRealTime(); + } + + double previous_update_time = m_last_update_time; + m_last_update_time = StkTime::getRealTime(); + double dt = m_last_update_time - previous_update_time; + assert(current->m_command==SFX_UPDATE); - float dt = current->m_parameter.getX(); if (music_manager->getCurrentMusic()) music_manager->getCurrentMusic()->update(dt); m_all_sfx.lock(); diff --git a/src/audio/sfx_manager.hpp b/src/audio/sfx_manager.hpp index 08e939179..a05b0df35 100644 --- a/src/audio/sfx_manager.hpp +++ b/src/audio/sfx_manager.hpp @@ -200,6 +200,8 @@ private: /** Thread id of the thread running in this object. */ Synchronised<pthread_t *> m_thread_id; + double m_last_update_time; + /** A conditional variable to wake up the main loop. */ pthread_cond_t m_cond_request; @@ -253,7 +255,7 @@ public: void reallyPauseAllNow(); void resumeAll(); void reallyResumeAllNow(); - void update(float dt); + void update(); void reallyUpdateNow(SFXCommand *current); bool soundExist(const std::string &name); void setMasterSFXVolume(float gain);