foxygit / doom Log in
commit 64c188aa8ea658f3ea623990a50f68af4e6e618d
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Sat May 19 16:42:56 2007 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Sat May 19 16:42:56 2007 +0000

    Fix tempo problems in pcsound linux driver.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 878
---
 pcsound/pcsound_linux.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/pcsound/pcsound_linux.c b/pcsound/pcsound_linux.c
index df2015d5..7c1abc7b 100644
--- a/pcsound/pcsound_linux.c
+++ b/pcsound/pcsound_linux.c
@@ -47,6 +47,52 @@ static int console_handle;
 static pcsound_callback_func callback;
 static int sound_thread_running = 0;
 static SDL_Thread *sound_thread_handle;
+static int sleep_adjust = 0;
+
+static void AdjustedSleep(unsigned int ms)
+{
+    unsigned int start_time;
+    unsigned int end_time;
+    unsigned int actual_time;
+
+    // Adjust based on previous error to keep the tempo right
+
+    if (sleep_adjust > ms)
+    {
+        sleep_adjust -= ms;
+        return;
+    }
+    else
+    {
+        ms -= sleep_adjust;
+    }
+
+    // Do the sleep and record how long it takes
+
+    start_time = SDL_GetTicks();
+
+    SDL_Delay(ms);
+
+    end_time = SDL_GetTicks();
+
+    if (end_time > start_time)
+    {
+        actual_time = end_time - start_time;
+    }
+    else
+    {
+        actual_time = ms;
+    }
+
+    if (actual_time < ms)
+    {
+        actual_time = ms;
+    }
+
+    // Save sleep_adjust for next time
+
+    sleep_adjust = actual_time - ms;
+}

 static int SoundThread(void *unused)
 {
@@ -69,7 +115,7 @@ static int SoundThread(void *unused)

         ioctl(console_handle, KIOCSOUND, cycles);

-        usleep(duration * 1000);
+        AdjustedSleep(duration);
     }

     return 0;