Skip to content

Commit

Permalink
Add argument parameter for AESND callbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
HTV04 committed May 30, 2022
1 parent 6c10421 commit 1afd42f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 23 deletions.
5 changes: 5 additions & 0 deletions gc/aesndlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,20 @@

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);
void AESND_Reset(void);
void AESND_Pause(bool pause);
u32 AESND_GetDSPProcessTime(void);
f32 AESND_GetDSPProcessUsage(void);
AESNDAudioCallbackArg AESND_RegisterAudioCallbackWithArg(AESNDAudioCallbackArg cb, void *cbArg);
AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb);

AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb, void *cbArg);
AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb);
void AESND_FreeVoice(AESNDPB *pb);
void AESND_SetVoiceStop(AESNDPB *pb,bool stop);
Expand All @@ -57,6 +61,7 @@ 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);
AESNDVoiceCallbackArg AESND_RegisterVoiceCallbackWithArg(AESNDPB *pb,AESNDVoiceCallbackArg cb,void *cbArg);
AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb);

#ifdef __cplusplus
Expand Down
66 changes: 43 additions & 23 deletions libaesnd/aesndlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}


Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -332,16 +335,16 @@ 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);

__aesndcurrvoice++;
while(__aesndcurrvoice<MAX_VOICES && (!(__aesndvoicepb[__aesndcurrvoice].flags&VOICE_USED) || (__aesndvoicepb[__aesndcurrvoice].flags&VOICE_STOPPED))) __aesndcurrvoice++;
if(__aesndcurrvoice<MAX_VOICES) {
__aesndcopycommand(&__aesndcommand,&__aesndvoicepb[__aesndcurrvoice]);
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING);

if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING,__aesndcommand.cbArg);

DCFlushRange(&__aesndcommand,PB_STRUCT_SIZE);
DSP_SendMailTo(0xface0020);
Expand Down Expand Up @@ -375,7 +378,7 @@ static void __audio_dma_callback(void)
else
ptr = audio_buffer[__aesndcurrab];

if(__aesndcommand.audioCB) __aesndcommand.audioCB(ptr,SND_BUFFERSIZE);
if(__aesndcommand.audioCB) __aesndcommand.audioCB(ptr,SND_BUFFERSIZE,__aesndcommand.audioCBArg);
AUDIO_InitDMA((u32)ptr,SND_BUFFERSIZE);

if(__aesndglobalpause==true) return;
Expand All @@ -393,7 +396,7 @@ static void __audio_dma_callback(void)
__aesndvoicesstopped = false;
__aesndcopycommand(&__aesndcommand,&__aesndvoicepb[__aesndcurrvoice]);

if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING);
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING,__aesndcommand.cbArg);

__aesndcommand.out_buf = (u32)MEM_VIRTUAL_TO_PHYSICAL(audio_buffer[__aesndcurrab]);
DCFlushRange(&__aesndcommand,PB_STRUCT_SIZE);
Expand Down Expand Up @@ -478,7 +481,7 @@ void AESND_Reset(void)

DSP_SendMailTo(0xfacedead);
while(DSP_CheckMailTo());

do {
_CPU_ISR_Flash(level);
} while(__aesnddspinit);
Expand All @@ -505,7 +508,7 @@ u32 AESND_GetDSPProcessTime(void)
_CPU_ISR_Disable(level);
time = ticks_to_microsecs(__aesnddspprocesstime);
_CPU_ISR_Restore(level);

return time;
}

Expand All @@ -517,24 +520,30 @@ f32 AESND_GetDSPProcessUsage(void)
_CPU_ISR_Disable(level);
usage = (ticks_to_microsecs(__aesnddspprocesstime)*100)/2000.0f;
_CPU_ISR_Restore(level);

return usage;
}

AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb)
AESNDAudioCallbackArg AESND_RegisterAudioCallbackWithArg(AESNDAudioCallbackArg cb,void *cbArg)
{
u32 level;
AESNDAudioCallback aCB;
AESNDAudioCallbackArg aCB;

_CPU_ISR_Disable(level);
aCB = __aesndcommand.audioCB;
__aesndcommand.audioCB = cb;
__aesndcommand.audioCBArg = cbArg;
_CPU_ISR_Restore(level);

return aCB;
}

AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb)
{
return (AESNDAudioCallback)AESND_RegisterAudioCallbackWithArg((AESNDAudioCallbackArg)cb,NULL);
}

AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb,void *cbArg)
{
u32 i,level;
AESNDPB *pb = NULL;
Expand All @@ -555,6 +564,7 @@ AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
pb->freq_h = 0x0001;
pb->freq_l = 0x0000;
pb->cb = cb;
pb->cbArg = cbArg;
break;
}
}
Expand All @@ -563,6 +573,11 @@ AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
return pb;
}

AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
{
return AESND_AllocateVoiceWithArg((AESNDVoiceCallbackArg)cb,NULL);
}

void AESND_FreeVoice(AESNDPB *pb)
{
u32 level;
Expand All @@ -584,7 +599,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;
Expand Down Expand Up @@ -628,7 +643,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);
Expand All @@ -637,7 +652,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;
Expand All @@ -649,7 +664,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;
Expand Down Expand Up @@ -682,19 +697,25 @@ 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;
}

AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb)
{
return (AESNDVoiceCallback)AESND_RegisterVoiceCallbackWithArg(pb,(AESNDVoiceCallbackArg)cb,NULL);
}

void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay)
{
u32 level;
Expand All @@ -703,4 +724,3 @@ void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay)
pb->delay = (delay*48);
_CPU_ISR_Restore(level);
}

0 comments on commit 1afd42f

Please sign in to comment.