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; }