shithub: choc

Download patch

ref: 64c188aa8ea658f3ea623990a50f68af4e6e618d
parent: 2a026e12779b77b2aeabb78bdca3ea00e10d478a
author: Simon Howard <fraggle@gmail.com>
date: Sat May 19 12:42:56 EDT 2007

Fix tempo problems in pcsound linux driver.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 878

--- a/pcsound/pcsound_linux.c
+++ b/pcsound/pcsound_linux.c
@@ -47,7 +47,53 @@
 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)
 {
     int frequency;
@@ -69,7 +115,7 @@
 
         ioctl(console_handle, KIOCSOUND, cycles);
 
-        usleep(duration * 1000);
+        AdjustedSleep(duration);
     }
 
     return 0;