From 9cb0d8b1f234a1b25d126fc494cc4d42f34ab9a2 Mon Sep 17 00:00:00 2001 From: Harrison <53527582+HTV04@users.noreply.github.com> Date: Sun, 29 May 2022 11:41:11 -0400 Subject: [PATCH] Add argument parameter for AESND callbacks --- gc/aesndlib.h | 20 +++++++++++++++--- libaesnd/aesndlib.c | 51 +++++++++++++++++++++++++-------------------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/gc/aesndlib.h b/gc/aesndlib.h index 04e581fd2..24b29ecbb 100644 --- a/gc/aesndlib.h +++ b/gc/aesndlib.h @@ -35,7 +35,9 @@ typedef struct aesndpb_t AESNDPB; +typedef void (*AESNDVoiceCallbackArg)(AESNDPB *pb,u32 state,void *cbArg); typedef void (*AESNDVoiceCallback)(AESNDPB *pb,u32 state); +typedef void (*AESNDAudioCallbackArg)(void *audio_buffer,u32 len,void *cbArg); typedef void (*AESNDAudioCallback)(void *audio_buffer,u32 len); void AESND_Init(void); @@ -43,9 +45,17 @@ void AESND_Reset(void); void AESND_Pause(bool pause); u32 AESND_GetDSPProcessTime(void); f32 AESND_GetDSPProcessUsage(void); -AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb); +AESNDAudioCallbackArg AESND_RegisterAudioCallbackWithArg(AESNDAudioCallbackArg cb, void *cbArg); +static inline AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb) +{ + return (AESNDAudioCallback)AESND_RegisterAudioCallbackWithArg((AESNDAudioCallbackArg)cb,NULL); +} -AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb); +AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb, void *cbArg); +static inline AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb) +{ + return AESND_AllocateVoiceWithArg((AESNDVoiceCallbackArg)cb,NULL); +} void AESND_FreeVoice(AESNDPB *pb); void AESND_SetVoiceStop(AESNDPB *pb,bool stop); void AESND_SetVoiceMute(AESNDPB *pb,bool mute); @@ -57,7 +67,11 @@ void AESND_SetVoiceVolume(AESNDPB *pb,u16 volume_l,u16 volume_r); void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay); void AESND_SetVoiceBuffer(AESNDPB *pb,const void *buffer,u32 len); void AESND_PlayVoice(AESNDPB *pb,u32 format,const void *buffer,u32 len,f32 freq,u32 delay,bool looped); -AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb); +AESNDVoiceCallbackArg AESND_RegisterVoiceCallbackWithArg(AESNDPB *pb,AESNDVoiceCallbackArg cb,void *cbArg); +static inline AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb) +{ + return (AESNDVoiceCallback)AESND_RegisterVoiceCallbackWithArg(pb,(AESNDVoiceCallbackArg)cb,NULL); +} #ifdef __cplusplus } diff --git a/libaesnd/aesndlib.c b/libaesnd/aesndlib.c index d2462153b..f49ec26d5 100644 --- a/libaesnd/aesndlib.c +++ b/libaesnd/aesndlib.c @@ -55,9 +55,11 @@ struct aesndpb_t u32 voiceno; u32 shift; - AESNDVoiceCallback cb; - - AESNDAudioCallback audioCB; + AESNDVoiceCallbackArg cb; + void *cbArg; + + AESNDAudioCallbackArg audioCB; + void *audioCBArg; }; static dsptask_t __aesnddsptask; @@ -126,6 +128,7 @@ static __inline__ void __aesndcopycommand(AESNDPB *dst,AESNDPB *src) dst->voiceno = src->voiceno; dst->shift = src->shift; dst->cb = src->cb; + dst->cbArg = src->cbArg; } @@ -198,7 +201,7 @@ static __inline__ void __aesndhandlerequest(AESNDPB *pb) if(pb->mram_curr>=pb->mram_end) { if(pb->flags&VOICE_STREAM && pb->cb) - pb->cb(pb,VOICE_STATE_STREAM); + pb->cb(pb,VOICE_STATE_STREAM,pb->cbArg); if(pb->flags&VOICE_ONCE) { pb->flags |= VOICE_STOPPED; return; @@ -262,7 +265,7 @@ static __inline__ void __aesndhandlerequest(AESNDPB *pb) if(pb->mram_curr>=pb->mram_end) { if(pb->flags&VOICE_STREAM && pb->cb) - pb->cb(pb,VOICE_STATE_STREAM); + pb->cb(pb,VOICE_STATE_STREAM,pb->cbArg); if(pb->flags&VOICE_ONCE) { pb->buf_start = 0; pb->flags |= VOICE_STOPPED; @@ -332,7 +335,7 @@ static void __dsp_requestcallback(dsptask_t *task) __aesndhandlerequest(&__aesndcommand); - if(__aesndcommand.flags&VOICE_STOPPED && __aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_STOPPED); + if(__aesndcommand.flags&VOICE_STOPPED && __aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_STOPPED,__aesndcommand.cbArg); __aesndcopycommand(&__aesndvoicepb[__aesndcurrvoice],&__aesndcommand); @@ -340,8 +343,8 @@ static void __dsp_requestcallback(dsptask_t *task) while(__aesndcurrvoicefreq_h = 0x0001; pb->freq_l = 0x0000; pb->cb = cb; + pb->cbArg = cbArg; break; } } @@ -584,7 +589,7 @@ void AESND_PlayVoice(AESNDPB *pb,u32 format,const void *buffer,u32 len,f32 freq, __aesndsetvoicebuffer(pb,ptr,len); pb->flags &= ~(VOICE_RUNNING|VOICE_STOPPED|VOICE_LOOP|VOICE_ONCE); - if(looped==true) + if(looped==true) pb->flags |= VOICE_LOOP; else pb->flags |= VOICE_ONCE; @@ -628,7 +633,7 @@ void AESND_SetVoiceVolume(AESNDPB *pb,u16 volume_l,u16 volume_r) void AESND_SetVoiceFrequency(AESNDPB *pb,f32 freq) { u32 level; - + _CPU_ISR_Disable(level); __aesndsetvoicefreq(pb,freq); _CPU_ISR_Restore(level); @@ -637,7 +642,7 @@ void AESND_SetVoiceFrequency(AESNDPB *pb,f32 freq) void AESND_SetVoiceStream(AESNDPB *pb,bool stream) { u32 level; - + _CPU_ISR_Disable(level); if(stream==true) pb->flags |= VOICE_STREAM; @@ -649,7 +654,7 @@ void AESND_SetVoiceStream(AESNDPB *pb,bool stream) void AESND_SetVoiceLoop(AESNDPB *pb,bool loop) { u32 level; - + _CPU_ISR_Disable(level); if(loop==true) pb->flags |= VOICE_LOOP; @@ -682,14 +687,15 @@ void AESND_SetVoiceStop(AESNDPB *pb,bool stop) _CPU_ISR_Restore(level); } -AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb) +AESNDVoiceCallbackArg AESND_RegisterVoiceCallbackWithArg(AESNDPB *pb,AESNDVoiceCallbackArg cb,void *cbArg) { u32 level; - AESNDVoiceCallback rcb = NULL; + AESNDVoiceCallbackArg rcb = NULL; _CPU_ISR_Disable(level); rcb = pb->cb; pb->cb = cb; + pb->cbArg = cbArg; _CPU_ISR_Restore(level); return rcb; @@ -703,4 +709,3 @@ void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay) pb->delay = (delay*48); _CPU_ISR_Restore(level); } -