diff options
author | Simon Howard | 2009-08-30 12:07:04 +0000 |
---|---|---|
committer | Simon Howard | 2009-08-30 12:07:04 +0000 |
commit | 076adeb0aa24e9bdc677435ddb6e444db58d5436 (patch) | |
tree | 7f6ddcb1a9f320dcefabc4cd2f6d9338b54f4ae5 /opl | |
parent | 4d13a1330013cfcf70c8bc13f6183ea404bbdbe4 (diff) | |
download | chocolate-doom-076adeb0aa24e9bdc677435ddb6e444db58d5436.tar.gz chocolate-doom-076adeb0aa24e9bdc677435ddb6e444db58d5436.tar.bz2 chocolate-doom-076adeb0aa24e9bdc677435ddb6e444db58d5436.zip |
Add method to clear all existing callbacks.
Subversion-branch: /branches/opl-branch
Subversion-revision: 1642
Diffstat (limited to 'opl')
-rw-r--r-- | opl/opl.c | 8 | ||||
-rw-r--r-- | opl/opl.h | 4 | ||||
-rw-r--r-- | opl/opl_internal.h | 2 | ||||
-rw-r--r-- | opl/opl_linux.c | 1 | ||||
-rw-r--r-- | opl/opl_queue.c | 5 | ||||
-rw-r--r-- | opl/opl_queue.h | 1 | ||||
-rw-r--r-- | opl/opl_sdl.c | 8 | ||||
-rw-r--r-- | opl/opl_timer.c | 7 | ||||
-rw-r--r-- | opl/opl_timer.h | 1 |
9 files changed, 37 insertions, 0 deletions
@@ -117,6 +117,14 @@ void OPL_SetCallback(unsigned int ms, opl_callback_t callback, void *data) } } +void OPL_ClearCallbacks(void) +{ + if (driver != NULL) + { + driver->clear_callbacks_func(); + } +} + void OPL_Lock(void) { if (driver != NULL) @@ -79,6 +79,10 @@ unsigned int OPL_ReadPort(opl_port_t port); void OPL_SetCallback(unsigned int ms, opl_callback_t callback, void *data); +// Clear all OPL callbacks that have been set. + +void OPL_ClearCallbacks(void); + // Begin critical section, during which, OPL callbacks will not be // invoked. diff --git a/opl/opl_internal.h b/opl/opl_internal.h index cd125122..384b96f8 100644 --- a/opl/opl_internal.h +++ b/opl/opl_internal.h @@ -36,6 +36,7 @@ typedef void (*opl_write_port_func)(opl_port_t port, unsigned int value); typedef void (*opl_set_callback_func)(unsigned int ms, opl_callback_t callback, void *data); +typedef void (*opl_clear_callbacks_func)(void); typedef void (*opl_lock_func)(void); typedef void (*opl_unlock_func)(void); @@ -48,6 +49,7 @@ typedef struct opl_read_port_func read_port_func; opl_write_port_func write_port_func; opl_set_callback_func set_callback_func; + opl_clear_callbacks_func clear_callbacks_func; opl_lock_func lock_func; opl_unlock_func unlock_func; } opl_driver_t; diff --git a/opl/opl_linux.c b/opl/opl_linux.c index 4a10337f..8a61dbf7 100644 --- a/opl/opl_linux.c +++ b/opl/opl_linux.c @@ -92,6 +92,7 @@ opl_driver_t opl_linux_driver = OPL_Linux_PortRead, OPL_Linux_PortWrite, OPL_Timer_SetCallback, + OPL_Timer_ClearCallbacks, OPL_Timer_Lock, OPL_Timer_Unlock }; diff --git a/opl/opl_queue.c b/opl/opl_queue.c index fe5f1ef8..f9d4c377 100644 --- a/opl/opl_queue.c +++ b/opl/opl_queue.c @@ -65,6 +65,11 @@ int OPL_Queue_IsEmpty(opl_callback_queue_t *queue) return queue->num_entries == 0; } +void OPL_Queue_Clear(opl_callback_queue_t *queue) +{ + queue->num_entries = 0; +} + void OPL_Queue_Push(opl_callback_queue_t *queue, opl_callback_t callback, void *data, unsigned int time) diff --git a/opl/opl_queue.h b/opl/opl_queue.h index 6ead0010..2447702b 100644 --- a/opl/opl_queue.h +++ b/opl/opl_queue.h @@ -32,6 +32,7 @@ typedef struct opl_callback_queue_s opl_callback_queue_t; opl_callback_queue_t *OPL_Queue_Create(void); int OPL_Queue_IsEmpty(opl_callback_queue_t *queue); +void OPL_Queue_Clear(opl_callback_queue_t *queue); void OPL_Queue_Destroy(opl_callback_queue_t *queue); void OPL_Queue_Push(opl_callback_queue_t *queue, opl_callback_t callback, void *data, diff --git a/opl/opl_sdl.c b/opl/opl_sdl.c index b9d83385..ffbe6820 100644 --- a/opl/opl_sdl.c +++ b/opl/opl_sdl.c @@ -374,6 +374,13 @@ static void OPL_SDL_SetCallback(unsigned int ms, SDL_UnlockMutex(callback_queue_mutex); } +static void OPL_SDL_ClearCallbacks(void) +{ + SDL_LockMutex(callback_queue_mutex); + OPL_Queue_Clear(callback_queue); + SDL_UnlockMutex(callback_queue_mutex); +} + static void OPL_SDL_Lock(void) { SDL_LockMutex(callback_mutex); @@ -392,6 +399,7 @@ opl_driver_t opl_sdl_driver = OPL_SDL_PortRead, OPL_SDL_PortWrite, OPL_SDL_SetCallback, + OPL_SDL_ClearCallbacks, OPL_SDL_Lock, OPL_SDL_Unlock }; diff --git a/opl/opl_timer.c b/opl/opl_timer.c index 62ffbd37..e254a5e2 100644 --- a/opl/opl_timer.c +++ b/opl/opl_timer.c @@ -202,6 +202,13 @@ void OPL_Timer_SetCallback(unsigned int ms, opl_callback_t callback, void *data) SDL_UnlockMutex(callback_queue_mutex); } +void OPL_Timer_ClearCallbacks(void) +{ + SDL_LockMutex(callback_queue_mutex); + OPL_Queue_Clear(callback_queue); + SDL_UnlockMutex(callback_queue_mutex); +} + void OPL_Timer_Lock(void) { SDL_LockMutex(timer_mutex); diff --git a/opl/opl_timer.h b/opl/opl_timer.h index 26255df5..e8657a90 100644 --- a/opl/opl_timer.h +++ b/opl/opl_timer.h @@ -33,6 +33,7 @@ void OPL_Timer_StopThread(void); void OPL_Timer_SetCallback(unsigned int ms, opl_callback_t callback, void *data); +void OPL_Timer_ClearCallbacks(void); void OPL_Timer_Lock(void); void OPL_Timer_Unlock(void); |