Fix tempo problems in pcsound linux driver.
Subversion-branch: /trunk/chocolate-doom Subversion-revision: 878
This commit is contained in:
parent
2a026e1277
commit
64c188aa8e
1 changed files with 47 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue