mirror of
https://github.com/izzy2lost/Diddy-Kong-Racing.git
synced 2026-06-19 01:16:26 -07:00
alSynAllocVoice
This commit is contained in:
+109
-2
@@ -157,7 +157,6 @@ void alEvtqNew(ALEventQueue *evtq, ALEventListItem *items, s32 itemCount){
|
||||
}
|
||||
}
|
||||
|
||||
//GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alSynAddPlayer.s")
|
||||
void alSynAddPlayer(ALSynth *drvr, ALPlayer *client)
|
||||
{
|
||||
OSIntMask mask = osSetIntMask(OS_IM_NONE);
|
||||
@@ -169,5 +168,113 @@ void alSynAddPlayer(ALSynth *drvr, ALPlayer *client)
|
||||
osSetIntMask(mask);
|
||||
}
|
||||
|
||||
#if 1
|
||||
GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/_allocatePVoice.s")
|
||||
GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alSynAllocVoice.s")
|
||||
#else
|
||||
s32 _allocatePVoice(ALSynth *drvr, PVoice **pvoice, s16 priority)
|
||||
{
|
||||
ALLink *dl;
|
||||
PVoice *pv;
|
||||
s32 stolen = 0;
|
||||
|
||||
if ((dl = drvr->pLameList.next) != 0) { /* check the lame list first */
|
||||
*pvoice = (PVoice *) dl;
|
||||
alUnlink(dl);
|
||||
alLink(dl, &drvr->pAllocList);
|
||||
} else if ((dl = drvr->pFreeList.next) != 0) { /* from the free list */
|
||||
*pvoice = (PVoice *) dl;
|
||||
alUnlink(dl);
|
||||
alLink(dl, &drvr->pAllocList);
|
||||
} else { /* steal one */
|
||||
for (dl = drvr->pAllocList.next; dl != 0; dl = dl->next) {
|
||||
pv = (PVoice *)dl;
|
||||
|
||||
/*
|
||||
* if it is lower priority and not already stolen, keep it
|
||||
* as a candidate for stealing
|
||||
*/
|
||||
if ((pv->vvoice->priority <= priority) && (pv->offset == 0)) {
|
||||
*pvoice = pv;
|
||||
priority = pv->vvoice->priority;
|
||||
stolen = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return stolen;
|
||||
}
|
||||
#endif
|
||||
|
||||
//GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alSynAllocVoice.s")
|
||||
s32 alSynAllocVoice(ALSynth *drvr, ALVoice *voice, ALVoiceConfig *vc)
|
||||
{
|
||||
PVoice *pvoice = 0;
|
||||
ALFilter *f;
|
||||
ALParam *update;
|
||||
s32 stolen;
|
||||
|
||||
#ifdef _DEBUG
|
||||
/* need two updates if voice is stolen */
|
||||
if (drvr->paramList == 0) {
|
||||
__osError(ERR_ALSYN_NO_UPDATE, 0);
|
||||
return 0;
|
||||
} else if (drvr->paramList->next == 0) {
|
||||
__osError(ERR_ALSYN_NO_UPDATE, 0);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
voice->priority = vc->priority;
|
||||
voice->unityPitch = vc->unityPitch;
|
||||
voice->table = 0;
|
||||
voice->fxBus = vc->fxBus;
|
||||
voice->state = AL_STOPPED;
|
||||
voice->pvoice = 0;
|
||||
|
||||
stolen = _allocatePVoice(drvr, &pvoice, vc->priority);
|
||||
|
||||
if (pvoice) { /* if we were able to allocate a voice */
|
||||
|
||||
f = pvoice->channelKnob;
|
||||
|
||||
if (stolen) {
|
||||
|
||||
pvoice->offset = 512;
|
||||
pvoice->vvoice->pvoice = 0; /* zero stolen voice */
|
||||
|
||||
/*
|
||||
* ramp down stolen voice
|
||||
*/
|
||||
update = __allocParam();
|
||||
update->delta = drvr->paramSamples;
|
||||
update->type = AL_FILTER_SET_VOLUME;
|
||||
update->data.i = 0;
|
||||
update->moredata.i = pvoice->offset - 64;
|
||||
(*f->setParam)(f, AL_FILTER_ADD_UPDATE, update);
|
||||
|
||||
/*
|
||||
* stop stolen voice
|
||||
*/
|
||||
update = __allocParam();
|
||||
if (update) {
|
||||
update->delta = drvr->paramSamples + pvoice->offset;
|
||||
update->type = AL_FILTER_STOP_VOICE;
|
||||
update->next = 0;
|
||||
(*f->setParam)(f, AL_FILTER_ADD_UPDATE, update);
|
||||
} else {
|
||||
#ifdef _DEBUG
|
||||
__osError(ERR_ALSYN_NO_UPDATE, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
} else {
|
||||
pvoice->offset = 0;
|
||||
}
|
||||
|
||||
pvoice->vvoice = voice; /* assign new voice */
|
||||
voice->pvoice = pvoice;
|
||||
|
||||
}
|
||||
|
||||
return (pvoice != 0);
|
||||
}
|
||||
Reference in New Issue
Block a user