diff options
-rw-r--r-- | opl/examples/droplay.c | 2 | ||||
-rw-r--r-- | opl/opl_sdl.c | 25 |
2 files changed, 25 insertions, 2 deletions
diff --git a/opl/examples/droplay.c b/opl/examples/droplay.c index 5158fbcd..b1656815 100644 --- a/opl/examples/droplay.c +++ b/opl/examples/droplay.c @@ -89,8 +89,6 @@ int DetectOPL(void) WriteReg(OPL_REG_TIMER_CTRL, 0x60); WriteReg(OPL_REG_TIMER_CTRL, 0x80); -// Temporary hack for SDL driver. -return 1; return val1 == 0 && val2 == 0xc0; } 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(); |