summaryrefslogtreecommitdiff
path: root/opl/opl_sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'opl/opl_sdl.c')
-rw-r--r--opl/opl_sdl.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/opl/opl_sdl.c b/opl/opl_sdl.c
index 849a10b0..42fe3347 100644
--- a/opl/opl_sdl.c
+++ b/opl/opl_sdl.c
@@ -239,6 +239,29 @@ static void OPL_SDL_Shutdown(void)
}
}
+// Callback when a timer expires.
+
+static void TimerOver(void *data)
+{
+ int channel = (int) data;
+
+ OPLTimerOver(opl_emulator, channel);
+}
+
+// Callback invoked when the emulator code wants to set a timer.
+
+static void TimerHandler(int channel, double interval_seconds)
+{
+ unsigned int interval_samples;
+
+ interval_samples = (int) (interval_seconds * mixing_freq);
+
+ SDL_LockMutex(callback_queue_mutex);
+ OPL_Queue_Push(callback_queue, TimerOver, (void *) channel,
+ current_time + interval_samples);
+ SDL_UnlockMutex(callback_queue_mutex);
+}
+
static int OPL_SDL_Init(unsigned int port_base)
{
// Check if SDL_mixer has been opened already
@@ -308,6 +331,8 @@ static int OPL_SDL_Init(unsigned int port_base)
return 0;
}
+ OPLSetTimerHandler(opl_emulator, TimerHandler, 0);
+
callback_mutex = SDL_CreateMutex();
callback_queue_mutex = SDL_CreateMutex();