From c4a9dfb1916336a3039c52fa983b8eef427c6a23 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 8 Jun 2025 12:59:00 +1000 Subject: [PATCH] WIP refactoring audio, part 2 --- src/Audio.h | 5 ++++- src/Audio_3DS.c | 20 ++++++++++++++++++++ src/Audio_Dreamcast.c | 20 ++++++++++++++++++++ src/Audio_GCWii.c | 20 ++++++++++++++++++++ src/Audio_Null.c | 5 ++++- src/Audio_OS2.c | 20 ++++++++++++++++++++ src/Audio_OpenAL.c | 20 ++++++++++++++++++++ src/Audio_SLES.c | 20 ++++++++++++++++++++ src/Audio_Switch.c | 20 ++++++++++++++++++++ src/Audio_Symbian.cpp | 20 ++++++++++++++++++++ src/Audio_Web.c | 20 ++++++++++++++++++++ src/Audio_WiiU.c | 20 ++++++++++++++++++++ src/Audio_WinMM.c | 20 ++++++++++++++++++++ src/Platform_Dreamcast.c | 2 +- src/_AudioBase.h | 28 ++++++---------------------- 15 files changed, 235 insertions(+), 25 deletions(-) diff --git a/src/Audio.h b/src/Audio.h index 488702971..01fe1ef23 100644 --- a/src/Audio.h +++ b/src/Audio.h @@ -99,9 +99,12 @@ void AudioPool_Close(void); *------------------------------------------------------Sound context------------------------------------------------------* *#########################################################################################################################*/ /* Whether the given audio data can be played without recreating the underlying audio device */ -cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data); +cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data); /* Plays the given audio data */ cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data); +/* Polls the audio context and then potentially unqueues internal buffers */ +/* Returns whether the audio context is currently playing audio */ +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy); /*########################################################################################################################* diff --git a/src/Audio_3DS.c b/src/Audio_3DS.c index c21e2ac8c..9dcb6422d 100644 --- a/src/Audio_3DS.c +++ b/src/Audio_3DS.c @@ -135,6 +135,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_Dreamcast.c b/src/Audio_Dreamcast.c index 83bb828c5..e64fb69be 100644 --- a/src/Audio_Dreamcast.c +++ b/src/Audio_Dreamcast.c @@ -142,6 +142,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_GCWii.c b/src/Audio_GCWii.c index f373e1399..d141e983f 100644 --- a/src/Audio_GCWii.c +++ b/src/Audio_GCWii.c @@ -149,6 +149,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_Null.c b/src/Audio_Null.c index feea1c4b9..7988d3fc1 100644 --- a/src/Audio_Null.c +++ b/src/Audio_Null.c @@ -5,7 +5,6 @@ struct AudioContext { int count; }; #define AUDIO_OVERRIDE_SOUNDS #define AUDIO_OVERRIDE_ALLOC -#define AUDIO_OVERRIDE_SOUNDPLAY #include "_AudioBase.h" cc_bool AudioBackend_Init(void) { return false; } @@ -50,6 +49,10 @@ cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data return ERR_NOT_SUPPORTED; } +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + return ERR_NOT_SUPPORTED; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_OS2.c b/src/Audio_OS2.c index 328325807..2be64b8c5 100644 --- a/src/Audio_OS2.c +++ b/src/Audio_OS2.c @@ -180,6 +180,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return false; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_OpenAL.c b/src/Audio_OpenAL.c index cfd09a08d..f3343a40c 100644 --- a/src/Audio_OpenAL.c +++ b/src/Audio_OpenAL.c @@ -265,6 +265,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_SLES.c b/src/Audio_SLES.c index 63e572652..6ffe42c94 100644 --- a/src/Audio_SLES.c +++ b/src/Audio_SLES.c @@ -231,6 +231,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return !ctx->channels || (ctx->channels == data->channels && ctx->sampleRate == data->sampleRate); } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_Switch.c b/src/Audio_Switch.c index c4042c5e4..bffff2e5b 100644 --- a/src/Audio_Switch.c +++ b/src/Audio_Switch.c @@ -181,6 +181,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_Symbian.cpp b/src/Audio_Symbian.cpp index 026bff397..1c04ff531 100644 --- a/src/Audio_Symbian.cpp +++ b/src/Audio_Symbian.cpp @@ -367,6 +367,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return !ctx->channels || (ctx->channels == channels && ctx->sampleRate == sampleRate); } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_Web.c b/src/Audio_Web.c index a4139c1b0..00786235a 100644 --- a/src/Audio_Web.c +++ b/src/Audio_Web.c @@ -67,6 +67,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_WiiU.c b/src/Audio_WiiU.c index 415bb751f..a40db1765 100644 --- a/src/Audio_WiiU.c +++ b/src/Audio_WiiU.c @@ -64,6 +64,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return true; } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Audio_WinMM.c b/src/Audio_WinMM.c index 735eac0a6..18b418f84 100644 --- a/src/Audio_WinMM.c +++ b/src/Audio_WinMM.c @@ -153,6 +153,26 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data) return !ctx->channels || (ctx->channels == channels && ctx->sampleRate == sampleRate); } +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; +} + +cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) { + int inUse = 1; + cc_result res; + if ((res = Audio_Poll(ctx, &inUse))) return res; + + *isBusy = inUse > 0; + return 0; +} + /*########################################################################################################################* *--------------------------------------------------------Audio misc-------------------------------------------------------* diff --git a/src/Platform_Dreamcast.c b/src/Platform_Dreamcast.c index ce5c5e054..1ba30c018 100644 --- a/src/Platform_Dreamcast.c +++ b/src/Platform_Dreamcast.c @@ -236,7 +236,7 @@ static int VMUFile_Do(cc_file* file, int mode) { data = Mem_Alloc(len, 1, "VMU data"); fs_read(fd, data, len); - err = vmu_pkg_parse(data, &pkg); + err = vmu_pkg_parse(data, len, &pkg); fs_close(fd); } diff --git a/src/_AudioBase.h b/src/_AudioBase.h index 6743abad1..00884427f 100644 --- a/src/_AudioBase.h +++ b/src/_AudioBase.h @@ -106,23 +106,6 @@ void AudioBackend_LoadSounds(void) { Sounds_LoadDefault(); } #endif -/*########################################################################################################################* -*------------------------------------------------------Sound context------------------------------------------------------* -*#########################################################################################################################*/ -#ifndef AUDIO_OVERRIDE_SOUNDPLAY -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; -} -#endif - - /*########################################################################################################################* *---------------------------------------------------Audio context code----------------------------------------------------* *#########################################################################################################################*/ @@ -133,8 +116,9 @@ static struct AudioContext context_pool[POOL_MAX_CONTEXTS]; #ifndef CC_BUILD_NOSOUNDS cc_result AudioPool_Play(struct AudioData* data) { struct AudioContext* ctx; - int inUse, i; + cc_bool isBusy; cc_result res; + int i; /* Try to play on a context that doesn't need to be recreated */ for (i = 0; i < POOL_MAX_CONTEXTS; i++) @@ -142,8 +126,8 @@ cc_result AudioPool_Play(struct AudioData* data) { ctx = &context_pool[i]; if (!ctx->count && (res = Audio_Init(ctx, 1))) return res; - if ((res = Audio_Poll(ctx, &inUse))) return res; - if (inUse > 0) continue; + if ((res = SoundContext_PollBusy(ctx, &isBusy))) return res; + if (isBusy) continue; if (!SoundContext_FastPlay(ctx, data)) continue; return SoundContext_PlayData(ctx, data); @@ -153,10 +137,10 @@ cc_result AudioPool_Play(struct AudioData* data) { for (i = 0; i < POOL_MAX_CONTEXTS; i++) { ctx = &context_pool[i]; - res = Audio_Poll(ctx, &inUse); + res = SoundContext_PollBusy(ctx, &isBusy); if (res) return res; - if (inUse > 0) continue; + if (isBusy) continue; return SoundContext_PlayData(ctx, data); }