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);