2024-02-22 01:10:06 +03:00
|
|
|
#include "sys.h"
|
|
|
|
#include "sf64dma.h"
|
|
|
|
#include "sf64audio_provisional.h"
|
|
|
|
|
2024-03-01 21:57:44 +03:00
|
|
|
static char devstr00[] = "CAUTION:WAVE CACHE FULL %d";
|
|
|
|
static char D_800C4F6C[] = "SUPERDMA";
|
|
|
|
static char devstr02[] = "Bank Change... top %d lba %d\n";
|
|
|
|
static char devstr03[] = "BankCount %d\n";
|
|
|
|
static char devstr04[] = "BANK LOAD MISS! FOR %d\n";
|
|
|
|
static char devstr05[] = "BankCount %d\n";
|
|
|
|
static char devstr06[] = "Flush Start\n";
|
|
|
|
static char devstr07[] = "%d ->%d\n";
|
|
|
|
static char devstr08[] = "useflag %d\n";
|
|
|
|
static char devstr09[] = "BankCount %d\n";
|
|
|
|
static char devstr10[] = "%2x ";
|
|
|
|
static char devstr11[] = "StartSeq (Group %d,Seq %d) Process finish\n";
|
|
|
|
static char devstr12[] = "LoadCtrl, Ptr %x and Media is %d\n";
|
|
|
|
static char devstr13[] = "Load Bank, Type %d , ID %d\n";
|
|
|
|
static char devstr14[] = "get auto\n";
|
|
|
|
static char devstr15[] = "get s-auto %x\n";
|
|
|
|
static char devstr16[] = "Seq %d Write ID OK %d!\n";
|
|
|
|
static char devstr17[] = "Banknumber %d\n";
|
|
|
|
static char devstr18[] = "Bank Offset %x %d %d\n";
|
|
|
|
static char devstr19[] = "PEP Touch %x \n";
|
|
|
|
static char D_800C50E8[] = "FastCopy";
|
|
|
|
|
2024-04-05 23:11:36 +03:00
|
|
|
s32 D_80146D80;
|
|
|
|
s32 PAD_80146D88[2];
|
2024-03-01 21:57:44 +03:00
|
|
|
AudioSlowLoadBuffer gSlowLoads;
|
|
|
|
|
2024-04-05 23:11:36 +03:00
|
|
|
s32 AudioLoad_DiscardFont(s32 fontId);
|
|
|
|
void AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2);
|
|
|
|
void* AudioLoad_SyncLoadSeq(s32 seqId);
|
|
|
|
void* AudioLoad_SyncLoadFont(s32 fontId);
|
|
|
|
void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate);
|
|
|
|
s32 AudioLoad_GetLoadTableIndex(s32 tableType, u32 entryId);
|
|
|
|
void* AudioLoad_SearchCaches(s32 tableType, s32 id);
|
|
|
|
AudioTable* AudioLoad_GetLoadTable(s32 tableType);
|
|
|
|
void AudioLoad_SyncDma(u32 devAddr, u8* ramAddr, u32 size, s32 medium);
|
|
|
|
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
|
|
|
|
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
|
|
|
|
OSMesgQueue* retQueue, s32 medium, const char* dmaType);
|
|
|
|
s32 func_8000FC7C(u32 unkMediumParam, u32* addrPtr);
|
|
|
|
void func_8000FC8C(s32 unkParam2, u32 addr, u8* ramAddr, u32 size);
|
|
|
|
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
|
|
|
|
Sample* AudioLoad_GetFontSample(s32 fontId, s32 instId);
|
|
|
|
void AudioLoad_ProcessSlowLoads(s32 resetStatus);
|
|
|
|
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size);
|
|
|
|
void AudioLoad_DmaSlowCopyUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
|
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
|
|
|
|
OSMesgQueue* retQueue, u32 retMesg);
|
|
|
|
void AudioLoad_ProcessAsyncLoads(s32 resetStatus);
|
|
|
|
void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus);
|
|
|
|
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size);
|
|
|
|
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
|
|
|
|
void AudioLoad_RelocateSample(TunedSample* tSample, u32 fontDataAddr, SampleBankRelocInfo* relocInfo);
|
|
|
|
s32 AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, u32 fontDataAddr, SampleBankRelocInfo* relocData, s32 isAsync);
|
|
|
|
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus);
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_DecreaseSampleDmaTtls(void) {
|
|
|
|
SampleDma* dma;
|
|
|
|
u32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < gSampleDmaListSize1; i++) {
|
|
|
|
dma = &gSampleDmas[i];
|
|
|
|
if (dma->ttl != 0) {
|
|
|
|
dma->ttl--;
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
dma->reuseIndex = gSampleDmaReuseQueue1WrPos;
|
|
|
|
gSampleDmaReuseQueue1[gSampleDmaReuseQueue1WrPos] = i;
|
|
|
|
gSampleDmaReuseQueue1WrPos++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (i = gSampleDmaListSize1; i < gSampleDmaCount; i++) {
|
|
|
|
dma = &gSampleDmas[i];
|
|
|
|
if (dma->ttl != 0) {
|
|
|
|
dma->ttl--;
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
dma->reuseIndex = gSampleDmaReuseQueue2WrPos;
|
|
|
|
gSampleDmaReuseQueue2[gSampleDmaReuseQueue2WrPos] = i;
|
|
|
|
gSampleDmaReuseQueue2WrPos++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
D_80155A50 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, u32 arg2, u8* dmaIndexRef, s32 medium) {
|
|
|
|
u32 i;
|
|
|
|
SampleDma* dma;
|
|
|
|
bool hasDma = false;
|
|
|
|
s32 bufferPos;
|
|
|
|
u32 dmaDevAddr;
|
|
|
|
s32 sp38;
|
|
|
|
|
|
|
|
if ((arg2 != 0) || (*dmaIndexRef >= gSampleDmaListSize1)) {
|
|
|
|
for (i = gSampleDmaListSize1; i < gSampleDmaCount; i++) {
|
|
|
|
dma = &gSampleDmas[i];
|
|
|
|
bufferPos = devAddr - dma->devAddr;
|
|
|
|
if ((0 <= bufferPos) && (bufferPos <= (dma->size - size))) {
|
|
|
|
if ((dma->ttl == 0) && (gSampleDmaReuseQueue2RdPos != gSampleDmaReuseQueue2WrPos)) {
|
|
|
|
if (dma->reuseIndex != gSampleDmaReuseQueue2RdPos) {
|
|
|
|
gSampleDmaReuseQueue2[dma->reuseIndex] = gSampleDmaReuseQueue2[gSampleDmaReuseQueue2RdPos];
|
|
|
|
gSampleDmas[gSampleDmaReuseQueue2[gSampleDmaReuseQueue2RdPos]].reuseIndex = dma->reuseIndex;
|
|
|
|
}
|
|
|
|
gSampleDmaReuseQueue2RdPos++;
|
|
|
|
}
|
|
|
|
dma->ttl = 60;
|
|
|
|
*dmaIndexRef = i;
|
|
|
|
return &dma->ramAddr[devAddr - dma->devAddr];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((gSampleDmaReuseQueue2RdPos != gSampleDmaReuseQueue2WrPos) && (arg2 != 0)) {
|
|
|
|
sp38 = gSampleDmaReuseQueue2[gSampleDmaReuseQueue2RdPos];
|
|
|
|
gSampleDmaReuseQueue2RdPos++;
|
|
|
|
dma = &gSampleDmas[sp38];
|
|
|
|
hasDma = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
dma = &gSampleDmas[*dmaIndexRef];
|
|
|
|
for (i = 0; i < gSampleDmaListSize1; i++) {
|
|
|
|
bufferPos = devAddr - dma->devAddr;
|
|
|
|
if ((0 <= bufferPos) && (bufferPos <= (dma->size - size))) {
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
if (dma->reuseIndex != gSampleDmaReuseQueue1RdPos) {
|
|
|
|
gSampleDmaReuseQueue1[dma->reuseIndex] = gSampleDmaReuseQueue1[gSampleDmaReuseQueue1RdPos];
|
|
|
|
gSampleDmas[gSampleDmaReuseQueue1[gSampleDmaReuseQueue1RdPos]].reuseIndex = dma->reuseIndex;
|
|
|
|
}
|
|
|
|
if (1) {}
|
|
|
|
gSampleDmaReuseQueue1RdPos++;
|
|
|
|
}
|
|
|
|
dma->ttl = 2;
|
|
|
|
return &dma->ramAddr[devAddr - dma->devAddr];
|
|
|
|
}
|
|
|
|
dma = &gSampleDmas[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hasDma == 0) {
|
|
|
|
sp38 = gSampleDmaReuseQueue1[gSampleDmaReuseQueue1RdPos];
|
|
|
|
gSampleDmaReuseQueue1RdPos++;
|
|
|
|
dma = &gSampleDmas[sp38];
|
|
|
|
}
|
|
|
|
dmaDevAddr = devAddr & ~0xF;
|
|
|
|
dma->ttl = 2;
|
|
|
|
dma->devAddr = dmaDevAddr;
|
|
|
|
dma->sizeUnused = dma->size;
|
|
|
|
AudioLoad_Dma(&gCurAudioFrameDmaIoMsgBuf[gCurAudioFrameDmaCount++], 0, 0, dmaDevAddr, dma->ramAddr, dma->size,
|
|
|
|
&gCurAudioFrameDmaQueue, medium, D_800C4F6C);
|
|
|
|
*dmaIndexRef = sp38;
|
|
|
|
return devAddr - dmaDevAddr + dma->ramAddr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_InitSampleDmaBuffers(s32 numNotes) {
|
2024-02-22 01:10:06 +03:00
|
|
|
s32 i;
|
2024-02-24 04:56:08 +03:00
|
|
|
u8* dma;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
gSampleDmaBuffSize = 0x2D0;
|
|
|
|
for (i = 0; i < (3 * gNumNotes * gAudioBufferParams.specUnk4); i++) {
|
|
|
|
dma = AudioHeap_Alloc(&gMiscPool, gSampleDmaBuffSize);
|
|
|
|
gSampleDmas[gSampleDmaCount].ramAddr = dma;
|
|
|
|
if (dma == NULL) {
|
2024-02-22 01:10:06 +03:00
|
|
|
break;
|
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
gSampleDmas[gSampleDmaCount].devAddr = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].sizeUnused = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].unused = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].ttl = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].size = gSampleDmaBuffSize;
|
|
|
|
gSampleDmaCount++;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < gSampleDmaCount; i++) {
|
|
|
|
gSampleDmaReuseQueue1[i] = i;
|
|
|
|
gSampleDmas[i].reuseIndex = i;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = gSampleDmaCount; i < 0x100; i++) {
|
|
|
|
gSampleDmaReuseQueue1[i] = 0;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
gSampleDmaReuseQueue1RdPos = 0;
|
|
|
|
gSampleDmaReuseQueue1WrPos = gSampleDmaCount;
|
|
|
|
gSampleDmaListSize1 = gSampleDmaCount;
|
|
|
|
gSampleDmaBuffSize = 0x200;
|
|
|
|
for (i = 0; i < gNumNotes; i++) {
|
|
|
|
dma = AudioHeap_Alloc(&gMiscPool, gSampleDmaBuffSize);
|
|
|
|
gSampleDmas[gSampleDmaCount].ramAddr = dma;
|
|
|
|
if (dma == NULL) {
|
2024-02-22 01:10:06 +03:00
|
|
|
break;
|
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
gSampleDmas[gSampleDmaCount].devAddr = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].sizeUnused = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].unused = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].ttl = 0;
|
|
|
|
gSampleDmas[gSampleDmaCount].size = gSampleDmaBuffSize;
|
|
|
|
gSampleDmaCount++;
|
|
|
|
}
|
|
|
|
for (i = gSampleDmaListSize1; i < gSampleDmaCount; i++) {
|
|
|
|
gSampleDmaReuseQueue2[i - gSampleDmaListSize1] = i;
|
|
|
|
gSampleDmas[i].reuseIndex = i - gSampleDmaListSize1;
|
|
|
|
}
|
|
|
|
for (i = gSampleDmaCount; i < 0x100; i++) {
|
|
|
|
gSampleDmaReuseQueue2[i] = gSampleDmaListSize1;
|
|
|
|
}
|
|
|
|
gSampleDmaReuseQueue2RdPos = 0;
|
|
|
|
gSampleDmaReuseQueue2WrPos = gSampleDmaCount - gSampleDmaListSize1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_InitTable(AudioTable* table, u8* romAddr, u16 unkMediumParam) {
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
table->unkMediumParam = unkMediumParam;
|
|
|
|
table->romAddr = romAddr;
|
|
|
|
|
|
|
|
for (i = 0; i < table->numEntries; i++) {
|
2024-03-01 21:57:44 +03:00
|
|
|
if ((table->entries[i].size != 0) && (table->entries[i].medium == MEDIUM_CART)) {
|
2024-02-24 04:56:08 +03:00
|
|
|
table->entries[i].romAddr += (u32) romAddr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void* AudioLoad_SyncLoadSeqFonts(s32 seqId, u32* outFontId) {
|
|
|
|
s32 index = ((u16*) gSeqFontTable)[AudioLoad_GetLoadTableIndex(0, seqId)];
|
|
|
|
s32 fontId = 0xFF;
|
|
|
|
s32 numFonts = gSeqFontTable[index++];
|
|
|
|
void* soundFontData;
|
|
|
|
|
|
|
|
for (numFonts; numFonts > 0; numFonts--) {
|
|
|
|
fontId = gSeqFontTable[index++];
|
|
|
|
soundFontData = AudioLoad_SyncLoadFont(fontId);
|
|
|
|
}
|
|
|
|
*outFontId = fontId;
|
|
|
|
return soundFontData;
|
|
|
|
}
|
|
|
|
|
2024-03-06 01:51:52 +03:00
|
|
|
void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 flags) {
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 pad;
|
|
|
|
u32 fontId;
|
|
|
|
|
|
|
|
seqId = AudioLoad_GetLoadTableIndex(0, seqId);
|
2024-03-06 01:51:52 +03:00
|
|
|
if (flags & 2) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncLoadSeqFonts(seqId, &fontId);
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-03-06 01:51:52 +03:00
|
|
|
if (flags & 1) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncLoadSeq(seqId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 AudioLoad_SyncLoadSample(Sample* sample, s32 fontId) {
|
|
|
|
u8* sampleAddr;
|
|
|
|
|
|
|
|
if ((sample->isRelocated == 1) && (sample->medium != 0)) {
|
|
|
|
sampleAddr = AudioHeap_AllocPersistentSampleCache(sample->size, fontId, sample->sampleAddr, sample->medium);
|
|
|
|
if (sampleAddr == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
2024-03-01 21:57:44 +03:00
|
|
|
if (sample->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncDmaUnkMedium(sample->sampleAddr, sampleAddr, sample->size, gSampleBankTable->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_SyncDma(sample->sampleAddr, sampleAddr, sample->size, sample->medium);
|
|
|
|
}
|
2024-03-01 21:57:44 +03:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
sample->sampleAddr = sampleAddr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) {
|
|
|
|
Instrument* instrument;
|
|
|
|
Drum* drum;
|
|
|
|
|
|
|
|
if (instId < 0x7F) {
|
|
|
|
instrument = Audio_GetInstrument(fontId, instId);
|
|
|
|
if (instrument == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (instrument->normalRangeLo != 0) {
|
|
|
|
AudioLoad_SyncLoadSample(instrument->lowPitchTunedSample.sample, fontId);
|
|
|
|
}
|
|
|
|
AudioLoad_SyncLoadSample(instrument->normalPitchTunedSample.sample, fontId);
|
|
|
|
if (instrument->normalRangeHi != 0x7F) {
|
|
|
|
AudioLoad_SyncLoadSample(instrument->highPitchTunedSample.sample, fontId);
|
|
|
|
}
|
|
|
|
} else if (instId == 0x7F) {
|
|
|
|
drum = Audio_GetDrum(fontId, drumId);
|
|
|
|
if (drum == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
AudioLoad_SyncLoadSample(drum->tunedSample.sample, fontId);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-06 01:51:52 +03:00
|
|
|
void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 nChunks, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
if (AudioLoad_AsyncLoadInner(2, AudioLoad_GetLoadTableIndex(2, sampleBankId), nChunks, retData, retQueue) == NULL) {
|
2024-02-24 04:56:08 +03:00
|
|
|
osSendMesg(retQueue, NULL, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-06 01:51:52 +03:00
|
|
|
void AudioLoad_AsyncLoadSeq(s32 seqId, s32 nChunks, s32 retData, OSMesgQueue* retQueue) {
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 index = ((u16*) gSeqFontTable)[AudioLoad_GetLoadTableIndex(0, seqId)];
|
|
|
|
s32 fontsLeft = gSeqFontTable[index++];
|
|
|
|
|
|
|
|
for (fontsLeft; fontsLeft > 0; fontsLeft--) {
|
2024-03-06 01:51:52 +03:00
|
|
|
AudioLoad_AsyncLoadInner(1, AudioLoad_GetLoadTableIndex(1, gSeqFontTable[index++]), nChunks, retData, retQueue);
|
2024-02-24 04:56:08 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-06 01:51:52 +03:00
|
|
|
u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) {
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 index = ((u16*) gSeqFontTable)[AudioLoad_GetLoadTableIndex(0, seqId)];
|
|
|
|
|
|
|
|
*outNumFonts = gSeqFontTable[index++];
|
|
|
|
if (*outNumFonts == 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return &gSeqFontTable[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_DiscardSeqFonts(s32 seqId) {
|
|
|
|
s32 index = ((u16*) gSeqFontTable)[AudioLoad_GetLoadTableIndex(0, seqId)];
|
|
|
|
s32 numFonts = gSeqFontTable[index++];
|
|
|
|
u32 fontId;
|
|
|
|
|
|
|
|
while (numFonts > 0) {
|
|
|
|
numFonts--;
|
|
|
|
fontId = AudioLoad_GetLoadTableIndex(1, gSeqFontTable[index++]);
|
|
|
|
if (AudioHeap_SearchPermanentCache(1, fontId) == NULL) {
|
|
|
|
AudioLoad_DiscardFont(fontId);
|
|
|
|
if (gFontLoadStatus[fontId] != 5) {
|
|
|
|
if (1) {}
|
|
|
|
gFontLoadStatus[fontId] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 AudioLoad_DiscardFont(s32 fontId) {
|
|
|
|
AudioCache* cache = &gFontCache;
|
|
|
|
AudioTemporaryCache* tcache;
|
|
|
|
AudioPersistentCache* pcache;
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
tcache = &cache->temporary;
|
|
|
|
if (tcache->entries[0].id == fontId) {
|
|
|
|
tcache->entries[0].id = -1;
|
|
|
|
} else if (tcache->entries[1].id == fontId) {
|
|
|
|
tcache->entries[1].id = -1;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
pcache = &cache->persistent;
|
|
|
|
for (i = 0; i < pcache->numEntries; i++) {
|
|
|
|
if (pcache->entries[i].id == fontId) {
|
|
|
|
pcache->entries[i].id = -1;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioHeap_DiscardFont(fontId);
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2) {
|
|
|
|
AudioLoad_SyncInitSeqPlayerInternal(playerIdx, seqId, arg2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) {
|
|
|
|
s32 index;
|
|
|
|
s32 numFonts;
|
|
|
|
u8* seqData;
|
|
|
|
s32 fontId;
|
2024-02-22 01:10:06 +03:00
|
|
|
s32 i;
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
seqId = AudioLoad_GetLoadTableIndex(0, seqId);
|
|
|
|
func_800144E4(&gSeqPlayers[playerIdx]);
|
|
|
|
index = ((u16*) gSeqFontTable)[seqId];
|
|
|
|
numFonts = gSeqFontTable[index++];
|
|
|
|
fontId = 0xFF;
|
|
|
|
for (numFonts; numFonts > 0; numFonts--) {
|
|
|
|
fontId = gSeqFontTable[index++];
|
|
|
|
AudioLoad_SyncLoadFont(fontId);
|
|
|
|
}
|
|
|
|
seqData = AudioLoad_SyncLoadSeq(seqId);
|
|
|
|
func_80016804(playerIdx);
|
|
|
|
gSeqPlayers[playerIdx].seqId = seqId;
|
|
|
|
gSeqPlayers[playerIdx].defaultFont = fontId;
|
|
|
|
gSeqPlayers[playerIdx].enabled = true;
|
|
|
|
gSeqPlayers[playerIdx].seqData = seqData;
|
|
|
|
gSeqPlayers[playerIdx].scriptState.pc = seqData;
|
|
|
|
gSeqPlayers[playerIdx].scriptState.depth = 0;
|
|
|
|
gSeqPlayers[playerIdx].delay = 0;
|
|
|
|
gSeqPlayers[playerIdx].finished = false;
|
|
|
|
for (i = 0; i < 16; i++) {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void* AudioLoad_SyncLoadSeq(s32 seqId) {
|
|
|
|
s32 seqIdx = AudioLoad_GetLoadTableIndex(0, seqId);
|
|
|
|
s32 didAllocate;
|
|
|
|
|
|
|
|
return AudioLoad_SyncLoad(0, seqIdx, &didAllocate);
|
|
|
|
}
|
|
|
|
|
|
|
|
void* AudioLoad_SyncLoadSampleBank(u32 sampleBankId, s32* outMedium) {
|
|
|
|
void* ramAddr;
|
|
|
|
AudioTable* sampleBankTable = AudioLoad_GetLoadTable(2);
|
|
|
|
s32 cachePolicy;
|
|
|
|
s32 noLoad;
|
|
|
|
|
|
|
|
sampleBankId = AudioLoad_GetLoadTableIndex(2, sampleBankId);
|
|
|
|
ramAddr = AudioLoad_SearchCaches(2, sampleBankId);
|
|
|
|
if (ramAddr != NULL) {
|
|
|
|
if (gSampleFontLoadStatus[sampleBankId] != 5) {
|
|
|
|
gSampleFontLoadStatus[sampleBankId] = 2;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-03-01 21:57:44 +03:00
|
|
|
*outMedium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
return ramAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-24 04:56:08 +03:00
|
|
|
cachePolicy = sampleBankTable->entries[sampleBankId].cachePolicy;
|
|
|
|
if (cachePolicy == 4) {
|
|
|
|
*outMedium = sampleBankTable->entries[sampleBankId].medium;
|
|
|
|
return sampleBankTable->entries[sampleBankId].romAddr;
|
|
|
|
}
|
|
|
|
ramAddr = AudioLoad_SyncLoad(2, sampleBankId, &noLoad);
|
|
|
|
if (ramAddr != NULL) {
|
2024-03-01 21:57:44 +03:00
|
|
|
*outMedium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
*outMedium = sampleBankTable->entries[sampleBankId].medium;
|
|
|
|
return sampleBankTable->entries[sampleBankId].romAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void* AudioLoad_SyncLoadFont(s32 fontId) {
|
|
|
|
void* fontData;
|
|
|
|
s32 sampleBankId1;
|
|
|
|
u32 sampleBankId2;
|
|
|
|
s32 didAllocate;
|
|
|
|
SampleBankRelocInfo relocInfo;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
fontId = AudioLoad_GetLoadTableIndex(1, fontId);
|
|
|
|
sampleBankId1 = gSoundFontList[fontId].sampleBankId1;
|
|
|
|
sampleBankId2 = gSoundFontList[fontId].sampleBankId2;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
relocInfo.sampleBankId1 = sampleBankId1;
|
|
|
|
relocInfo.sampleBankId2 = sampleBankId2;
|
|
|
|
if (sampleBankId1 != 0xFF) {
|
|
|
|
relocInfo.baseAddr1 = AudioLoad_SyncLoadSampleBank(sampleBankId1, &relocInfo.medium1);
|
|
|
|
} else {
|
|
|
|
relocInfo.baseAddr1 = NULL;
|
|
|
|
}
|
|
|
|
if (sampleBankId2 != 0xFF) {
|
|
|
|
relocInfo.baseAddr2 = AudioLoad_SyncLoadSampleBank(sampleBankId2, &relocInfo.medium2);
|
|
|
|
} else {
|
|
|
|
relocInfo.baseAddr2 = NULL;
|
|
|
|
}
|
|
|
|
fontData = AudioLoad_SyncLoad(1, fontId, &didAllocate);
|
|
|
|
if (fontData == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (didAllocate == 1) {
|
|
|
|
AudioLoad_RelocateFontAndPreloadSamples(fontId, fontData, &relocInfo, 0);
|
|
|
|
}
|
|
|
|
return fontData;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) {
|
|
|
|
u32 size;
|
|
|
|
AudioTable* table;
|
|
|
|
u8* ramAddr;
|
|
|
|
u32 medium;
|
|
|
|
s32 loadStatus;
|
|
|
|
u32 romAddr;
|
|
|
|
s32 pad;
|
|
|
|
s32 cachePolicy;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
ramAddr = AudioLoad_SearchCaches(tableType, id);
|
|
|
|
if (ramAddr != NULL) {
|
|
|
|
loadStatus = 2;
|
|
|
|
*didAllocate = false;
|
|
|
|
} else {
|
|
|
|
table = AudioLoad_GetLoadTable(tableType);
|
|
|
|
size = table->entries[id].size;
|
|
|
|
size = ALIGN16(size);
|
|
|
|
medium = table->entries[id].medium;
|
|
|
|
cachePolicy = table->entries[id].cachePolicy;
|
|
|
|
romAddr = table->entries[id].romAddr;
|
|
|
|
switch (cachePolicy) {
|
|
|
|
case 0:
|
|
|
|
ramAddr = AudioHeap_AllocPermanent(tableType, id, size);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 1, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 0, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
case 4:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 2, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
*didAllocate = true;
|
2024-03-01 21:57:44 +03:00
|
|
|
if (medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncDmaUnkMedium(romAddr, ramAddr, size, table->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_SyncDma(romAddr, ramAddr, size, medium);
|
|
|
|
}
|
|
|
|
loadStatus = (cachePolicy == 0) ? 5 : 2;
|
|
|
|
}
|
|
|
|
switch (tableType) {
|
2024-03-01 21:57:44 +03:00
|
|
|
case SEQUENCE_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
if (gSeqLoadStatus[id] != 5) {
|
|
|
|
gSeqLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case FONT_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
if (gFontLoadStatus[id] != 5) {
|
|
|
|
gFontLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case SAMPLE_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
if (gSampleFontLoadStatus[id] != 5) {
|
|
|
|
gSampleFontLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ramAddr;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_GetLoadTableIndex(s32 tableType, u32 entryId) {
|
|
|
|
AudioTable* table = AudioLoad_GetLoadTable(tableType);
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
if (table->entries[entryId].size == 0) {
|
|
|
|
entryId = table->entries[entryId].romAddr;
|
|
|
|
}
|
|
|
|
return entryId;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void* AudioLoad_SearchCaches(s32 tableType, s32 id) {
|
|
|
|
void* ramAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
ramAddr = AudioHeap_SearchPermanentCache(tableType, id);
|
|
|
|
if (ramAddr != NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
ramAddr = AudioHeap_SearchCaches(tableType, 2, id);
|
|
|
|
if (ramAddr != NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
AudioTable* AudioLoad_GetLoadTable(s32 tableType) {
|
|
|
|
AudioTable* table;
|
|
|
|
|
|
|
|
switch (tableType) {
|
2024-03-01 21:57:44 +03:00
|
|
|
case SEQUENCE_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
table = gSequenceTable;
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case FONT_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
table = gSoundFontTable;
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case SAMPLE_TABLE:
|
2024-02-24 04:56:08 +03:00
|
|
|
table = gSampleBankTable;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
table = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return table;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_RelocateFont(s32 fontId, u32 fontBaseAddr, void* relocData) {
|
|
|
|
u32* fontDataPtrs = fontBaseAddr;
|
|
|
|
u32** drumDataPtrs = fontBaseAddr;
|
|
|
|
s32 numDrums;
|
|
|
|
Drum* drum;
|
|
|
|
Instrument* instrument;
|
|
|
|
u32 offset;
|
|
|
|
s32 i;
|
|
|
|
s32 numInstruments;
|
|
|
|
|
|
|
|
numDrums = gSoundFontList[fontId].numDrums;
|
|
|
|
numInstruments = gSoundFontList[fontId].numInstruments;
|
|
|
|
|
|
|
|
if ((fontDataPtrs[0] != 0) && (numDrums != 0)) {
|
|
|
|
fontDataPtrs[0] += fontBaseAddr;
|
|
|
|
|
|
|
|
for (i = 0; i < numDrums; i++) {
|
|
|
|
offset = (*drumDataPtrs)[i];
|
|
|
|
if (offset != 0) {
|
|
|
|
drum = offset += fontBaseAddr;
|
|
|
|
(*drumDataPtrs)[i] = drum;
|
|
|
|
// temp2;
|
|
|
|
if (!drum->isRelocated) {
|
|
|
|
AudioLoad_RelocateSample(&drum->tunedSample, fontBaseAddr, relocData);
|
|
|
|
offset = (u32) drum->envelope;
|
|
|
|
drum->envelope = offset + fontBaseAddr;
|
|
|
|
drum->isRelocated = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (i = 1; i <= numInstruments; i++) {
|
|
|
|
if (fontDataPtrs[i] != 0) {
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
fontDataPtrs[i] += fontBaseAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
instrument = fontDataPtrs[i];
|
|
|
|
if (instrument->isRelocated == 0) {
|
|
|
|
if (instrument->normalRangeLo != 0) {
|
|
|
|
AudioLoad_RelocateSample(&instrument->lowPitchTunedSample, fontBaseAddr, relocData);
|
|
|
|
}
|
|
|
|
AudioLoad_RelocateSample(&instrument->normalPitchTunedSample, fontBaseAddr, relocData);
|
|
|
|
if (instrument->normalRangeHi != 0x7F) {
|
|
|
|
AudioLoad_RelocateSample(&instrument->highPitchTunedSample, fontBaseAddr, relocData);
|
|
|
|
}
|
|
|
|
offset = (u32) instrument->envelope;
|
|
|
|
instrument->envelope = offset + fontBaseAddr;
|
|
|
|
instrument->isRelocated = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gSoundFontList[fontId].drums = fontDataPtrs[0];
|
|
|
|
gSoundFontList[fontId].instruments = (u32) &fontDataPtrs[1];
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char D_800C50F4[] = "FastCopy";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_SyncDma(u32 devAddr, u8* ramAddr, u32 size, s32 medium) {
|
|
|
|
size = ALIGN16(size);
|
|
|
|
osInvalDCache(ramAddr, size);
|
|
|
|
while (true) {
|
|
|
|
if (size < 0x400) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
AudioLoad_Dma(&gSyncDmaIoMsg, 1, 0, devAddr, ramAddr, 0x400, &gSyncDmaQueue, medium, D_800C50E8);
|
|
|
|
osRecvMesg(&gSyncDmaQueue, NULL, 1);
|
|
|
|
size -= 0x400;
|
|
|
|
devAddr += 0x400;
|
|
|
|
ramAddr += 0x400;
|
|
|
|
}
|
|
|
|
if (size != 0) {
|
|
|
|
AudioLoad_Dma(&gSyncDmaIoMsg, 1, 0, devAddr, ramAddr, size, &gSyncDmaQueue, medium, D_800C50F4);
|
|
|
|
osRecvMesg(&gSyncDmaQueue, NULL, 1);
|
|
|
|
}
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
|
|
|
|
s32 addr = devAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
osInvalDCache(ramAddr, size);
|
|
|
|
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr22[] = "Error: Cannot DMA Media [%d]\n";
|
|
|
|
static char devstr23[] = "Warning: size not align 16 %x (%s)\n";
|
|
|
|
static char devstr24[] = "Load Bank BG, Type %d , ID %d\n";
|
|
|
|
static char devstr25[] = "get auto\n";
|
|
|
|
static char devstr26[] = "get s-auto %x\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
|
|
|
|
OSMesgQueue* retQueue, s32 medium, const char* dmaType) {
|
|
|
|
OSPiHandle* handle;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-01 21:57:44 +03:00
|
|
|
switch (medium) {
|
|
|
|
case MEDIUM_CART:
|
2024-02-24 04:56:08 +03:00
|
|
|
handle = osCartRomInit();
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case MEDIUM_DISK_DRIVE:
|
2024-02-24 04:56:08 +03:00
|
|
|
handle = func_8001EE60();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
if (size & 0xF) {
|
|
|
|
size = ALIGN16(size);
|
|
|
|
}
|
|
|
|
mesg->hdr.pri = priority;
|
|
|
|
mesg->hdr.retQueue = retQueue;
|
|
|
|
mesg->dramAddr = ramAddr;
|
|
|
|
mesg->devAddr = devAddr;
|
|
|
|
mesg->size = size;
|
|
|
|
handle->transferInfo.cmdType = 2;
|
|
|
|
osEPiStartDma(handle, mesg, direction);
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
return 0;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 func_8000FC7C(u32 unkMediumParam, u32* addrPtr) {
|
|
|
|
return 0;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void func_8000FC8C(s32 unkParam2, u32 addr, u8* ramAddr, u32 size) {
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_SyncLoadSimple(u32 tableType, u32 id) {
|
|
|
|
s32 didAllocate;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncLoad(tableType, id, &didAllocate);
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
u32 size;
|
|
|
|
AudioTable* table;
|
|
|
|
u8* ramAddr;
|
|
|
|
s32 medium;
|
|
|
|
s32 cachePolicy;
|
|
|
|
u32 romAddr;
|
|
|
|
s32 loadStatus;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
switch (tableType) {
|
|
|
|
case 0:
|
|
|
|
if (gSeqLoadStatus[id] == 1) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (gFontLoadStatus[id] == 1) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (gSampleFontLoadStatus[id] == 1) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ramAddr = AudioLoad_SearchCaches(tableType, id);
|
|
|
|
if (ramAddr != NULL) {
|
|
|
|
loadStatus = 2;
|
|
|
|
osSendMesg(retQueue, (void*) (retData << 0x18), 0);
|
|
|
|
} else {
|
|
|
|
table = AudioLoad_GetLoadTable(tableType);
|
|
|
|
size = table->entries[id].size;
|
|
|
|
size = ALIGN16(size);
|
|
|
|
medium = table->entries[id].medium;
|
|
|
|
cachePolicy = table->entries[id].cachePolicy;
|
|
|
|
romAddr = table->entries[id].romAddr;
|
|
|
|
loadStatus = 2;
|
|
|
|
switch (cachePolicy) {
|
|
|
|
case 0:
|
|
|
|
ramAddr = AudioHeap_AllocPermanent(tableType, id, size);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
loadStatus = 5;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 1, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 0, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
case 4:
|
|
|
|
ramAddr = AudioHeap_AllocCached(tableType, size, 2, id);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
return ramAddr;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
AudioLoad_StartAsyncLoad(romAddr, ramAddr, size, medium, nChunks, retQueue,
|
|
|
|
(retData << 0x18) | (tableType << 0x10) | (id << 8) | loadStatus);
|
|
|
|
loadStatus = 1;
|
|
|
|
}
|
|
|
|
switch (tableType) {
|
|
|
|
case 0:
|
|
|
|
if (gSeqLoadStatus[id] != 5) {
|
|
|
|
gSeqLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (gFontLoadStatus[id] != 5) {
|
|
|
|
gFontLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (gSampleFontLoadStatus[id] != 5) {
|
|
|
|
gSampleFontLoadStatus[id] = loadStatus;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
return ramAddr;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_ProcessLoads(s32 resetStatus) {
|
|
|
|
AudioLoad_ProcessSlowLoads(resetStatus);
|
|
|
|
AudioLoad_ProcessSamplePreloads(resetStatus);
|
|
|
|
AudioLoad_ProcessAsyncLoads(resetStatus);
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr27[] = "Clear Workarea %x -%x size %x \n";
|
|
|
|
static char devstr28[] = "AudioHeap is %x\n";
|
|
|
|
static char devstr29[] = "Heap reset.Synth Change %x \n";
|
|
|
|
static char devstr30[] = "Heap %x %x %x\n";
|
|
|
|
static char devstr31[] = "Main Heap Initialize.\n";
|
|
|
|
static char devstr32[] = "%d :WaveA %d WaveB %d Inst %d,Perc %d\n";
|
|
|
|
static char devstr33[] = "---------- Init Completed. ------------\n";
|
|
|
|
static char devstr34[] = " Syndrv :[%6d]\n";
|
|
|
|
static char devstr35[] = " Seqdrv :[%6d]\n";
|
|
|
|
static char devstr36[] = " audiodata :[%6d]\n";
|
|
|
|
static char devstr37[] = "---------------------------------------\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_Init(void) {
|
|
|
|
s32 pad[14];
|
2024-02-22 01:10:06 +03:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 numFonts;
|
|
|
|
s32 dwordsLeft;
|
|
|
|
u64* clearContext;
|
|
|
|
void* ramAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
gResetTimer = 0;
|
2024-02-22 01:10:31 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < gAudioHeapSize / 8; i++) {
|
|
|
|
((u64*) gAudioHeap)[i] = 0;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
2024-02-22 01:10:31 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
clearContext = gAudioContextStart;
|
|
|
|
dwordsLeft = ((u32) gAudioContextEnd - (u32) gAudioContextStart) / 8;
|
|
|
|
for (; dwordsLeft >= 0; dwordsLeft--) {
|
|
|
|
*clearContext++ = 0;
|
2024-02-22 01:10:06 +03:00
|
|
|
}
|
|
|
|
switch (osTvType) {
|
2024-03-06 01:51:52 +03:00
|
|
|
case OS_TV_PAL:
|
2024-02-24 04:56:08 +03:00
|
|
|
gMaxTempoTvTypeFactors = 20.03042f;
|
2024-03-06 01:51:52 +03:00
|
|
|
gRefreshRate = 50;
|
2024-02-22 01:10:06 +03:00
|
|
|
break;
|
2024-03-06 01:51:52 +03:00
|
|
|
case OS_TV_MPAL:
|
2024-02-24 04:56:08 +03:00
|
|
|
gMaxTempoTvTypeFactors = 16.546f;
|
2024-03-06 01:51:52 +03:00
|
|
|
gRefreshRate = 60;
|
2024-02-22 01:10:06 +03:00
|
|
|
break;
|
|
|
|
default:
|
2024-03-06 01:51:52 +03:00
|
|
|
case OS_TV_NTSC:
|
2024-02-24 04:56:08 +03:00
|
|
|
gMaxTempoTvTypeFactors = 16.713f;
|
2024-03-06 01:51:52 +03:00
|
|
|
gRefreshRate = 60;
|
2024-02-22 01:10:06 +03:00
|
|
|
break;
|
|
|
|
}
|
2024-03-06 01:51:52 +03:00
|
|
|
AudioThread_Init();
|
2024-02-22 01:10:31 +03:00
|
|
|
for (i = 0; i < 3; i++) {
|
2024-02-24 04:56:08 +03:00
|
|
|
gAiBuffLengths[i] = 0xA0;
|
|
|
|
}
|
|
|
|
gAudioTaskCountQ = 0;
|
|
|
|
gAudioTaskIndexQ = 0;
|
|
|
|
gCurAiBuffIndex = 0;
|
2024-03-17 07:06:28 +03:00
|
|
|
gAudioSoundMode = SOUNDMODE_STEREO;
|
2024-02-24 04:56:08 +03:00
|
|
|
gAudioCurTask = NULL;
|
|
|
|
gAudioRspTasks[0].task.t.data_size = 0;
|
|
|
|
gAudioRspTasks[1].task.t.data_size = 0;
|
|
|
|
osCreateMesgQueue(&gSyncDmaQueue, gSyncDmaMsg, 1);
|
|
|
|
osCreateMesgQueue(&gCurAudioFrameDmaQueue, gCurAudioFrameDmaMsg, 64);
|
|
|
|
osCreateMesgQueue(&gExternalLoadQueue, gExternalLoadMsg, 16);
|
|
|
|
osCreateMesgQueue(&gPreloadSampleQueue, gPreloadSampleMsg, 16);
|
|
|
|
gCurAudioFrameDmaCount = 0;
|
|
|
|
gSampleDmaCount = 0;
|
|
|
|
AudioHeap_InitMainPools(gInitPoolSize);
|
2024-02-22 01:10:31 +03:00
|
|
|
for (i = 0; i < 3; i++) {
|
2024-04-05 23:11:36 +03:00
|
|
|
gAiBuffers[i] = AudioHeap_Alloc(&gInitPool, AIBUF_SIZE);
|
|
|
|
for (j = 0; j < AIBUF_LEN; j++) {
|
2024-02-24 04:56:08 +03:00
|
|
|
gAiBuffers[i][j] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gAudioSpecId = 0;
|
|
|
|
gResetStatus = 1;
|
|
|
|
AudioHeap_ResetStep();
|
|
|
|
gSequenceTable = &gSeqTableInit;
|
|
|
|
gSoundFontTable = &gSoundFontTableInit;
|
|
|
|
gSampleBankTable = &gSampleBankTableInit;
|
|
|
|
gSeqFontTable = gSeqFontTableInit;
|
|
|
|
gNumSequences = gSequenceTable->numEntries;
|
|
|
|
AudioLoad_InitTable(gSequenceTable, SEGMENT_ROM_START(audio_seq), gSequenceMedium);
|
|
|
|
AudioLoad_InitTable(gSoundFontTable, SEGMENT_ROM_START(audio_bank), gSoundFontMedium);
|
|
|
|
AudioLoad_InitTable(gSampleBankTable, SEGMENT_ROM_START(audio_table), gSampleBankMedium);
|
|
|
|
numFonts = gSoundFontTable->numEntries;
|
|
|
|
gSoundFontList = AudioHeap_Alloc(&gInitPool, numFonts * sizeof(SoundFont));
|
|
|
|
for (i = 0; i < numFonts; i++) {
|
|
|
|
gSoundFontList[i].sampleBankId1 = (gSoundFontTable->entries[i].shortData1 >> 8) & 0xFF;
|
|
|
|
gSoundFontList[i].sampleBankId2 = gSoundFontTable->entries[i].shortData1 & 0xFF;
|
|
|
|
gSoundFontList[i].numInstruments = (gSoundFontTable->entries[i].shortData2 >> 8) & 0xFF;
|
|
|
|
gSoundFontList[i].numDrums = gSoundFontTable->entries[i].shortData2 & 0xFF;
|
|
|
|
}
|
|
|
|
ramAddr = AudioHeap_Alloc(&gInitPool, gPermanentPoolSize);
|
|
|
|
if (ramAddr == NULL) {
|
|
|
|
gPermanentPoolSize = 0;
|
|
|
|
}
|
|
|
|
AudioHeap_InitPool(&gPermanentPool.pool, ramAddr, gPermanentPoolSize);
|
2024-02-22 01:10:06 +03:00
|
|
|
func_800168BC();
|
|
|
|
}
|
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr38[] = "Entry--- %d %d\n";
|
|
|
|
static char devstr39[] = "---Block LPS here\n";
|
|
|
|
static char devstr40[] = "===Block LPS end\n";
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_SlowLoadSample(s32 fontId, u8 instId, s8* status) {
|
|
|
|
Sample* sample;
|
|
|
|
AudioSlowLoad* slowLoad;
|
|
|
|
|
|
|
|
sample = AudioLoad_GetFontSample(fontId, instId);
|
|
|
|
if (sample == NULL) {
|
|
|
|
*status = 0;
|
|
|
|
return -1;
|
|
|
|
}
|
2024-03-01 21:57:44 +03:00
|
|
|
if (sample->medium == MEDIUM_RAM) {
|
2024-02-24 04:56:08 +03:00
|
|
|
*status = 2;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
slowLoad = &gSlowLoads.slowLoad[gSlowLoads.unk_00];
|
|
|
|
if (slowLoad->state == 3) {
|
|
|
|
slowLoad->state = 0;
|
|
|
|
}
|
|
|
|
slowLoad->sample = *sample;
|
|
|
|
slowLoad->status = status;
|
|
|
|
slowLoad->curRamAddr =
|
|
|
|
AudioHeap_AllocTemporarySampleCache(sample->size, fontId, sample->sampleAddr, sample->medium);
|
|
|
|
if (slowLoad->curRamAddr == NULL) {
|
2024-03-01 21:57:44 +03:00
|
|
|
if ((sample->medium == MEDIUM_UNK) || (sample->codec == 2)) {
|
2024-02-24 04:56:08 +03:00
|
|
|
*status = 0;
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
*status = 3;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
slowLoad->state = 1;
|
|
|
|
slowLoad->bytesRemaining = ALIGN16(sample->size);
|
|
|
|
slowLoad->ramAddr = slowLoad->curRamAddr;
|
|
|
|
slowLoad->curDevAddr = sample->sampleAddr;
|
|
|
|
slowLoad->medium = sample->medium;
|
|
|
|
slowLoad->seqOrFontId = fontId;
|
|
|
|
slowLoad->instId = instId;
|
|
|
|
gSlowLoads.unk_00 ^= 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Sample* AudioLoad_GetFontSample(s32 fontId, s32 instId) {
|
|
|
|
Sample* sample;
|
|
|
|
Drum* drum;
|
|
|
|
Instrument* instrument;
|
|
|
|
|
|
|
|
if (instId < 0x80) {
|
|
|
|
instrument = Audio_GetInstrument(fontId, instId);
|
|
|
|
if (instrument == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
sample = instrument->normalPitchTunedSample.sample;
|
|
|
|
} else {
|
|
|
|
drum = Audio_GetDrum(fontId, instId - 0x80);
|
|
|
|
if (drum == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
sample = drum->tunedSample.sample;
|
|
|
|
}
|
|
|
|
return sample;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_Stub_10800(void) {
|
|
|
|
}
|
|
|
|
|
2024-03-01 21:57:44 +03:00
|
|
|
void AudioLoad_FinishSlowLoad(AudioSlowLoad* slowLoad) {
|
|
|
|
Sample* sample = AudioLoad_GetFontSample(slowLoad->seqOrFontId, slowLoad->instId);
|
2024-02-24 04:56:08 +03:00
|
|
|
|
|
|
|
if (sample != NULL) {
|
2024-03-01 21:57:44 +03:00
|
|
|
slowLoad->sample = *sample;
|
|
|
|
sample->sampleAddr = slowLoad->ramAddr;
|
|
|
|
sample->medium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_ProcessSlowLoads(s32 resetStatus) {
|
|
|
|
AudioTable* sampleBankTable = gSampleBankTable;
|
|
|
|
AudioSlowLoad* slowLoad;
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
|
slowLoad = &gSlowLoads.slowLoad[i];
|
|
|
|
switch (slowLoad->state) {
|
|
|
|
case 2:
|
|
|
|
osRecvMesg(&slowLoad->msgQueue, NULL, 1);
|
|
|
|
if (resetStatus != 0) {
|
|
|
|
slowLoad->state = 3;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 1:
|
|
|
|
slowLoad->state = 2;
|
|
|
|
if (slowLoad->bytesRemaining == 0) {
|
|
|
|
AudioLoad_FinishSlowLoad(&gSlowLoads.slowLoad[i]);
|
|
|
|
slowLoad->state = 3;
|
|
|
|
*slowLoad->status = 1;
|
|
|
|
} else if (slowLoad->bytesRemaining < 0x1000) {
|
2024-03-01 21:57:44 +03:00
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr,
|
|
|
|
slowLoad->bytesRemaining, sampleBankTable->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_DmaSlowCopy(&gSlowLoads.slowLoad[i], slowLoad->bytesRemaining);
|
|
|
|
}
|
|
|
|
slowLoad->bytesRemaining = 0;
|
|
|
|
} else {
|
2024-03-01 21:57:44 +03:00
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, 0x1000,
|
|
|
|
sampleBankTable->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_DmaSlowCopy(&gSlowLoads.slowLoad[i], 0x1000);
|
|
|
|
}
|
|
|
|
slowLoad->bytesRemaining -= 0x1000;
|
|
|
|
slowLoad->curRamAddr += 0x1000;
|
|
|
|
slowLoad->curDevAddr += 0x1000;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char D_800C52F4[] = "SLOWCOPY";
|
|
|
|
static char devstr42[] = "Req: Src %x Dest %x Len %x,media %d,retcode %d\n";
|
|
|
|
static char devstr43[] = "Remain Size %d\n";
|
|
|
|
static char devstr44[] = "---Block BG here\n";
|
|
|
|
static char devstr45[] = "===Block BG end\n";
|
|
|
|
static char devstr46[] = "Retcode %x\n";
|
|
|
|
static char devstr47[] = "Other Type: Not Write ID.\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size) {
|
|
|
|
osInvalDCache(slowLoad->curRamAddr, size);
|
|
|
|
osCreateMesgQueue(&slowLoad->msgQueue, &slowLoad->msg, 1);
|
|
|
|
AudioLoad_Dma(&slowLoad->ioMesg, 0, 0, slowLoad->curDevAddr, slowLoad->curRamAddr, size, &slowLoad->msgQueue,
|
|
|
|
slowLoad->medium, D_800C52F4);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_DmaSlowCopyUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
|
|
|
|
s32 addr = devAddr;
|
|
|
|
|
|
|
|
osInvalDCache(ramAddr, size);
|
|
|
|
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
|
|
|
|
}
|
|
|
|
|
2024-04-03 05:38:21 +03:00
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
|
2024-02-24 04:56:08 +03:00
|
|
|
OSMesgQueue* retQueue, u32 retMesg) {
|
|
|
|
AudioAsyncLoad* asyncLoad;
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) {
|
|
|
|
if (gAsyncLoads[i].status == 0) {
|
|
|
|
asyncLoad = &gAsyncLoads[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i == 16) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
asyncLoad->status = 1;
|
|
|
|
asyncLoad->curDevAddr = devAddr;
|
|
|
|
asyncLoad->ramAddr = ramAddr;
|
|
|
|
asyncLoad->curRamAddr = ramAddr;
|
|
|
|
asyncLoad->bytesRemaining = size;
|
|
|
|
|
|
|
|
if (nChunks == 0) {
|
|
|
|
asyncLoad->chunkSize = 0x1000;
|
|
|
|
} else {
|
2024-04-03 05:38:21 +03:00
|
|
|
asyncLoad->chunkSize = ALIGN256((s32) size / nChunks);
|
2024-02-24 04:56:08 +03:00
|
|
|
if (asyncLoad->chunkSize < 0x100) {
|
|
|
|
asyncLoad->chunkSize = 0x100;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
asyncLoad->retQueue = retQueue;
|
|
|
|
|
|
|
|
asyncLoad->delay = 3;
|
|
|
|
asyncLoad->medium = medium;
|
|
|
|
asyncLoad->retMsg = retMesg;
|
|
|
|
|
|
|
|
osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1);
|
|
|
|
return asyncLoad;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_ProcessAsyncLoads(s32 resetStatus) {
|
|
|
|
s32 i;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < 16; i++) {
|
|
|
|
if (gAsyncLoads[i].status == 1) {
|
|
|
|
AudioLoad_ProcessAsyncLoad(&gAsyncLoads[i], resetStatus);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus) {
|
|
|
|
AudioTable* sp5C;
|
|
|
|
s32 pad1;
|
|
|
|
s32 pad2;
|
|
|
|
u32 temp;
|
|
|
|
s32 sp24;
|
|
|
|
s32 sp48;
|
|
|
|
s32 sp44;
|
|
|
|
SampleBankRelocInfo sp2C;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
sp5C = gSampleBankTable;
|
|
|
|
if (asyncLoad->delay > 1) {
|
|
|
|
asyncLoad->delay--;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (asyncLoad->delay == 1) {
|
|
|
|
asyncLoad->delay = 0;
|
|
|
|
} else {
|
|
|
|
if (resetStatus != 0) {
|
|
|
|
osRecvMesg(&asyncLoad->msgQueue, NULL, 1);
|
|
|
|
asyncLoad->status = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (osRecvMesg(&asyncLoad->msgQueue, NULL, 0) == -1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (asyncLoad->bytesRemaining == 0) {
|
|
|
|
temp = asyncLoad->retMsg;
|
|
|
|
pad1 = (temp >> 0x10) & 0xFF;
|
|
|
|
sp24 = (temp >> 8) & 0xFF;
|
|
|
|
pad2 = temp & 0xFF;
|
|
|
|
switch (pad1) {
|
|
|
|
case 0:
|
|
|
|
if (gSeqLoadStatus[sp24] != 5) {
|
|
|
|
gSeqLoadStatus[sp24] = pad2;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (gSampleFontLoadStatus[sp24] != 5) {
|
|
|
|
gSampleFontLoadStatus[sp24] = pad2;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (gFontLoadStatus[sp24] != 5) {
|
|
|
|
gFontLoadStatus[sp24] = pad2;
|
|
|
|
}
|
|
|
|
sp48 = gSoundFontList[sp24].sampleBankId1;
|
|
|
|
sp44 = gSoundFontList[sp24].sampleBankId2;
|
|
|
|
sp2C.sampleBankId1 = sp48;
|
|
|
|
sp2C.sampleBankId2 = sp44;
|
|
|
|
if (sp48 != 0xFF) {
|
|
|
|
sp2C.baseAddr1 = AudioLoad_SyncLoadSampleBank(sp48, &sp2C.medium1);
|
|
|
|
} else {
|
|
|
|
sp2C.baseAddr1 = NULL;
|
|
|
|
}
|
|
|
|
if (sp44 != 0xFF) {
|
|
|
|
sp2C.baseAddr2 = AudioLoad_SyncLoadSampleBank(sp44, &sp2C.medium2);
|
|
|
|
} else {
|
|
|
|
sp2C.baseAddr2 = NULL;
|
|
|
|
}
|
|
|
|
AudioLoad_RelocateFontAndPreloadSamples(sp24, asyncLoad->ramAddr, &sp2C, 1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
asyncLoad->status = 0;
|
|
|
|
osSendMesg(asyncLoad->retQueue, asyncLoad->retMsg, 0);
|
|
|
|
} else {
|
|
|
|
if (asyncLoad->bytesRemaining < asyncLoad->chunkSize) {
|
2024-03-01 21:57:44 +03:00
|
|
|
if (asyncLoad->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->bytesRemaining,
|
|
|
|
sp5C->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_AsyncDma(asyncLoad, asyncLoad->bytesRemaining);
|
|
|
|
}
|
|
|
|
asyncLoad->bytesRemaining = 0;
|
|
|
|
} else {
|
2024-03-01 21:57:44 +03:00
|
|
|
if (asyncLoad->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->chunkSize,
|
|
|
|
sp5C->unkMediumParam);
|
|
|
|
} else {
|
|
|
|
AudioLoad_AsyncDma(asyncLoad, asyncLoad->chunkSize);
|
|
|
|
}
|
|
|
|
asyncLoad->bytesRemaining -= asyncLoad->chunkSize;
|
|
|
|
asyncLoad->curDevAddr += asyncLoad->chunkSize;
|
|
|
|
asyncLoad->curRamAddr += asyncLoad->chunkSize;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr48[] = "BGLOAD:Error: dma length 0\n";
|
|
|
|
static char D_800C53AC[] = "BGCOPY";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size) {
|
|
|
|
size = ALIGN16(size);
|
|
|
|
osInvalDCache(asyncLoad->curRamAddr, size);
|
|
|
|
osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1);
|
|
|
|
if (size) {}
|
|
|
|
AudioLoad_Dma(&asyncLoad->ioMesg, 0, 0, asyncLoad->curDevAddr, asyncLoad->curRamAddr, size, &asyncLoad->msgQueue,
|
|
|
|
asyncLoad->medium, D_800C53AC);
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
|
|
|
|
s32 addr = devAddr;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
osInvalDCache(ramAddr, size);
|
|
|
|
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr50[] = "Error: Already wavetable is touched %x.\n";
|
|
|
|
static char devstr51[] = "Touch Warning: Length zero %x\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
void AudioLoad_RelocateSample(TunedSample* tSample, u32 fontDataAddr, SampleBankRelocInfo* relocInfo) {
|
|
|
|
void* reloc;
|
|
|
|
Sample* sample;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
// "Error: Already wavetable is touched %x.\n";
|
2024-04-05 23:11:36 +03:00
|
|
|
if ((u32) tSample->sample <= AUDIO_RELOCATED_ADDRESS_START) {
|
2024-02-24 04:56:08 +03:00
|
|
|
sample = tSample->sample = reloc = (u32) tSample->sample + fontDataAddr;
|
2024-03-27 23:06:28 +03:00
|
|
|
// "Touch Warning: Length zero %x\n";
|
2024-02-24 04:56:08 +03:00
|
|
|
if ((sample->size != 0) && (sample->isRelocated != 1)) {
|
|
|
|
sample->loop = reloc = (u32) sample->loop + fontDataAddr;
|
|
|
|
sample->book = reloc = (u32) sample->book + fontDataAddr;
|
|
|
|
switch (sample->medium) { /* irregular */
|
2024-03-01 21:57:44 +03:00
|
|
|
case MEDIUM_RAM:
|
2024-02-24 04:56:08 +03:00
|
|
|
sample->sampleAddr = reloc = sample->sampleAddr + relocInfo->baseAddr1;
|
|
|
|
sample->medium = relocInfo->medium1;
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case MEDIUM_UNK:
|
2024-02-24 04:56:08 +03:00
|
|
|
sample->sampleAddr = reloc = sample->sampleAddr + relocInfo->baseAddr2;
|
|
|
|
sample->medium = relocInfo->medium2;
|
|
|
|
break;
|
2024-03-01 21:57:44 +03:00
|
|
|
case MEDIUM_CART:
|
|
|
|
case MEDIUM_DISK_DRIVE:
|
2024-02-24 04:56:08 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
sample->isRelocated = true;
|
|
|
|
if (sample->unk_bit26 && (sample->medium != 0)) {
|
|
|
|
gUsedSamples[gNumUsedSamples++] = sample;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr52[] = "It's busy now!!!!! %d\n";
|
|
|
|
static char devstr53[] = "BG LOAD BUFFER is OVER.\n";
|
|
|
|
static char devstr54[] = "Warning: Length zero %x\n";
|
|
|
|
static char devstr55[] = "Wave Load %d \n";
|
|
|
|
static char devstr56[] = "Total Bg Wave Load %d \n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, u32 fontDataAddr, SampleBankRelocInfo* relocData, s32 isAsync) {
|
|
|
|
s32 i;
|
|
|
|
Sample* sample;
|
|
|
|
u8* sampleRamAddr;
|
|
|
|
s32 size;
|
|
|
|
s32 pad;
|
|
|
|
u32 nChunks;
|
|
|
|
s32 inProgress;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
inProgress = false;
|
|
|
|
if (gPreloadSampleStackTop != 0) {
|
|
|
|
inProgress = true;
|
|
|
|
} else {
|
|
|
|
D_80146D80 = 0;
|
|
|
|
}
|
|
|
|
gNumUsedSamples = 0;
|
|
|
|
AudioLoad_RelocateFont(fontId, fontDataAddr, relocData);
|
|
|
|
size = 0;
|
|
|
|
for (i = 0; i < gNumUsedSamples; i++) {
|
|
|
|
size += ALIGN16(gUsedSamples[i]->size);
|
|
|
|
}
|
2024-04-03 05:38:21 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < gNumUsedSamples; i++) {
|
|
|
|
if (gPreloadSampleStackTop == 120) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
sample = gUsedSamples[i];
|
2024-04-16 02:38:19 +03:00
|
|
|
#ifdef AVOID_UB
|
|
|
|
sampleRamAddr = NULL;
|
|
|
|
#endif
|
2024-02-24 04:56:08 +03:00
|
|
|
//! Bug: Those are assignments, not equality checks.
|
|
|
|
switch (isAsync) {
|
|
|
|
case 0:
|
|
|
|
if (sample->medium = relocData->medium1) {
|
|
|
|
sampleRamAddr = AudioHeap_AllocPersistentSampleCache(sample->size, relocData->sampleBankId1,
|
|
|
|
sample->sampleAddr, sample->medium);
|
|
|
|
} else if (sample->medium = relocData->medium2) {
|
|
|
|
sampleRamAddr = AudioHeap_AllocPersistentSampleCache(sample->size, relocData->sampleBankId2,
|
|
|
|
sample->sampleAddr, sample->medium);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (sample->medium = relocData->medium1) {
|
|
|
|
sampleRamAddr = AudioHeap_AllocTemporarySampleCache(sample->size, relocData->sampleBankId1,
|
|
|
|
sample->sampleAddr, sample->medium);
|
|
|
|
} else if (sample->medium = relocData->medium2) {
|
|
|
|
sampleRamAddr = AudioHeap_AllocTemporarySampleCache(sample->size, relocData->sampleBankId2,
|
|
|
|
sample->sampleAddr, sample->medium);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (sampleRamAddr == NULL) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
switch (isAsync) {
|
|
|
|
case 0:
|
2024-03-01 21:57:44 +03:00
|
|
|
if (sample->medium == MEDIUM_UNK) {
|
2024-02-24 04:56:08 +03:00
|
|
|
AudioLoad_SyncDmaUnkMedium(sample->sampleAddr, sampleRamAddr, sample->size,
|
|
|
|
gSampleBankTable->unkMediumParam);
|
|
|
|
sample->sampleAddr = sampleRamAddr;
|
2024-03-01 21:57:44 +03:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
} else {
|
|
|
|
AudioLoad_SyncDma(sample->sampleAddr, sampleRamAddr, sample->size, sample->medium);
|
|
|
|
sample->sampleAddr = sampleRamAddr;
|
2024-03-01 21:57:44 +03:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
2024-04-03 05:38:21 +03:00
|
|
|
size = gPreloadSampleStackTop;
|
|
|
|
gPreloadSampleStack[size].sample = sample;
|
|
|
|
gPreloadSampleStack[size].ramAddr = sampleRamAddr;
|
|
|
|
gPreloadSampleStack[size].encodedInfo = (size << 24) | 0xFFFFFF;
|
|
|
|
gPreloadSampleStack[size].isFree = 0;
|
|
|
|
gPreloadSampleStack[size].endAndMediumKey =
|
|
|
|
(uintptr_t) sample->sampleAddr + sample->size + sample->medium;
|
2024-02-24 04:56:08 +03:00
|
|
|
gPreloadSampleStackTop++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gNumUsedSamples = 0;
|
2024-03-27 23:06:28 +03:00
|
|
|
if ((gPreloadSampleStackTop != 0) && !inProgress) {
|
2024-02-24 04:56:08 +03:00
|
|
|
sample = gPreloadSampleStack[gPreloadSampleStackTop - 1].sample;
|
|
|
|
nChunks = (sample->size / 0x1000) + 1;
|
|
|
|
AudioLoad_StartAsyncLoad(sample->sampleAddr, gPreloadSampleStack[gPreloadSampleStackTop - 1].ramAddr,
|
|
|
|
sample->size, sample->medium, nChunks, &gPreloadSampleQueue,
|
|
|
|
gPreloadSampleStack[gPreloadSampleStackTop - 1].encodedInfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
// static char devstr55[] = "Wave Load %d \n";
|
|
|
|
// static char devstr56[] = "Total Bg Wave Load %d \n";
|
|
|
|
// static char devstr57[] = "Receive %d\n";
|
|
|
|
|
|
|
|
static char devstr57[] = "Receive %d\n";
|
|
|
|
static char devstr58[] = "============Error: Magic is Broken after loading.\n";
|
|
|
|
static char devstr59[] = "Remain DMA: %d\n";
|
|
|
|
static char devstr60[] = "N start %d\n";
|
|
|
|
static char devstr61[] = "============Error: Magic is Broken: %x\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus) {
|
|
|
|
Sample* sample;
|
|
|
|
u32 preloadIndex;
|
|
|
|
u32 key;
|
|
|
|
s32 sampleAddr;
|
|
|
|
u32 size;
|
|
|
|
s32 nChunks;
|
|
|
|
|
|
|
|
if (gPreloadSampleStackTop > 0) {
|
|
|
|
if (resetStatus != 0) {
|
|
|
|
if (osRecvMesg(&gPreloadSampleQueue, (OSMesg) &preloadIndex, 0)) {}
|
|
|
|
gPreloadSampleStackTop = 0;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (osRecvMesg(&gPreloadSampleQueue, (OSMesg) &preloadIndex, 0) == -1) {
|
|
|
|
return false;
|
|
|
|
}
|
2024-03-27 23:06:28 +03:00
|
|
|
// "Receive %d\n"
|
2024-02-24 04:56:08 +03:00
|
|
|
preloadIndex >>= 0x18;
|
|
|
|
|
|
|
|
if (gPreloadSampleStack[preloadIndex].isFree == 0) {
|
|
|
|
sample = gPreloadSampleStack[preloadIndex].sample;
|
|
|
|
key = sample->sampleAddr + sample->size + sample->medium;
|
|
|
|
if (key == gPreloadSampleStack[preloadIndex].endAndMediumKey) {
|
|
|
|
sample->sampleAddr = gPreloadSampleStack[preloadIndex].ramAddr;
|
2024-03-01 21:57:44 +03:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2024-02-24 04:56:08 +03:00
|
|
|
}
|
2024-03-27 23:06:28 +03:00
|
|
|
// "============Error: Magic is Broken after loading.\n"
|
2024-02-24 04:56:08 +03:00
|
|
|
gPreloadSampleStack[preloadIndex].isFree = 1;
|
|
|
|
}
|
|
|
|
while (true) {
|
|
|
|
if (gPreloadSampleStackTop <= 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (gPreloadSampleStack[gPreloadSampleStackTop - 1].isFree == 1) {
|
|
|
|
gPreloadSampleStackTop--;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
sample = gPreloadSampleStack[gPreloadSampleStackTop - 1].sample;
|
|
|
|
sampleAddr = sample->sampleAddr;
|
|
|
|
size = sample->size;
|
|
|
|
nChunks = (size >> 0xC) + 1;
|
|
|
|
key = sampleAddr + size + sample->medium;
|
|
|
|
if (key != gPreloadSampleStack[gPreloadSampleStackTop - 1].endAndMediumKey) {
|
2024-03-27 23:06:28 +03:00
|
|
|
// "============Error: Magic is Broken: %x\n";
|
2024-02-24 04:56:08 +03:00
|
|
|
gPreloadSampleStack[gPreloadSampleStackTop - 1].isFree = 1;
|
|
|
|
gPreloadSampleStackTop--;
|
|
|
|
} else {
|
|
|
|
size = sample->size;
|
|
|
|
AudioLoad_StartAsyncLoad(sampleAddr, gPreloadSampleStack[gPreloadSampleStackTop - 1].ramAddr, size,
|
|
|
|
sample->medium, nChunks, &gPreloadSampleQueue,
|
|
|
|
gPreloadSampleStack[gPreloadSampleStackTop - 1].encodedInfo);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_AddToSampleSet(Sample* sample, s32 numSamples, Sample** sampleSet) {
|
|
|
|
s32 i;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < numSamples; i++) {
|
|
|
|
if (sample->sampleAddr == sampleSet[i]->sampleAddr) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i == numSamples) {
|
|
|
|
sampleSet[numSamples++] = sample;
|
|
|
|
}
|
|
|
|
return numSamples;
|
|
|
|
}
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-03-27 23:06:28 +03:00
|
|
|
static char devstr62[] = "Error: No Handle.\n";
|
|
|
|
static char devstr63[] = "Success: %x\n";
|
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
s32 AudioLoad_GetSamplesForFont(s32 fontId, Sample** sampleSet) {
|
|
|
|
s32 i;
|
|
|
|
Drum* drum;
|
|
|
|
Instrument* inst;
|
|
|
|
s32 numLoaded;
|
|
|
|
s32 numDrums;
|
|
|
|
s32 numInstruments;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
numLoaded = 0;
|
|
|
|
numDrums = gSoundFontList[fontId].numDrums;
|
|
|
|
numInstruments = gSoundFontList[fontId].numInstruments;
|
2024-02-22 01:10:06 +03:00
|
|
|
|
2024-02-24 04:56:08 +03:00
|
|
|
for (i = 0; i < numDrums; i++) {
|
|
|
|
drum = Audio_GetDrum(fontId, i);
|
|
|
|
if (drum == NULL) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
numLoaded = AudioLoad_AddToSampleSet(drum->tunedSample.sample, numLoaded, sampleSet);
|
|
|
|
}
|
|
|
|
for (i = 0; i < numInstruments; i++) {
|
|
|
|
inst = Audio_GetInstrument(fontId, i);
|
|
|
|
if (inst == NULL) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (inst->normalRangeLo != 0) {
|
|
|
|
numLoaded = AudioLoad_AddToSampleSet(inst->lowPitchTunedSample.sample, numLoaded, sampleSet);
|
|
|
|
}
|
|
|
|
if (inst->normalRangeHi != 127) {
|
|
|
|
numLoaded = AudioLoad_AddToSampleSet(inst->highPitchTunedSample.sample, numLoaded, sampleSet);
|
|
|
|
}
|
|
|
|
numLoaded = AudioLoad_AddToSampleSet(inst->normalPitchTunedSample.sample, numLoaded, sampleSet);
|
|
|
|
}
|
|
|
|
return numLoaded;
|
|
|
|
}
|