summaryrefslogtreecommitdiff
path: root/prge_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'prge_audio.c')
-rw-r--r--prge_audio.c75
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;
+}