diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-07-03 21:40:42 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-07-03 21:40:42 +0100 |
commit | 4ef8cf8b3d9ad5235aa858a68f70a8aaf2b356da (patch) | |
tree | 5e84fc575df54a29097c9356ccc2e39988990dfd /src/sound.c | |
parent | a225a6cf64b4c011fea851acb7dd424a1e957655 (diff) | |
download | gold-mine-run-4ef8cf8b3d9ad5235aa858a68f70a8aaf2b356da.tar.gz gold-mine-run-4ef8cf8b3d9ad5235aa858a68f70a8aaf2b356da.zip |
Sound queue
This is to queue sounds and play them when we update the screen, so the
sounds are synced with the action.
It is required because the MikMod_Update function updates on the clock
int, and is not synced with the VGA's vsync.
Diffstat (limited to 'src/sound.c')
-rw-r--r-- | src/sound.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/sound.c b/src/sound.c index f57c133..4a608cf 100644 --- a/src/sound.c +++ b/src/sound.c @@ -29,6 +29,11 @@ static uint32_t voice = 0; static MODULE *music = NULL; +#define MAX_QUEUE 4 + +static uint8_t queue[MAX_QUEUE]; +static uint8_t queue_top; + uint8_t sound_init() { MikMod_RegisterAllDrivers(); @@ -61,6 +66,8 @@ uint8_t sound_init() Player_Start(music); MikMod_EnableOutput(); + queue_top = 0; + return 1; } @@ -73,7 +80,9 @@ void sound_update() if (++divider == 10) { divider = 0; + MikMod_Lock(); MikMod_Update(); + MikMod_Unlock(); } } @@ -114,3 +123,21 @@ void sound_play_efx(uint8_t efxno) cur = efxno; voice = Sample_Play(efx[cur].s, 0, 0); } + +void sound_queue_efx(uint8_t efxno) +{ + if (queue_top >= MAX_QUEUE) + return; + + queue[queue_top++] = efxno; +} + +void sound_play_queue() +{ + while (queue_top > 0) + sound_play_efx(queue[--queue_top]); + + MikMod_Lock(); + MikMod_Update(); + MikMod_Unlock(); +} |