ref: ca065a06caac9ba5fab3eb8b1f49d529755506db
parent: e33a4961331301b1e3a5c65d148050fa33c4c594
author: Simon Howard <[email protected]>
date: Sat Aug 29 16:08:21 EDT 2009
Set timer callback for OPL emulator so that the adlib detection routine works. Subversion-branch: /branches/opl-branch Subversion-revision: 1633
--- a/opl/examples/droplay.c
+++ b/opl/examples/droplay.c
@@ -89,8 +89,6 @@
WriteReg(OPL_REG_TIMER_CTRL, 0x60);
WriteReg(OPL_REG_TIMER_CTRL, 0x80);
-// Temporary hack for SDL driver.
-return 1;
return val1 == 0 && val2 == 0xc0;
}
--- a/opl/opl_sdl.c
+++ b/opl/opl_sdl.c
@@ -239,6 +239,29 @@
}
}
+// 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
@@ -307,6 +330,8 @@
OPL_SDL_Shutdown();
return 0;
}
+
+ OPLSetTimerHandler(opl_emulator, TimerHandler, 0);
callback_mutex = SDL_CreateMutex();
callback_queue_mutex = SDL_CreateMutex();