diff options
Diffstat (limited to 'prge_audio.c')
-rw-r--r-- | prge_audio.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/prge_audio.c b/prge_audio.c new file mode 100644 index 0000000..08fb67c --- /dev/null +++ b/prge_audio.c @@ -0,0 +1,75 @@ +S32 find_sound(PRGEContext *ctx, const char *name) +{ + S32 i; + Sound *snd; + + for (i = 0; i < PRGE_MAX_SOUNDS_LOADED; i++) { + snd = ctx->snds+i; + if (snd->name && (strcmp(snd->name, name) == 0)) + return i; + } + + return -1; +} + +S32 load_sound(PRGEContext *ctx, Sound newsnd) +{ + S32 i; + Sound *snd; + + for (i = 0; i < PRGE_MAX_SOUNDS_LOADED; i++) { + snd = ctx->snds+i; + if (!snd->data) + break; + } + + if (i == PRGE_MAX_SOUNDS_LOADED) { + sys_printf("[WARNING] : PRGE : Max sounds loaded\n"); + pop_arena(ctx->pa, newsnd.size); + return -1; + } + + *snd = newsnd; + + return i; +} + +B32 enqueue_sound(PRGEContext *ctx, Sound *snd) +{ + SoundQueueNode *node; + SoundQueue *sndq; + S32 i; + + ASSERT(snd); + + sndq = &ctx->sndq; + + if (sndq->cnt == PRGE_MAX_SOUNDS_PLAYING) + return 0; + + for (i = 0; i < PRGE_MAX_SOUNDS_PLAYING; i++) { + node = ctx->nodes+i; + if (!node->snd) + break; + } + + node->snd = snd; + + DLLPUSHFRONT(sndq->first, sndq->last, node); + + sndq->cnt++; + + return 1; +} + +Sound *dequeue_sound(SoundQueue *sndq) +{ + Sound *snd; + if (sndq->cnt == 0) + return 0; + snd = sndq->first->snd; + sndq->first->snd = 0; + DLLREMOVE(sndq->first, sndq->last, sndq->first); + sndq->cnt--; + return snd; +} |