WIP refactoring into separate sound and stream contexts

This commit is contained in:
UnknownShadow200 2025-06-09 10:57:28 +10:00
parent c4a9dfb191
commit dbec9e8c76
15 changed files with 349 additions and 40 deletions

View File

@ -300,7 +300,7 @@ static cc_result Music_Buffer(struct AudioChunk* chunk, int maxSamples, struct V
}
chunk->size = samples * 2;
res2 = Audio_QueueChunk(&music_ctx, chunk);
res2 = StreamContext_Enqueue(&music_ctx, chunk);
if (res2) { music_stopping = true; return res2; }
return res;
}
@ -330,7 +330,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
channels = vorbis->channels;
sampleRate = vorbis->sampleRate;
if ((res = Audio_SetFormat(&music_ctx, channels, sampleRate, 100))) goto cleanup;
if ((res = StreamContext_SetFormat(&music_ctx, channels, sampleRate, 100))) goto cleanup;
/* largest possible vorbis frame decodes to blocksize1 * channels samples, */
/* so can end up decoding slightly over a second of audio */
@ -348,7 +348,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
}
if (music_stopping) goto cleanup;
res = Audio_Play(&music_ctx);
res = StreamContext_Play(&music_ctx);
if (res) goto cleanup;
cur = 0;
@ -357,11 +357,11 @@ static cc_result Music_PlayOgg(struct Stream* source) {
/* Don't play music while in the background on Android */
/* TODO: Not use such a terrible approach */
if (!Window_Main.Handle.ptr || Window_Main.Inactive) {
Audio_Pause(&music_ctx);
StreamContext_Pause(&music_ctx);
while ((!Window_Main.Handle.ptr || Window_Main.Inactive) && !music_stopping) {
Thread_Sleep(10); continue;
}
Audio_Play(&music_ctx);
StreamContext_Play(&music_ctx);
}
#endif
if (volume != Audio_MusicVolume) {
@ -369,7 +369,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
Audio_SetVolume(&music_ctx, volume);
}
res = Audio_Poll(&music_ctx, &inUse);
res = StreamContext_Update(&music_ctx, &inUse);
if (res) { music_stopping = true; break; }
if (inUse >= AUDIO_MAX_BUFFERS) {
@ -391,7 +391,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
} else {
/* Wait until the buffers finished playing */
for (;;) {
if (Audio_Poll(&music_ctx, &inUse) || inUse == 0) break;
if (StreamContext_Update(&music_ctx, &inUse) || inUse == 0) break;
Thread_Sleep(10);
}
}

View File

@ -64,22 +64,8 @@ void AudioBackend_LoadSounds(void);
cc_result Audio_Init(struct AudioContext* ctx, int buffers);
/* Stops any playing audio and then frees the audio context. */
void Audio_Close(struct AudioContext* ctx);
/* Sets the format of the audio data to be played. */
/* NOTE: Changing the format can be expensive, depending on the backend. */
cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
/* Sets the volume audio data is played at */
void Audio_SetVolume(struct AudioContext* ctx, int volume);
/* Queues the given audio chunk for playing. */
/* NOTE: You MUST ensure Audio_Poll indicates a buffer is free before calling this. */
/* NOTE: Some backends directly read from the chunk data - therefore you MUST NOT modify it */
cc_result Audio_QueueChunk(struct AudioContext* ctx, struct AudioChunk* chunk);
/* Begins playing audio. Audio_QueueChunk must have been used before this. */
cc_result Audio_Play(struct AudioContext* ctx);
/* Polls the audio context and then potentially unqueues buffer */
/* Returns the number of buffers being played or queued */
/* (e.g. if inUse is 0, no audio buffers are being played or queued) */
cc_result Audio_Poll(struct AudioContext* ctx, int* inUse);
cc_result Audio_Pause(struct AudioContext* ctx);
/* Outputs more detailed information about errors with audio. */
cc_bool Audio_DescribeError(cc_result res, cc_string* dst);
@ -95,6 +81,26 @@ cc_result AudioPool_Play(struct AudioData* data);
void AudioPool_Close(void);
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
/* Sets the format of the audio data to be played. */
/* NOTE: Changing the format can be expensive, depending on the backend. */
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
/* Queues the given audio chunk for playing. */
/* NOTE: You MUST ensure StreamContext_Update indicates a buffer is free before calling this. */
/* NOTE: Some backends directly read from the chunk data - therefore you MUST NOT modify it */
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk);
/* Begins playing audio. StreamContext_Enqueue must have been used before this. */
cc_result StreamContext_Play(struct AudioContext* ctx);
/* Temporarily pauses playing audio. Can be resumed again using StreamContext_Play. */
cc_result StreamContext_Pause(struct AudioContext* ctx);
/* Updates the audio context and then potentially unqueues buffer */
/* Returns the number of buffers in use (i.e. being played or queued to play) */
/* (e.g. if inUse is 0, no audio buffers are being played or queued) */
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse);
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/

View File

@ -128,6 +128,54 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -137,7 +185,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -135,6 +135,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -144,7 +168,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -142,6 +142,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -151,7 +175,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -40,6 +40,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/

View File

@ -173,6 +173,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -182,7 +206,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -257,6 +257,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -267,7 +291,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -224,6 +224,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/

View File

@ -174,6 +174,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -183,7 +207,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -358,6 +358,30 @@ cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -369,7 +393,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -59,6 +59,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -68,14 +92,7 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
}
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
if ((res = Audio_Play(ctx))) return res;
return 0;
return interop_AudioPlay(ctx->contextID, data->chunk.data, data->rate);
}
cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) {

View File

@ -56,6 +56,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -66,7 +90,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;

View File

@ -144,6 +144,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
}
/*########################################################################################################################*
*------------------------------------------------------Stream context-----------------------------------------------------*
*#########################################################################################################################*/
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
}
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
return Audio_QueueChunk(ctx, chunk);
}
cc_result StreamContext_Play(struct AudioContext* ctx) {
return Audio_Play(ctx);
}
cc_result StreamContext_Pause(struct AudioContext* ctx) {
return Audio_Pause(ctx);
}
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
return Audio_Poll(ctx, inUse);
}
/*########################################################################################################################*
*------------------------------------------------------Sound context------------------------------------------------------*
*#########################################################################################################################*/
@ -155,11 +179,9 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
cc_result res;
Audio_SetVolume(ctx, data->volume);
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
if ((res = Audio_Play(ctx))) return res;
return 0;
}

View File

@ -13,6 +13,12 @@ void Audio_Warn(cc_result res, const char* action) {
/* achieve higher speed by playing samples at higher sample rate */
#define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100)
static cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
static cc_result Audio_QueueChunk(struct AudioContext* ctx, struct AudioChunk* chunk);
static cc_result Audio_Play(struct AudioContext* ctx);
static cc_result Audio_Poll(struct AudioContext* ctx, int* inUse);
static cc_result Audio_Pause(struct AudioContext* ctx);
/*########################################################################################################################*
*---------------------------------------------------Common backend code---------------------------------------------------*
@ -128,8 +134,9 @@ cc_result AudioPool_Play(struct AudioData* data) {
if ((res = SoundContext_PollBusy(ctx, &isBusy))) return res;
if (isBusy) continue;
if (!SoundContext_FastPlay(ctx, data)) continue;
Audio_SetVolume(ctx, data->volume);
return SoundContext_PlayData(ctx, data);
}
@ -142,6 +149,7 @@ cc_result AudioPool_Play(struct AudioData* data) {
if (res) return res;
if (isBusy) continue;
Audio_SetVolume(ctx, data->volume);
return SoundContext_PlayData(ctx, data);
}
return 0;