mirror of https://github.com/sm64pc/sm64pc.git
94 lines
2.5 KiB
C
94 lines
2.5 KiB
C
#include "libultra_internal.h"
|
|
#include "libaudio_internal.h"
|
|
|
|
#define PATCH(SRC, BASE, TYPE) SRC = (TYPE)((uintptr_t) SRC + (uintptr_t) BASE)
|
|
|
|
void alSeqFileNew(ALSeqFile *f, u8 *base) {
|
|
int i;
|
|
for (i = 0; i < f->seqCount; i++) {
|
|
PATCH(f->seqArray[i].offset, base, u8 *);
|
|
}
|
|
}
|
|
|
|
static void _bnkfPatchBank(ALInstrument *inst, ALBankFile *f, u8 *table) {
|
|
int i;
|
|
ALSound *sound;
|
|
ALWaveTable *wavetable;
|
|
u8 *table2;
|
|
|
|
if (inst->flags) {
|
|
return;
|
|
}
|
|
|
|
inst->flags = 1;
|
|
|
|
for (i = 0; i < inst->soundCount; i++) {
|
|
PATCH(inst->soundArray[i], f, ALSound *);
|
|
sound = inst->soundArray[i];
|
|
if (sound->flags) {
|
|
continue;
|
|
}
|
|
|
|
table2 = table;
|
|
|
|
sound->flags = 1;
|
|
PATCH(sound->envelope, f, ALEnvelope *);
|
|
PATCH(sound->keyMap, f, ALKeyMap *);
|
|
PATCH(sound->wavetable, f, ALWaveTable *);
|
|
wavetable = sound->wavetable;
|
|
if (wavetable->flags) {
|
|
continue;
|
|
}
|
|
|
|
wavetable->flags = 1;
|
|
PATCH(wavetable->base, table2, u8 *);
|
|
if (wavetable->type == 0) {
|
|
PATCH(wavetable->waveInfo.adpcmWave.book, f, ALADPCMBook *);
|
|
if (wavetable->waveInfo.adpcmWave.loop != NULL) {
|
|
PATCH(wavetable->waveInfo.adpcmWave.loop, f, ALADPCMloop *);
|
|
}
|
|
} else if (wavetable->type == 1) {
|
|
if (wavetable->waveInfo.rawWave.loop != NULL) {
|
|
PATCH(wavetable->waveInfo.rawWave.loop, f, ALRawLoop *);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Force adding another jr $ra. Has to be called or it doesn't get put in the
|
|
// right place.
|
|
static void unused(void) {
|
|
}
|
|
|
|
void alBnkfNew(ALBankFile *f, u8 *table) {
|
|
ALBank *bank;
|
|
int i;
|
|
int j;
|
|
unused();
|
|
if (f->revision != AL_BANK_VERSION) {
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < f->bankCount; i++) {
|
|
PATCH(f->bankArray[i], f, ALBank *);
|
|
if (f->bankArray[i] == NULL) {
|
|
continue;
|
|
}
|
|
|
|
bank = f->bankArray[i];
|
|
if (bank->flags == 0) {
|
|
bank->flags = 1;
|
|
if (bank->percussion != NULL) {
|
|
PATCH(bank->percussion, f, ALInstrument *);
|
|
_bnkfPatchBank(bank->percussion, f, table);
|
|
}
|
|
for (j = 0; j < bank->instCount; j++) {
|
|
PATCH(bank->instArray[j], f, ALInstrument *);
|
|
if (bank->instArray[j] != NULL) {
|
|
_bnkfPatchBank(bank->instArray[j], f, table);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|