mirror of https://github.com/PrimeDecomp/prime.git
Match and link synthvoice.c
Former-commit-id: 0c302d2c554666cdcab303017c0ae5fca98fea32
This commit is contained in:
parent
c75dae767e
commit
c2d27e0beb
|
@ -1188,7 +1188,7 @@ config.libs = [
|
||||||
Object(NonMatching, "musyx/runtime/stream.c"),
|
Object(NonMatching, "musyx/runtime/stream.c"),
|
||||||
Object(Matching, "musyx/runtime/synthdata.c"),
|
Object(Matching, "musyx/runtime/synthdata.c"),
|
||||||
Object(NonMatching, "musyx/runtime/synthmacros.c"),
|
Object(NonMatching, "musyx/runtime/synthmacros.c"),
|
||||||
Object(NonMatching, "musyx/runtime/synthvoice.c"),
|
Object(Matching, "musyx/runtime/synthvoice.c"),
|
||||||
Object(Matching, "musyx/runtime/synth_ac.c"),
|
Object(Matching, "musyx/runtime/synth_ac.c"),
|
||||||
Object(Matching, "musyx/runtime/synth_adsr.c"),
|
Object(Matching, "musyx/runtime/synth_adsr.c"),
|
||||||
Object(Matching, "musyx/runtime/synth_vsamples.c"),
|
Object(Matching, "musyx/runtime/synth_vsamples.c"),
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
#include "musyx/assert.h"
|
#include "musyx/assert.h"
|
||||||
#include "musyx/hardware.h"
|
#include "musyx/hardware.h"
|
||||||
#include "musyx/voice.h"
|
|
||||||
#include "musyx/stream.h"
|
|
||||||
#include "musyx/macros.h"
|
#include "musyx/macros.h"
|
||||||
|
#include "musyx/stream.h"
|
||||||
|
#include "musyx/voice.h"
|
||||||
|
|
||||||
void voiceResetLastStarted(SYNTH_VOICE* svoice);
|
void voiceResetLastStarted(SYNTH_VOICE* svoice);
|
||||||
|
|
||||||
|
@ -287,16 +287,158 @@ void voiceSetPriority(SYNTH_VOICE* svoice, u8 prio) {
|
||||||
hwSetPriority(svoice->id & 0xFF, ((u32)prio << 24) | (svoice->age >> 15));
|
hwSetPriority(svoice->id & 0xFF, ((u32)prio << 24) | (svoice->age >> 15));
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma dont_inline on
|
|
||||||
u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag) {
|
u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag) {
|
||||||
long i; // r31
|
s32 i; // r31
|
||||||
long num; // r26
|
s32 num; // r26
|
||||||
long voice; // r30
|
s32 voice; // r30
|
||||||
u16 p; // r29
|
u16 p; // r29
|
||||||
u32 type_alloc; // r25
|
u32 type_alloc; // r25
|
||||||
SYNTH_VOICELIST* sfv; // r27
|
SYNTH_VOICELIST* sfv; // r27
|
||||||
|
|
||||||
|
if (!synthIdleWaitActive) {
|
||||||
|
if (fxFlag) {
|
||||||
|
type_alloc = (voiceFxRunning >= synthInfo.maxSFX && synthInfo.voiceNum > synthInfo.maxSFX);
|
||||||
|
|
||||||
|
if (synthInfo.maxSFX <= maxVoices) {
|
||||||
|
goto _skip_alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
goto _do_alloc;
|
||||||
|
} else {
|
||||||
|
type_alloc = (voiceMusicRunning >= synthInfo.maxMusic && synthInfo.voiceNum > synthInfo.maxMusic);
|
||||||
|
|
||||||
|
if (synthInfo.maxMusic <= maxVoices) {
|
||||||
|
goto _skip_alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
_do_alloc:
|
||||||
|
num = 0;
|
||||||
|
voice = -1;
|
||||||
|
|
||||||
|
p = voicePrioSortRootListRoot;
|
||||||
|
while (p != 0xFFFF && priority >= p && voice == -1) {
|
||||||
|
for (i = voicePrioSortVoicesRoot[p]; i != 0xff; i = voicePrioSortVoices[i].next) {
|
||||||
|
if (allocId != synthVoice[i].allocId)
|
||||||
|
continue;
|
||||||
|
++num;
|
||||||
|
if(synthVoice[i].block)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!type_alloc || fxFlag == synthVoice[i].fxFlag) {
|
||||||
|
if((synthVoice[i].cFlags & 2))
|
||||||
|
continue;
|
||||||
|
if (voice != -1) {
|
||||||
|
if(synthVoice[i].age < synthVoice[voice].age)
|
||||||
|
voice = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
voice = i;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p = voicePrioSortRootList[p].next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num < maxVoices) {
|
||||||
|
while (p != 0xffff && num < maxVoices) {
|
||||||
|
i = voicePrioSortVoicesRoot[p];
|
||||||
|
while (i != 0xff) {
|
||||||
|
if (allocId == synthVoice[i].allocId) {
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = voicePrioSortVoices[i].next;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = voicePrioSortRootList[p].next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num < maxVoices) {
|
||||||
|
_skip_alloc:
|
||||||
|
if (voiceListRoot != 0xff && type_alloc == 0) {
|
||||||
|
voice = voiceListRoot;
|
||||||
|
goto _update;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priority < voicePrioSortRootListRoot) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
voice = -1;
|
||||||
|
p = voicePrioSortRootListRoot;
|
||||||
|
|
||||||
|
while (p != 0xFFFF && priority >= p && voice == -1) {
|
||||||
|
for (i = voicePrioSortVoicesRoot[p]; i != 0xff; i = voicePrioSortVoices[i].next) {
|
||||||
|
if (synthVoice[i].block != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!type_alloc || fxFlag == synthVoice[i].fxFlag) {
|
||||||
|
if((synthVoice[i].cFlags & 2))
|
||||||
|
continue;
|
||||||
|
if (voice != -1) {
|
||||||
|
if(synthVoice[voice].age > synthVoice[i].age)
|
||||||
|
voice = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
voice = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = voicePrioSortRootList[p].next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (voice == -1) {
|
||||||
|
return 0xffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (synthVoice[voice].prio > priority) {
|
||||||
|
goto _fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_update:
|
||||||
|
if (voice == -1) {
|
||||||
|
goto _fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (voiceList[voice].user == 1) {
|
||||||
|
sfv = voiceList + voice;
|
||||||
|
i = sfv->prev;
|
||||||
|
|
||||||
|
if (i != 0xff) {
|
||||||
|
voiceList[i].next = sfv->next;
|
||||||
|
} else {
|
||||||
|
voiceListRoot = sfv->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = sfv->next;
|
||||||
|
if (i != 0xff) {
|
||||||
|
voiceList[i].prev = sfv->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (voice == voiceListInsert) {
|
||||||
|
voiceListInsert = sfv->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfv->user = 0;
|
||||||
|
} else if (synthVoice[voice].fxFlag) {
|
||||||
|
voiceFxRunning--;
|
||||||
|
} else {
|
||||||
|
voiceMusicRunning--;
|
||||||
|
}
|
||||||
|
if (fxFlag != FALSE) {
|
||||||
|
++voiceFxRunning;
|
||||||
|
} else {
|
||||||
|
++voiceMusicRunning;
|
||||||
|
}
|
||||||
|
return voice;
|
||||||
|
}
|
||||||
|
|
||||||
|
_fail:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
#pragma dont_inline reset
|
|
||||||
|
|
||||||
void voiceFree(SYNTH_VOICE* svoice) {
|
void voiceFree(SYNTH_VOICE* svoice) {
|
||||||
u32 i; // r29
|
u32 i; // r29
|
||||||
|
|
Loading…
Reference in New Issue