Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add argument parameter for AESND callbacks #129

Merged
merged 1 commit into from
Jul 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions gc/aesndlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,27 @@

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);
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);
Expand All @@ -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
}
Expand Down
51 changes: 28 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,25 @@ 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)
AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb,void *cbArg)
{
u32 i,level;
AESNDPB *pb = NULL;
Expand All @@ -555,6 +559,7 @@ AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
pb->freq_h = 0x0001;
pb->freq_l = 0x0000;
pb->cb = cb;
pb->cbArg = cbArg;
break;
}
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -703,4 +709,3 @@ void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay)
pb->delay = (delay*48);
_CPU_ISR_Restore(level);
}