Skip to content

Commit 3d123eb

Browse files
authored
Add argument parameter for AESND callbacks (#129)
1 parent 6c10421 commit 3d123eb

2 files changed

Lines changed: 45 additions & 26 deletions

File tree

gc/aesndlib.h

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,27 @@
3535

3636
typedef struct aesndpb_t AESNDPB;
3737

38+
typedef void (*AESNDVoiceCallbackArg)(AESNDPB *pb,u32 state,void *cbArg);
3839
typedef void (*AESNDVoiceCallback)(AESNDPB *pb,u32 state);
40+
typedef void (*AESNDAudioCallbackArg)(void *audio_buffer,u32 len,void *cbArg);
3941
typedef void (*AESNDAudioCallback)(void *audio_buffer,u32 len);
4042

4143
void AESND_Init(void);
4244
void AESND_Reset(void);
4345
void AESND_Pause(bool pause);
4446
u32 AESND_GetDSPProcessTime(void);
4547
f32 AESND_GetDSPProcessUsage(void);
46-
AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb);
48+
AESNDAudioCallbackArg AESND_RegisterAudioCallbackWithArg(AESNDAudioCallbackArg cb, void *cbArg);
49+
static inline AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb)
50+
{
51+
return (AESNDAudioCallback)AESND_RegisterAudioCallbackWithArg((AESNDAudioCallbackArg)cb,NULL);
52+
}
4753

48-
AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb);
54+
AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb, void *cbArg);
55+
static inline AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
56+
{
57+
return AESND_AllocateVoiceWithArg((AESNDVoiceCallbackArg)cb,NULL);
58+
}
4959
void AESND_FreeVoice(AESNDPB *pb);
5060
void AESND_SetVoiceStop(AESNDPB *pb,bool stop);
5161
void AESND_SetVoiceMute(AESNDPB *pb,bool mute);
@@ -57,7 +67,11 @@ void AESND_SetVoiceVolume(AESNDPB *pb,u16 volume_l,u16 volume_r);
5767
void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay);
5868
void AESND_SetVoiceBuffer(AESNDPB *pb,const void *buffer,u32 len);
5969
void AESND_PlayVoice(AESNDPB *pb,u32 format,const void *buffer,u32 len,f32 freq,u32 delay,bool looped);
60-
AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb);
70+
AESNDVoiceCallbackArg AESND_RegisterVoiceCallbackWithArg(AESNDPB *pb,AESNDVoiceCallbackArg cb,void *cbArg);
71+
static inline AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb)
72+
{
73+
return (AESNDVoiceCallback)AESND_RegisterVoiceCallbackWithArg(pb,(AESNDVoiceCallbackArg)cb,NULL);
74+
}
6175

6276
#ifdef __cplusplus
6377
}

libaesnd/aesndlib.c

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ struct aesndpb_t
5555

5656
u32 voiceno;
5757
u32 shift;
58-
AESNDVoiceCallback cb;
59-
60-
AESNDAudioCallback audioCB;
58+
AESNDVoiceCallbackArg cb;
59+
void *cbArg;
60+
61+
AESNDAudioCallbackArg audioCB;
62+
void *audioCBArg;
6163
};
6264

6365
static dsptask_t __aesnddsptask;
@@ -126,6 +128,7 @@ static __inline__ void __aesndcopycommand(AESNDPB *dst,AESNDPB *src)
126128
dst->voiceno = src->voiceno;
127129
dst->shift = src->shift;
128130
dst->cb = src->cb;
131+
dst->cbArg = src->cbArg;
129132
}
130133

131134

@@ -198,7 +201,7 @@ static __inline__ void __aesndhandlerequest(AESNDPB *pb)
198201

199202
if(pb->mram_curr>=pb->mram_end) {
200203
if(pb->flags&VOICE_STREAM && pb->cb)
201-
pb->cb(pb,VOICE_STATE_STREAM);
204+
pb->cb(pb,VOICE_STATE_STREAM,pb->cbArg);
202205
if(pb->flags&VOICE_ONCE) {
203206
pb->flags |= VOICE_STOPPED;
204207
return;
@@ -262,7 +265,7 @@ static __inline__ void __aesndhandlerequest(AESNDPB *pb)
262265

263266
if(pb->mram_curr>=pb->mram_end) {
264267
if(pb->flags&VOICE_STREAM && pb->cb)
265-
pb->cb(pb,VOICE_STATE_STREAM);
268+
pb->cb(pb,VOICE_STATE_STREAM,pb->cbArg);
266269
if(pb->flags&VOICE_ONCE) {
267270
pb->buf_start = 0;
268271
pb->flags |= VOICE_STOPPED;
@@ -332,16 +335,16 @@ static void __dsp_requestcallback(dsptask_t *task)
332335

333336
__aesndhandlerequest(&__aesndcommand);
334337

335-
if(__aesndcommand.flags&VOICE_STOPPED && __aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_STOPPED);
338+
if(__aesndcommand.flags&VOICE_STOPPED && __aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_STOPPED,__aesndcommand.cbArg);
336339

337340
__aesndcopycommand(&__aesndvoicepb[__aesndcurrvoice],&__aesndcommand);
338341

339342
__aesndcurrvoice++;
340343
while(__aesndcurrvoice<MAX_VOICES && (!(__aesndvoicepb[__aesndcurrvoice].flags&VOICE_USED) || (__aesndvoicepb[__aesndcurrvoice].flags&VOICE_STOPPED))) __aesndcurrvoice++;
341344
if(__aesndcurrvoice<MAX_VOICES) {
342345
__aesndcopycommand(&__aesndcommand,&__aesndvoicepb[__aesndcurrvoice]);
343-
344-
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING);
346+
347+
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING,__aesndcommand.cbArg);
345348

346349
DCFlushRange(&__aesndcommand,PB_STRUCT_SIZE);
347350
DSP_SendMailTo(0xface0020);
@@ -375,7 +378,7 @@ static void __audio_dma_callback(void)
375378
else
376379
ptr = audio_buffer[__aesndcurrab];
377380

378-
if(__aesndcommand.audioCB) __aesndcommand.audioCB(ptr,SND_BUFFERSIZE);
381+
if(__aesndcommand.audioCB) __aesndcommand.audioCB(ptr,SND_BUFFERSIZE,__aesndcommand.audioCBArg);
379382
AUDIO_InitDMA((u32)ptr,SND_BUFFERSIZE);
380383

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

396-
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING);
399+
if(__aesndcommand.cb) __aesndcommand.cb(&__aesndcommand,VOICE_STATE_RUNNING,__aesndcommand.cbArg);
397400

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

479482
DSP_SendMailTo(0xfacedead);
480483
while(DSP_CheckMailTo());
481-
484+
482485
do {
483486
_CPU_ISR_Flash(level);
484487
} while(__aesnddspinit);
@@ -505,7 +508,7 @@ u32 AESND_GetDSPProcessTime(void)
505508
_CPU_ISR_Disable(level);
506509
time = ticks_to_microsecs(__aesnddspprocesstime);
507510
_CPU_ISR_Restore(level);
508-
511+
509512
return time;
510513
}
511514

@@ -517,24 +520,25 @@ f32 AESND_GetDSPProcessUsage(void)
517520
_CPU_ISR_Disable(level);
518521
usage = (ticks_to_microsecs(__aesnddspprocesstime)*100)/2000.0f;
519522
_CPU_ISR_Restore(level);
520-
523+
521524
return usage;
522525
}
523526

524-
AESNDAudioCallback AESND_RegisterAudioCallback(AESNDAudioCallback cb)
527+
AESNDAudioCallbackArg AESND_RegisterAudioCallbackWithArg(AESNDAudioCallbackArg cb,void *cbArg)
525528
{
526529
u32 level;
527-
AESNDAudioCallback aCB;
530+
AESNDAudioCallbackArg aCB;
528531

529532
_CPU_ISR_Disable(level);
530533
aCB = __aesndcommand.audioCB;
531534
__aesndcommand.audioCB = cb;
535+
__aesndcommand.audioCBArg = cbArg;
532536
_CPU_ISR_Restore(level);
533537

534538
return aCB;
535539
}
536540

537-
AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
541+
AESNDPB* AESND_AllocateVoiceWithArg(AESNDVoiceCallbackArg cb,void *cbArg)
538542
{
539543
u32 i,level;
540544
AESNDPB *pb = NULL;
@@ -555,6 +559,7 @@ AESNDPB* AESND_AllocateVoice(AESNDVoiceCallback cb)
555559
pb->freq_h = 0x0001;
556560
pb->freq_l = 0x0000;
557561
pb->cb = cb;
562+
pb->cbArg = cbArg;
558563
break;
559564
}
560565
}
@@ -584,7 +589,7 @@ void AESND_PlayVoice(AESNDPB *pb,u32 format,const void *buffer,u32 len,f32 freq,
584589
__aesndsetvoicebuffer(pb,ptr,len);
585590

586591
pb->flags &= ~(VOICE_RUNNING|VOICE_STOPPED|VOICE_LOOP|VOICE_ONCE);
587-
if(looped==true)
592+
if(looped==true)
588593
pb->flags |= VOICE_LOOP;
589594
else
590595
pb->flags |= VOICE_ONCE;
@@ -628,7 +633,7 @@ void AESND_SetVoiceVolume(AESNDPB *pb,u16 volume_l,u16 volume_r)
628633
void AESND_SetVoiceFrequency(AESNDPB *pb,f32 freq)
629634
{
630635
u32 level;
631-
636+
632637
_CPU_ISR_Disable(level);
633638
__aesndsetvoicefreq(pb,freq);
634639
_CPU_ISR_Restore(level);
@@ -637,7 +642,7 @@ void AESND_SetVoiceFrequency(AESNDPB *pb,f32 freq)
637642
void AESND_SetVoiceStream(AESNDPB *pb,bool stream)
638643
{
639644
u32 level;
640-
645+
641646
_CPU_ISR_Disable(level);
642647
if(stream==true)
643648
pb->flags |= VOICE_STREAM;
@@ -649,7 +654,7 @@ void AESND_SetVoiceStream(AESNDPB *pb,bool stream)
649654
void AESND_SetVoiceLoop(AESNDPB *pb,bool loop)
650655
{
651656
u32 level;
652-
657+
653658
_CPU_ISR_Disable(level);
654659
if(loop==true)
655660
pb->flags |= VOICE_LOOP;
@@ -682,14 +687,15 @@ void AESND_SetVoiceStop(AESNDPB *pb,bool stop)
682687
_CPU_ISR_Restore(level);
683688
}
684689

685-
AESNDVoiceCallback AESND_RegisterVoiceCallback(AESNDPB *pb,AESNDVoiceCallback cb)
690+
AESNDVoiceCallbackArg AESND_RegisterVoiceCallbackWithArg(AESNDPB *pb,AESNDVoiceCallbackArg cb,void *cbArg)
686691
{
687692
u32 level;
688-
AESNDVoiceCallback rcb = NULL;
693+
AESNDVoiceCallbackArg rcb = NULL;
689694

690695
_CPU_ISR_Disable(level);
691696
rcb = pb->cb;
692697
pb->cb = cb;
698+
pb->cbArg = cbArg;
693699
_CPU_ISR_Restore(level);
694700

695701
return rcb;
@@ -703,4 +709,3 @@ void AESND_SetVoiceDelay(AESNDPB *pb,u32 delay)
703709
pb->delay = (delay*48);
704710
_CPU_ISR_Restore(level);
705711
}
706-

0 commit comments

Comments
 (0)