shithub: choc

Download patch

ref: ca065a06caac9ba5fab3eb8b1f49d529755506db
parent: e33a4961331301b1e3a5c65d148050fa33c4c594
author: Simon Howard <fraggle@gmail.com>
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();