2021-07-27 23:44:58 +00:00
|
|
|
#include "ultra64.h"
|
|
|
|
#include "global.h"
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
#define MK_ASYNC_MSG(retData, tableType, id, status) (((retData) << 24) | ((tableType) << 16) | ((id) << 8) | (status))
|
|
|
|
#define ASYNC_TBLTYPE(v) ((u8)(v >> 16))
|
|
|
|
#define ASYNC_ID(v) ((u8)(v >> 8))
|
|
|
|
#define ASYNC_STATUS(v) ((u8)(v >> 0))
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
/* 0 */ LOAD_STATUS_WAITING,
|
|
|
|
/* 1 */ LOAD_STATUS_START,
|
|
|
|
/* 2 */ LOAD_STATUS_LOADING,
|
|
|
|
/* 3 */ LOAD_STATUS_DONE
|
|
|
|
} SlowLoadStatus;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
/* 0x00 */ s32 sampleBankId1;
|
|
|
|
/* 0x04 */ s32 sampleBankId2;
|
|
|
|
/* 0x08 */ s32 baseAddr1;
|
|
|
|
/* 0x0C */ s32 baseAddr2;
|
|
|
|
/* 0x10 */ u32 medium1;
|
|
|
|
/* 0x14 */ u32 medium2;
|
|
|
|
} RelocInfo; // size = 0x18
|
|
|
|
|
|
|
|
// opaque type for unpatched sound font data (should maybe get rid of this?)
|
|
|
|
typedef void SoundFontData;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
/* forward declarations */
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 skipTicks);
|
|
|
|
SoundFontData* AudioLoad_SyncLoadFont(u32 fontId);
|
|
|
|
SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId);
|
|
|
|
void AudioLoad_ProcessAsyncLoads(s32 resetStatus);
|
|
|
|
void AudioLoad_ProcessAsyncLoadUnkMedium(AudioAsyncLoad* asyncLoad, s32 resetStatus);
|
|
|
|
void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus);
|
|
|
|
void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo, s32 temporary);
|
|
|
|
void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo);
|
|
|
|
void AudioLoad_DiscardFont(s32 fontId);
|
|
|
|
u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad);
|
|
|
|
void* AudioLoad_SyncLoad(u32 tableType, u32 tableId, s32* didAllocate);
|
|
|
|
u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 tableId);
|
|
|
|
void* AudioLoad_SearchCaches(s32 tableType, s32 id);
|
|
|
|
AudioTable* AudioLoad_GetLoadTable(s32 tableType);
|
|
|
|
void AudioLoad_SyncDma(u32 devAddr, u8* addr, u32 size, s32 medium);
|
|
|
|
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* addr, u32 size, s32 unkMediumParam);
|
|
|
|
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
|
|
|
|
OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType);
|
|
|
|
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
|
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoadUnkMedium(s32 unkMediumParam, u32 devAddr, void* ramAddr, s32 size, s32 medium,
|
|
|
|
s32 nChunks, OSMesgQueue* retQueue, s32 retMsg);
|
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, void* ramAddr, u32 size, s32 medium, s32 nChunks,
|
|
|
|
OSMesgQueue* retQueue, s32 retMsg);
|
|
|
|
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size);
|
|
|
|
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, void* ramAddr, u32 size, s16 arg3);
|
|
|
|
u8* AudioLoad_SyncLoadSeq(s32 seqId);
|
|
|
|
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus);
|
|
|
|
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size);
|
|
|
|
void AudioLoad_ProcessSlowLoads(s32 resetStatus);
|
|
|
|
void AudioLoad_DmaSlowCopyUnkMedium(s32 devAddr, u8* ramAddr, s32 size, s32 arg3);
|
|
|
|
|
|
|
|
OSMesgQueue sScriptLoadQueue;
|
|
|
|
OSMesg sScriptLoadMesgBuf[0x10];
|
|
|
|
s8* sScriptLoadDonePointers[0x10];
|
|
|
|
s32 sAudioLoadPad1[2]; // file padding
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 D_8016B780;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 sAudioLoadPad2[4]; // double file padding?
|
|
|
|
|
|
|
|
DmaHandler sDmaHandler = osEPiStartDma;
|
|
|
|
void* sUnusedHandler = NULL;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 gAudioContextInitalized = false;
|
|
|
|
|
|
|
|
void AudioLoad_DecreaseSampleDmaTtls(void) {
|
2021-09-07 18:14:09 +00:00
|
|
|
u32 i;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
for (i = 0; i < gAudioContext.sampleDmaListSize1; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
SampleDma* dma = &gAudioContext.sampleDmas[i];
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (dma->ttl != 0) {
|
|
|
|
dma->ttl--;
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
dma->reuseIndex = gAudioContext.sampleDmaReuseQueue1WrPos;
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1WrPos] = i;
|
|
|
|
gAudioContext.sampleDmaReuseQueue1WrPos++;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaCount; i++) {
|
|
|
|
SampleDma* dma = &gAudioContext.sampleDmas[i];
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (dma->ttl != 0) {
|
|
|
|
dma->ttl--;
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
dma->reuseIndex = gAudioContext.sampleDmaReuseQueue2WrPos;
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2WrPos] = i;
|
|
|
|
gAudioContext.sampleDmaReuseQueue2WrPos++;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.unused2628 = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 medium) {
|
|
|
|
s32 pad1;
|
|
|
|
SampleDma* dma;
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 hasDma = false;
|
|
|
|
u32 dmaDevAddr;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 pad2;
|
2021-09-07 18:14:09 +00:00
|
|
|
u32 dmaIndex;
|
|
|
|
u32 transfer;
|
|
|
|
s32 bufferPos;
|
|
|
|
u32 i;
|
|
|
|
|
|
|
|
if (arg2 != 0 || *dmaIndexRef >= gAudioContext.sampleDmaListSize1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaCount; i++) {
|
|
|
|
dma = &gAudioContext.sampleDmas[i];
|
2021-09-07 18:14:09 +00:00
|
|
|
bufferPos = devAddr - dma->devAddr;
|
|
|
|
if (0 <= bufferPos && (u32)bufferPos <= dma->size - size) {
|
|
|
|
// We already have a DMA request for this memory range.
|
|
|
|
if (dma->ttl == 0 &&
|
|
|
|
gAudioContext.sampleDmaReuseQueue2RdPos != gAudioContext.sampleDmaReuseQueue2WrPos) {
|
|
|
|
// Move the DMA out of the reuse queue, by swapping it with the
|
|
|
|
// read pos, and then incrementing the read pos.
|
|
|
|
if (dma->reuseIndex != gAudioContext.sampleDmaReuseQueue2RdPos) {
|
|
|
|
gAudioContext.sampleDmaReuseQueue2[dma->reuseIndex] =
|
|
|
|
gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos];
|
|
|
|
gAudioContext
|
2021-11-07 16:58:50 +00:00
|
|
|
.sampleDmas[gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos]]
|
2021-09-07 18:14:09 +00:00
|
|
|
.reuseIndex = dma->reuseIndex;
|
|
|
|
}
|
|
|
|
gAudioContext.sampleDmaReuseQueue2RdPos++;
|
|
|
|
}
|
|
|
|
dma->ttl = 32;
|
|
|
|
*dmaIndexRef = (u8)i;
|
|
|
|
return &dma->ramAddr[devAddr - dma->devAddr];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arg2 == 0) {
|
|
|
|
goto search_short_lived;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gAudioContext.sampleDmaReuseQueue2RdPos != gAudioContext.sampleDmaReuseQueue2WrPos && arg2 != 0) {
|
|
|
|
// Allocate a DMA from reuse queue 2, unless full.
|
|
|
|
dmaIndex = gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos];
|
|
|
|
gAudioContext.sampleDmaReuseQueue2RdPos++;
|
2021-11-07 16:58:50 +00:00
|
|
|
dma = gAudioContext.sampleDmas + dmaIndex;
|
2021-09-07 18:14:09 +00:00
|
|
|
hasDma = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
search_short_lived:
|
2021-11-07 16:58:50 +00:00
|
|
|
dma = gAudioContext.sampleDmas + *dmaIndexRef;
|
2021-09-07 18:14:09 +00:00
|
|
|
i = 0;
|
|
|
|
again:
|
|
|
|
bufferPos = devAddr - dma->devAddr;
|
|
|
|
if (0 <= bufferPos && (u32)bufferPos <= dma->size - size) {
|
|
|
|
// We already have DMA for this memory range.
|
|
|
|
if (dma->ttl == 0) {
|
|
|
|
// Move the DMA out of the reuse queue, by swapping it with the
|
|
|
|
// read pos, and then incrementing the read pos.
|
|
|
|
if (dma->reuseIndex != gAudioContext.sampleDmaReuseQueue1RdPos) {
|
|
|
|
gAudioContext.sampleDmaReuseQueue1[dma->reuseIndex] =
|
|
|
|
gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos];
|
|
|
|
gAudioContext
|
2021-11-07 16:58:50 +00:00
|
|
|
.sampleDmas[gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos]]
|
2021-09-07 18:14:09 +00:00
|
|
|
.reuseIndex = dma->reuseIndex;
|
|
|
|
}
|
|
|
|
gAudioContext.sampleDmaReuseQueue1RdPos++;
|
|
|
|
}
|
|
|
|
dma->ttl = 2;
|
|
|
|
return dma->ramAddr + (devAddr - dma->devAddr);
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
dma = gAudioContext.sampleDmas + i++;
|
2021-09-07 18:14:09 +00:00
|
|
|
if (i <= gAudioContext.sampleDmaListSize1) {
|
|
|
|
goto again;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!hasDma) {
|
|
|
|
if (gAudioContext.sampleDmaReuseQueue1RdPos == gAudioContext.sampleDmaReuseQueue1WrPos) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
// Allocate a DMA from reuse queue 1.
|
|
|
|
dmaIndex = gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos++];
|
2021-11-07 16:58:50 +00:00
|
|
|
dma = gAudioContext.sampleDmas + dmaIndex;
|
2021-09-07 18:14:09 +00:00
|
|
|
hasDma = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
transfer = dma->size;
|
|
|
|
dmaDevAddr = devAddr & ~0xF;
|
|
|
|
dma->ttl = 3;
|
|
|
|
dma->devAddr = dmaDevAddr;
|
|
|
|
dma->sizeUnused = transfer;
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_Dma(&gAudioContext.currAudioFrameDmaIoMesgBuf[gAudioContext.curAudioFrameDmaCount++], OS_MESG_PRI_NORMAL,
|
|
|
|
OS_READ, dmaDevAddr, dma->ramAddr, transfer, &gAudioContext.currAudioFrameDmaQueue, medium,
|
|
|
|
"SUPERDMA");
|
2021-09-07 18:14:09 +00:00
|
|
|
*dmaIndexRef = dmaIndex;
|
|
|
|
return (devAddr - dmaDevAddr) + dma->ramAddr;
|
|
|
|
}
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitSampleDmaBuffers(s32 arg0) {
|
|
|
|
SampleDma* dma;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
s32 t2;
|
2021-08-12 19:37:37 +00:00
|
|
|
s32 j;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmaBufSize = gAudioContext.sampleDmaBufSize1;
|
|
|
|
gAudioContext.sampleDmas =
|
|
|
|
AudioHeap_Alloc(&gAudioContext.notesAndBuffersPool,
|
|
|
|
4 * gAudioContext.numNotes * sizeof(SampleDma) * gAudioContext.audioBufferParameters.specUnk4);
|
|
|
|
t2 = 3 * gAudioContext.numNotes * gAudioContext.audioBufferParameters.specUnk4;
|
2021-07-27 23:44:58 +00:00
|
|
|
for (i = 0; i < t2; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
dma = &gAudioContext.sampleDmas[gAudioContext.sampleDmaCount];
|
z_message_PAL, message_data_static and surrounding doc (#996)
* Initial progress on z_message_PAL, very messy
* Fix merge
* Some more progress
* Fix merge
* More z_message_PAL
* Small progress
* More small progress
* message_data_static files OK
* Prepare z_message_tables
* Matched another function, small updates
* Attempt to use asm-processor static-symbols branch
* Refactor text id declarations
* Begin large text codes parser function
* Fix merge
* Refactor done
* Build OK, add color and highscore names
* Remove encoded text headers and automatically encode during build
* Fix kanfont
* Various cleanups
* DISP macros
* Another match aside data
* Further progress
* Small improvements
* Deduplicate magic values for text control codes, small improvements
* Tiny progress
* Minor cleanups
* Clean up z_message_PAL comment
* Progress on large functions
* Further progress on large functions
* Changes to mkldscript to link .data in the .rodata section
* data OK
* Few improvements
* Use gDPLoadTextureBlock macros where appropriate
* rm z_message_tables, progress on large functions
* 2 more matches
* Improvements
* Small progress
* More progress on big function
* progress
* match func_80107980
* match Message_Update
* match func_8010BED8
* done
* Progress on remaining large functions
* Small progress on largest function
* Another match, extract text and move to assets, improve text build system
* Small nonmatchings improvements
* docs wip
* Largest function maybe equivalent
* Fix merge
* Document do_action values, largest function is almost instruction-matching
* Rename NAVI do_action to NONE, as that appears to be how that value is used in practice
* Fix merge
* one match
* Last function is instruction-matching
* Fix
* Improvements thanks to engineer124
* Stack matched thanks to petrie911, now just a/v/low t regalloc issues, some cleanup
* More variables labeled, use text state enum everywhere
* More labels and names
* Fix
* Actor_IsTalking -> Actor_TalkRequested
* Match func_8010C39C and remove unused asm
* More docs
* Mostly ocarina related docs
* All msgModes named
* Fix assetclean
* Cleanup
* Extraction fixes and headers
* Suggestions
* Review suggestions
* Change text extraction again, only extract if the headers do not already exist
* Fix
* Use ast for charmap, fix assetclean for real this time
* Review suggestions
* BGM ids and ran formatter
* Review comments
* rename include_readonly to include_data_with_rodata
* Remove leading 0s in number directives
* Review suggestions for message_data_static
* textbox pos enum comments, rename several enum names from Message to TextBox
Co-authored-by: Thar0 <maximilianc64@gmail.com>
Co-authored-by: Zelllll <56516451+Zelllll@users.noreply.github.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
Co-authored-by: Roman971 <romanlasnier@hotmail.com>
2021-11-23 01:20:30 +00:00
|
|
|
dma->ramAddr =
|
|
|
|
AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, gAudioContext.sampleDmaBufSize);
|
2021-11-07 16:58:50 +00:00
|
|
|
if (dma->ramAddr == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_WritebackDCache(dma->ramAddr, gAudioContext.sampleDmaBufSize);
|
|
|
|
dma->size = gAudioContext.sampleDmaBufSize;
|
|
|
|
dma->devAddr = 0;
|
|
|
|
dma->sizeUnused = 0;
|
|
|
|
dma->unused = 0;
|
|
|
|
dma->ttl = 0;
|
|
|
|
gAudioContext.sampleDmaCount++;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; (u32)i < gAudioContext.sampleDmaCount; i++) {
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue1[i] = i;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmas[i].reuseIndex = i;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = gAudioContext.sampleDmaCount; i < 0x100; i++) {
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue1[i] = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue1RdPos = 0;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue1WrPos = gAudioContext.sampleDmaCount;
|
|
|
|
gAudioContext.sampleDmaListSize1 = gAudioContext.sampleDmaCount;
|
|
|
|
gAudioContext.sampleDmaBufSize = gAudioContext.sampleDmaBufSize2;
|
|
|
|
|
|
|
|
for (j = 0; j < gAudioContext.numNotes; j++) {
|
|
|
|
dma = &gAudioContext.sampleDmas[gAudioContext.sampleDmaCount];
|
z_message_PAL, message_data_static and surrounding doc (#996)
* Initial progress on z_message_PAL, very messy
* Fix merge
* Some more progress
* Fix merge
* More z_message_PAL
* Small progress
* More small progress
* message_data_static files OK
* Prepare z_message_tables
* Matched another function, small updates
* Attempt to use asm-processor static-symbols branch
* Refactor text id declarations
* Begin large text codes parser function
* Fix merge
* Refactor done
* Build OK, add color and highscore names
* Remove encoded text headers and automatically encode during build
* Fix kanfont
* Various cleanups
* DISP macros
* Another match aside data
* Further progress
* Small improvements
* Deduplicate magic values for text control codes, small improvements
* Tiny progress
* Minor cleanups
* Clean up z_message_PAL comment
* Progress on large functions
* Further progress on large functions
* Changes to mkldscript to link .data in the .rodata section
* data OK
* Few improvements
* Use gDPLoadTextureBlock macros where appropriate
* rm z_message_tables, progress on large functions
* 2 more matches
* Improvements
* Small progress
* More progress on big function
* progress
* match func_80107980
* match Message_Update
* match func_8010BED8
* done
* Progress on remaining large functions
* Small progress on largest function
* Another match, extract text and move to assets, improve text build system
* Small nonmatchings improvements
* docs wip
* Largest function maybe equivalent
* Fix merge
* Document do_action values, largest function is almost instruction-matching
* Rename NAVI do_action to NONE, as that appears to be how that value is used in practice
* Fix merge
* one match
* Last function is instruction-matching
* Fix
* Improvements thanks to engineer124
* Stack matched thanks to petrie911, now just a/v/low t regalloc issues, some cleanup
* More variables labeled, use text state enum everywhere
* More labels and names
* Fix
* Actor_IsTalking -> Actor_TalkRequested
* Match func_8010C39C and remove unused asm
* More docs
* Mostly ocarina related docs
* All msgModes named
* Fix assetclean
* Cleanup
* Extraction fixes and headers
* Suggestions
* Review suggestions
* Change text extraction again, only extract if the headers do not already exist
* Fix
* Use ast for charmap, fix assetclean for real this time
* Review suggestions
* BGM ids and ran formatter
* Review comments
* rename include_readonly to include_data_with_rodata
* Remove leading 0s in number directives
* Review suggestions for message_data_static
* textbox pos enum comments, rename several enum names from Message to TextBox
Co-authored-by: Thar0 <maximilianc64@gmail.com>
Co-authored-by: Zelllll <56516451+Zelllll@users.noreply.github.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
Co-authored-by: Roman971 <romanlasnier@hotmail.com>
2021-11-23 01:20:30 +00:00
|
|
|
dma->ramAddr =
|
|
|
|
AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, gAudioContext.sampleDmaBufSize);
|
2021-11-07 16:58:50 +00:00
|
|
|
if (dma->ramAddr == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_WritebackDCache(dma->ramAddr, gAudioContext.sampleDmaBufSize);
|
|
|
|
dma->size = gAudioContext.sampleDmaBufSize;
|
|
|
|
dma->devAddr = 0U;
|
|
|
|
dma->sizeUnused = 0;
|
|
|
|
dma->unused = 0;
|
|
|
|
dma->ttl = 0;
|
|
|
|
gAudioContext.sampleDmaCount++;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = gAudioContext.sampleDmaListSize1; (u32)i < gAudioContext.sampleDmaCount; i++) {
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue2[i - gAudioContext.sampleDmaListSize1] = i;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmas[i].reuseIndex = i - gAudioContext.sampleDmaListSize1;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = gAudioContext.sampleDmaCount; i < 0x100; i++) {
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue2[i] = gAudioContext.sampleDmaListSize1;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue2RdPos = 0;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmaReuseQueue2WrPos = gAudioContext.sampleDmaCount - gAudioContext.sampleDmaListSize1;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_IsFontLoadComplete(s32 fontId) {
|
|
|
|
if (fontId == 0xFF) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (gAudioContext.fontLoadStatus[fontId] >= 2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (gAudioContext.fontLoadStatus[AudioLoad_GetRealTableIndex(FONT_TABLE, fontId)] >= 2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_IsSeqLoadComplete(s32 seqId) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (seqId == 0xFF) {
|
2021-08-12 19:37:37 +00:00
|
|
|
return true;
|
|
|
|
} else if (gAudioContext.seqLoadStatus[seqId] >= 2) {
|
|
|
|
return true;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (gAudioContext.seqLoadStatus[AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId)] >= 2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_IsSampleLoadComplete(s32 sampleBankId) {
|
|
|
|
if (sampleBankId == 0xFF) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (gAudioContext.sampleFontLoadStatus[sampleBankId] >= 2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (gAudioContext.sampleFontLoadStatus[AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankId)] >= 2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetFontLoadStatus(s32 fontId, s32 status) {
|
|
|
|
if ((fontId != 0xFF) && (gAudioContext.fontLoadStatus[fontId] != 5)) {
|
|
|
|
gAudioContext.fontLoadStatus[fontId] = status;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetSeqLoadStatus(s32 seqId, s32 status) {
|
2021-08-12 19:37:37 +00:00
|
|
|
if ((seqId != 0xFF) && (gAudioContext.seqLoadStatus[seqId] != 5)) {
|
|
|
|
gAudioContext.seqLoadStatus[seqId] = status;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetSampleFontLoadStatusAndApplyCaches(s32 sampleBankId, s32 status) {
|
|
|
|
if (sampleBankId != 0xFF) {
|
|
|
|
if (gAudioContext.sampleFontLoadStatus[sampleBankId] != 5) {
|
|
|
|
gAudioContext.sampleFontLoadStatus[sampleBankId] = status;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if ((gAudioContext.sampleFontLoadStatus[sampleBankId] == 5) ||
|
|
|
|
(gAudioContext.sampleFontLoadStatus[sampleBankId] == 2)) {
|
|
|
|
AudioHeap_ApplySampleBankCache(sampleBankId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetSampleFontLoadStatus(s32 sampleBankId, s32 status) {
|
|
|
|
if ((sampleBankId != 0xFF) && (gAudioContext.sampleFontLoadStatus[sampleBankId] != 5)) {
|
|
|
|
gAudioContext.sampleFontLoadStatus[sampleBankId] = status;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitTable(AudioTable* table, u32 romAddr, u16 unkMediumParam) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
table->unkMediumParam = unkMediumParam;
|
|
|
|
table->romAddr = romAddr;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < table->numEntries; i++) {
|
|
|
|
if ((table->entries[i].size != 0) && (table->entries[i].medium == MEDIUM_CART)) {
|
2021-07-27 23:44:58 +00:00
|
|
|
table->entries[i].romAddr += romAddr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontData* AudioLoad_SyncLoadSeqFonts(s32 seqId, u32* outDefaultFontId) {
|
2021-07-27 23:44:58 +00:00
|
|
|
char pad[0x8];
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 index;
|
|
|
|
SoundFontData* font;
|
|
|
|
s32 numFonts;
|
|
|
|
s32 fontId;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (seqId >= gAudioContext.numSequences) {
|
|
|
|
return NULL;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
fontId = 0xFF;
|
|
|
|
index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
|
|
|
|
numFonts = gAudioContext.sequenceFontTable[index++];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
while (numFonts > 0) {
|
|
|
|
fontId = gAudioContext.sequenceFontTable[index++];
|
|
|
|
font = AudioLoad_SyncLoadFont(fontId);
|
|
|
|
numFonts--;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
*outDefaultFontId = fontId;
|
|
|
|
return font;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 pad;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 defaultFontId;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (seqId < gAudioContext.numSequences) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (arg1 & 2) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoadSeqFonts(seqId, &defaultFontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
if (arg1 & 1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoadSeq(seqId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncLoadSample(SoundFontSample* sample, s32 fontId) {
|
2021-07-27 23:44:58 +00:00
|
|
|
void* sampleAddr;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (sample->unk_bit25 == 1) {
|
|
|
|
if (sample->medium != MEDIUM_RAM) {
|
|
|
|
sampleAddr = AudioHeap_AllocSampleCache(sample->size, fontId, (void*)sample->sampleAddr, sample->medium,
|
|
|
|
CACHE_PERSISTENT);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (sampleAddr == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (sample->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_SyncDmaUnkMedium(sample->sampleAddr, sampleAddr, sample->size,
|
|
|
|
gAudioContext.sampleBankTable->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncDma(sample->sampleAddr, sampleAddr, sample->size, sample->medium);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-07-27 23:44:58 +00:00
|
|
|
sample->sampleAddr = sampleAddr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) {
|
|
|
|
if (instId < 0x7F) {
|
|
|
|
Instrument* instrument = Audio_GetInstrumentInner(fontId, instId);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
if (instrument == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (instrument->normalRangeLo != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoadSample(instrument->lowNotesSound.sample, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoadSample(instrument->normalNotesSound.sample, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (instrument->normalRangeHi != 0x7F) {
|
2021-11-07 16:58:50 +00:00
|
|
|
return AudioLoad_SyncLoadSample(instrument->highNotesSound.sample, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (instId == 0x7F) {
|
|
|
|
Drum* drum = Audio_GetDrum(fontId, drumId);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-08-19 22:10:51 +00:00
|
|
|
if (drum == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoadSample(drum->sound.sample, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncLoad(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
if (AudioLoad_AsyncLoadInner(tableType, id, nChunks, retData, retQueue) == NULL) {
|
|
|
|
osSendMesg(retQueue, 0xFFFFFFFF, OS_MESG_NOBLOCK);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncLoadSeq(s32 seqId, s32 arg1, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
AudioLoad_AsyncLoad(SEQUENCE_TABLE, seqId, 0, retData, retQueue);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 arg1, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
AudioLoad_AsyncLoad(SAMPLE_TABLE, sampleBankId, 0, retData, retQueue);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* retQueue) {
|
|
|
|
AudioLoad_AsyncLoad(FONT_TABLE, fontId, 0, retData, retQueue);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) {
|
|
|
|
s32 index;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
*outNumFonts = gAudioContext.sequenceFontTable[index++];
|
|
|
|
if (*outNumFonts == 0) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
return &gAudioContext.sequenceFontTable[index];
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_DiscardSeqFonts(s32 seqId) {
|
|
|
|
s32 fontId;
|
|
|
|
s32 index;
|
|
|
|
s32 numFonts;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
|
|
|
|
numFonts = gAudioContext.sequenceFontTable[index++];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
while (numFonts > 0) {
|
|
|
|
numFonts--;
|
|
|
|
fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.sequenceFontTable[index++]);
|
|
|
|
if (AudioHeap_SearchPermanentCache(FONT_TABLE, fontId) == NULL) {
|
|
|
|
AudioLoad_DiscardFont(fontId);
|
|
|
|
AudioLoad_SetFontLoadStatus(fontId, 0);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_DiscardFont(s32 fontId) {
|
2021-09-07 18:14:09 +00:00
|
|
|
u32 i;
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioCache* pool = &gAudioContext.fontCache;
|
|
|
|
AudioPersistentCache* persistent;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (fontId == pool->temporary.entries[0].id) {
|
2021-07-27 23:44:58 +00:00
|
|
|
pool->temporary.entries[0].id = -1;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (fontId == pool->temporary.entries[1].id) {
|
2021-07-27 23:44:58 +00:00
|
|
|
pool->temporary.entries[1].id = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
persistent = &pool->persistent;
|
|
|
|
for (i = 0; i < persistent->numEntries; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
if (fontId == persistent->entries[i].id) {
|
2021-07-27 23:44:58 +00:00
|
|
|
persistent->entries[i].id = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_DiscardFont(fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (gAudioContext.resetTimer != 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
|
|
|
|
gAudioContext.seqPlayers[playerIdx].skipTicks = 0;
|
|
|
|
AudioLoad_SyncInitSeqPlayerInternal(playerIdx, seqId, arg2);
|
|
|
|
// Intentionally missing return. Returning the result of the above function
|
|
|
|
// call matches but is UB because it too is missing a return, and using the
|
|
|
|
// result of a non-void function that has failed to return a value is UB.
|
|
|
|
// The callers of this function do not use the return value, so it's fine.
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncInitSeqPlayerSkipTicks(s32 playerIdx, s32 seqId, s32 skipTicks) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (gAudioContext.resetTimer != 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.seqPlayers[playerIdx].skipTicks = skipTicks;
|
|
|
|
AudioLoad_SyncInitSeqPlayerInternal(playerIdx, seqId, 0);
|
|
|
|
// Missing return, see above.
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) {
|
|
|
|
SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIdx];
|
2021-07-27 23:44:58 +00:00
|
|
|
u8* seqData;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 index;
|
|
|
|
s32 numFonts;
|
|
|
|
s32 fontId;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (seqId >= gAudioContext.numSequences) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioSeq_SequencePlayerDisable(seqPlayer);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
fontId = 0xFF;
|
|
|
|
index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
|
|
|
|
numFonts = gAudioContext.sequenceFontTable[index++];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
while (numFonts > 0) {
|
|
|
|
fontId = gAudioContext.sequenceFontTable[index++];
|
|
|
|
AudioLoad_SyncLoadFont(fontId);
|
|
|
|
numFonts--;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
seqData = AudioLoad_SyncLoadSeq(seqId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (seqData == NULL) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioSeq_ResetSequencePlayer(seqPlayer);
|
2021-07-27 23:44:58 +00:00
|
|
|
seqPlayer->seqId = seqId;
|
2021-11-07 16:58:50 +00:00
|
|
|
seqPlayer->defaultFont = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
seqPlayer->seqData = seqData;
|
|
|
|
seqPlayer->enabled = 1;
|
|
|
|
seqPlayer->scriptState.pc = seqData;
|
|
|
|
seqPlayer->scriptState.depth = 0;
|
|
|
|
seqPlayer->delay = 0;
|
|
|
|
seqPlayer->finished = 0;
|
2021-11-07 16:58:50 +00:00
|
|
|
seqPlayer->playerIdx = playerIdx;
|
|
|
|
AudioSeq_SkipForwardSequence(seqPlayer);
|
|
|
|
//! @bug missing return (but the return value is not used so it's not UB)
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
u8* AudioLoad_SyncLoadSeq(s32 seqId) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 pad;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 didAllocate;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.seqLoadStatus[AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId)] == 1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
return AudioLoad_SyncLoad(SEQUENCE_TABLE, seqId, &didAllocate);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 AudioLoad_GetSampleBank(u32 sampleBankId, u32* outMedium) {
|
|
|
|
return AudioLoad_TrySyncLoadSampleBank(sampleBankId, outMedium, true);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad) {
|
|
|
|
void* ret;
|
|
|
|
AudioTable* sampleBankTable;
|
|
|
|
u32 realTableId = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankId);
|
|
|
|
s8 cachePolicy;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sampleBankTable = AudioLoad_GetLoadTable(SAMPLE_TABLE);
|
|
|
|
ret = AudioLoad_SearchCaches(SAMPLE_TABLE, realTableId);
|
|
|
|
if (ret != NULL) {
|
|
|
|
if (gAudioContext.sampleFontLoadStatus[realTableId] != 1) {
|
|
|
|
AudioLoad_SetSampleFontLoadStatus(realTableId, 2);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
*outMedium = MEDIUM_RAM;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
cachePolicy = sampleBankTable->entries[sampleBankId].cachePolicy;
|
|
|
|
if (cachePolicy == 4 || noLoad == true) {
|
|
|
|
*outMedium = sampleBankTable->entries[sampleBankId].medium;
|
|
|
|
return sampleBankTable->entries[realTableId].romAddr;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
|
|
|
|
ret = AudioLoad_SyncLoad(SAMPLE_TABLE, sampleBankId, &noLoad);
|
|
|
|
if (ret != NULL) {
|
|
|
|
*outMedium = MEDIUM_RAM;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
*outMedium = sampleBankTable->entries[sampleBankId].medium;
|
|
|
|
return sampleBankTable->entries[realTableId].romAddr;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) {
|
|
|
|
SoundFontData* ret;
|
|
|
|
s32 sampleBankId1;
|
|
|
|
s32 sampleBankId2;
|
|
|
|
s32 didAllocate;
|
2021-07-27 23:44:58 +00:00
|
|
|
RelocInfo relocInfo;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 realFontId = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.fontLoadStatus[realFontId] == 1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
sampleBankId1 = gAudioContext.soundFonts[realFontId].sampleBankId1;
|
|
|
|
sampleBankId2 = gAudioContext.soundFonts[realFontId].sampleBankId2;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
relocInfo.sampleBankId1 = sampleBankId1;
|
|
|
|
relocInfo.sampleBankId2 = sampleBankId2;
|
|
|
|
if (sampleBankId1 != 0xFF) {
|
|
|
|
relocInfo.baseAddr1 = AudioLoad_TrySyncLoadSampleBank(sampleBankId1, &relocInfo.medium1, false);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-09-07 18:14:09 +00:00
|
|
|
relocInfo.baseAddr1 = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (sampleBankId2 != 0xFF) {
|
|
|
|
relocInfo.baseAddr2 = AudioLoad_TrySyncLoadSampleBank(sampleBankId2, &relocInfo.medium2, false);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-09-07 18:14:09 +00:00
|
|
|
relocInfo.baseAddr2 = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioLoad_SyncLoad(FONT_TABLE, fontId, &didAllocate);
|
|
|
|
if (ret == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
if (didAllocate == true) {
|
|
|
|
AudioLoad_RelocateFontAndPreloadSamples(realFontId, ret, &relocInfo, false);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) {
|
2021-07-27 23:44:58 +00:00
|
|
|
u32 size;
|
|
|
|
AudioTable* table;
|
|
|
|
s32 pad;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 medium;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 status;
|
|
|
|
u32 romAddr;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 cachePolicy;
|
2021-09-07 18:14:09 +00:00
|
|
|
void* ret;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 realId;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
realId = AudioLoad_GetRealTableIndex(tableType, id);
|
|
|
|
ret = AudioLoad_SearchCaches(tableType, realId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret != NULL) {
|
|
|
|
*didAllocate = false;
|
|
|
|
status = 2;
|
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
table = AudioLoad_GetLoadTable(tableType);
|
|
|
|
size = table->entries[realId].size;
|
2021-07-27 23:44:58 +00:00
|
|
|
size = ALIGN16(size);
|
2021-11-07 16:58:50 +00:00
|
|
|
medium = table->entries[id].medium;
|
|
|
|
cachePolicy = table->entries[id].cachePolicy;
|
|
|
|
romAddr = table->entries[realId].romAddr;
|
|
|
|
switch (cachePolicy) {
|
2021-07-27 23:44:58 +00:00
|
|
|
case 0:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocPermanent(tableType, realId, size);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
case 4:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
*didAllocate = true;
|
2021-11-07 16:58:50 +00:00
|
|
|
if (medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_SyncDmaUnkMedium(romAddr, ret, size, (s16)table->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncDma(romAddr, ret, size, medium);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
status = cachePolicy == 0 ? 5 : 2;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (tableType) {
|
|
|
|
case SEQUENCE_TABLE:
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SetSeqLoadStatus(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case FONT_TABLE:
|
|
|
|
AudioLoad_SetFontLoadStatus(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case SAMPLE_TABLE:
|
|
|
|
AudioLoad_SetSampleFontLoadStatusAndApplyCaches(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id) {
|
|
|
|
AudioTable* table = AudioLoad_GetLoadTable(tableType);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (table->entries[id].size == 0) {
|
|
|
|
id = table->entries[id].romAddr;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
return id;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void* AudioLoad_SearchCaches(s32 tableType, s32 id) {
|
2021-07-27 23:44:58 +00:00
|
|
|
void* ret;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_SearchPermanentCache(tableType, id);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret != NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_SearchCaches(tableType, CACHE_EITHER, id);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (ret != NULL) {
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioTable* AudioLoad_GetLoadTable(s32 tableType) {
|
|
|
|
AudioTable* ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
switch (tableType) {
|
|
|
|
case SEQUENCE_TABLE:
|
|
|
|
ret = gAudioContext.sequenceTable;
|
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case FONT_TABLE:
|
|
|
|
ret = gAudioContext.soundFontTable;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
ret = NULL;
|
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case SAMPLE_TABLE:
|
|
|
|
ret = gAudioContext.sampleBankTable;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo) {
|
2021-09-07 18:14:09 +00:00
|
|
|
u32 reloc;
|
|
|
|
u32 reloc2;
|
|
|
|
Instrument* inst;
|
2021-07-27 23:44:58 +00:00
|
|
|
Drum* drum;
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontSound* sfx;
|
2021-08-30 00:51:57 +00:00
|
|
|
s32 i;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 numDrums = gAudioContext.soundFonts[fontId].numDrums;
|
|
|
|
s32 numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
|
|
|
|
s32 numSfx = gAudioContext.soundFonts[fontId].numSfx;
|
2021-09-07 18:14:09 +00:00
|
|
|
void** ptrs = (void**)mem;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
#define BASE_OFFSET(x) (void*)((u32)(x) + (u32)(mem))
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
reloc2 = ptrs[0];
|
|
|
|
if (1) {}
|
|
|
|
if ((reloc2 != 0) && (numDrums != 0)) {
|
2021-11-07 16:58:50 +00:00
|
|
|
ptrs[0] = BASE_OFFSET(reloc2);
|
2021-09-07 18:14:09 +00:00
|
|
|
for (i = 0; i < numDrums; i++) {
|
|
|
|
reloc = ((Drum**)ptrs[0])[i];
|
|
|
|
if (reloc != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
reloc = BASE_OFFSET(reloc);
|
2021-09-07 18:14:09 +00:00
|
|
|
((Drum**)ptrs[0])[i] = drum = reloc;
|
2021-07-27 23:44:58 +00:00
|
|
|
if (!drum->loaded) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_RelocateSample(&drum->sound, mem, relocInfo);
|
2021-07-27 23:44:58 +00:00
|
|
|
reloc = drum->envelope;
|
2021-11-07 16:58:50 +00:00
|
|
|
drum->envelope = BASE_OFFSET(reloc);
|
2021-07-27 23:44:58 +00:00
|
|
|
drum->loaded = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
reloc2 = ptrs[1];
|
|
|
|
if (1) {}
|
|
|
|
if ((reloc2 != 0) && (numSfx != 0)) {
|
2021-11-07 16:58:50 +00:00
|
|
|
ptrs[1] = BASE_OFFSET(reloc2);
|
2021-09-07 18:14:09 +00:00
|
|
|
for (i = 0; i < numSfx; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
reloc = (SoundFontSound*)ptrs[1] + i;
|
2021-09-07 18:14:09 +00:00
|
|
|
if (reloc != 0) {
|
|
|
|
sfx = reloc;
|
|
|
|
if (sfx->sample != NULL) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_RelocateSample(sfx, mem, relocInfo);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
if (numInstruments > 0x7E) {
|
|
|
|
numInstruments = 0x7E;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
for (i = 2; i <= 2 + numInstruments - 1; i++) {
|
|
|
|
if (ptrs[i] != NULL) {
|
2021-11-07 16:58:50 +00:00
|
|
|
ptrs[i] = BASE_OFFSET(ptrs[i]);
|
2021-09-07 18:14:09 +00:00
|
|
|
inst = ptrs[i];
|
|
|
|
if (!inst->loaded) {
|
|
|
|
if (inst->normalRangeLo != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_RelocateSample(&inst->lowNotesSound, mem, relocInfo);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_RelocateSample(&inst->normalNotesSound, mem, relocInfo);
|
2021-09-07 18:14:09 +00:00
|
|
|
if (inst->normalRangeHi != 0x7F) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_RelocateSample(&inst->highNotesSound, mem, relocInfo);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-09-07 18:14:09 +00:00
|
|
|
|
|
|
|
reloc = inst->envelope;
|
2021-11-07 16:58:50 +00:00
|
|
|
inst->envelope = BASE_OFFSET(reloc);
|
2021-09-07 18:14:09 +00:00
|
|
|
inst->loaded = 1;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
#undef BASE_OFFSET
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.soundFonts[fontId].drums = ptrs[0];
|
|
|
|
gAudioContext.soundFonts[fontId].soundEffects = ptrs[1];
|
|
|
|
gAudioContext.soundFonts[fontId].instruments = (Instrument**)(ptrs + 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioLoad_SyncDma(u32 devAddr, u8* addr, u32 size, s32 medium) {
|
|
|
|
OSMesgQueue* msgQueue = &gAudioContext.syncDmaQueue;
|
|
|
|
OSIoMesg* ioMesg = &gAudioContext.syncDmaIoMesg;
|
2021-07-27 23:44:58 +00:00
|
|
|
size = ALIGN16(size);
|
|
|
|
|
|
|
|
Audio_osInvalDCache(addr, size);
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
if (size < 0x400) {
|
|
|
|
break;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_Dma(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, 0x400, msgQueue, medium, "FastCopy");
|
2021-07-27 23:44:58 +00:00
|
|
|
osRecvMesg(msgQueue, NULL, OS_MESG_BLOCK);
|
|
|
|
size -= 0x400;
|
|
|
|
devAddr += 0x400;
|
|
|
|
addr += 0x400;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (size != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_Dma(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, size, msgQueue, medium, "FastCopy");
|
2021-07-27 23:44:58 +00:00
|
|
|
osRecvMesg(msgQueue, NULL, OS_MESG_BLOCK);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* addr, u32 size, s32 unkMediumParam) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
|
|
|
|
OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType) {
|
2021-07-27 23:44:58 +00:00
|
|
|
OSPiHandle* handle;
|
|
|
|
|
|
|
|
if (gAudioContext.resetTimer > 0x10) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
switch (medium) {
|
|
|
|
case MEDIUM_CART:
|
2021-07-27 23:44:58 +00:00
|
|
|
handle = gAudioContext.cartHandle;
|
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case MEDIUM_DISK_DRIVE:
|
|
|
|
// driveHandle is uninitialized and corresponds to stubbed-out disk drive support.
|
|
|
|
// SM64 Shindou called osDriveRomInit here.
|
|
|
|
handle = gAudioContext.driveHandle;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((size % 0x10) != 0) {
|
|
|
|
size = ALIGN16(size);
|
|
|
|
}
|
|
|
|
|
|
|
|
mesg->hdr.pri = priority;
|
|
|
|
mesg->hdr.retQueue = reqQueue;
|
|
|
|
mesg->dramAddr = ramAddr;
|
|
|
|
mesg->devAddr = devAddr;
|
|
|
|
mesg->size = size;
|
|
|
|
handle->transferInfo.cmdType = 2;
|
|
|
|
sDmaHandler(handle, mesg, direction);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Unused1(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SyncLoadSimple(u32 tableType, u32 fontId) {
|
|
|
|
s32 didAllocate;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncLoad(tableType, fontId, &didAllocate);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) {
|
2021-08-30 00:51:57 +00:00
|
|
|
u32 size;
|
2021-07-27 23:44:58 +00:00
|
|
|
AudioTable* sp50;
|
2021-11-07 16:58:50 +00:00
|
|
|
void* ret;
|
|
|
|
s32 medium;
|
|
|
|
s8 cachePolicy;
|
2021-08-30 00:51:57 +00:00
|
|
|
u32 devAddr;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 status;
|
2021-07-27 23:44:58 +00:00
|
|
|
u32 temp_v0;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 realId;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
realId = AudioLoad_GetRealTableIndex(tableType, id);
|
2021-07-27 23:44:58 +00:00
|
|
|
switch (tableType) {
|
|
|
|
case SEQUENCE_TABLE:
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.seqLoadStatus[realId] == 1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case FONT_TABLE:
|
|
|
|
if (gAudioContext.fontLoadStatus[realId] == 1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case SAMPLE_TABLE:
|
|
|
|
if (gAudioContext.sampleFontLoadStatus[realId] == 1) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioLoad_SearchCaches(tableType, realId);
|
|
|
|
if (ret != NULL) {
|
|
|
|
status = 2;
|
|
|
|
osSendMesg(retQueue, MK_ASYNC_MSG(retData, 0, 0, 0), OS_MESG_NOBLOCK);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
sp50 = AudioLoad_GetLoadTable(tableType);
|
|
|
|
size = sp50->entries[realId].size;
|
2021-08-30 00:51:57 +00:00
|
|
|
size = ALIGN16(size);
|
2021-11-07 16:58:50 +00:00
|
|
|
medium = sp50->entries[id].medium;
|
|
|
|
cachePolicy = sp50->entries[id].cachePolicy;
|
|
|
|
devAddr = sp50->entries[realId].romAddr;
|
|
|
|
status = 2;
|
|
|
|
switch (cachePolicy) {
|
2021-07-27 23:44:58 +00:00
|
|
|
case 0:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocPermanent(tableType, realId, size);
|
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
status = 5;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId);
|
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId);
|
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
case 4:
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId);
|
|
|
|
if (ret == NULL) {
|
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_StartAsyncLoadUnkMedium((s16)sp50->unkMediumParam, devAddr, ret, size, medium, nChunks, retQueue,
|
|
|
|
MK_ASYNC_MSG(retData, tableType, id, status));
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_StartAsyncLoad(devAddr, ret, size, medium, nChunks, retQueue,
|
|
|
|
MK_ASYNC_MSG(retData, tableType, realId, status));
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
status = 1;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (tableType) {
|
2021-11-07 16:58:50 +00:00
|
|
|
case SEQUENCE_TABLE:
|
|
|
|
AudioLoad_SetSeqLoadStatus(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case FONT_TABLE:
|
|
|
|
AudioLoad_SetFontLoadStatus(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case SAMPLE_TABLE:
|
|
|
|
AudioLoad_SetSampleFontLoadStatusAndApplyCaches(realId, status);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
return ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessLoads(s32 resetStatus) {
|
|
|
|
AudioLoad_ProcessSlowLoads(resetStatus);
|
|
|
|
AudioLoad_ProcessSamplePreloads(resetStatus);
|
|
|
|
AudioLoad_ProcessAsyncLoads(resetStatus);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetDmaHandler(DmaHandler callback) {
|
2021-07-27 23:44:58 +00:00
|
|
|
sDmaHandler = callback;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_SetUnusedHandler(void* callback) {
|
|
|
|
sUnusedHandler = callback;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitSoundFontMeta(s32 fontId) {
|
|
|
|
SoundFont* font = &gAudioContext.soundFonts[fontId];
|
|
|
|
AudioTableEntry* entry = &gAudioContext.soundFontTable->entries[fontId];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
font->sampleBankId1 = (entry->shortData1 >> 8) & 0xFF;
|
|
|
|
font->sampleBankId2 = (entry->shortData1) & 0xFF;
|
|
|
|
font->numInstruments = (entry->shortData2 >> 8) & 0xFF;
|
|
|
|
font->numDrums = entry->shortData2 & 0xFF;
|
|
|
|
font->numSfx = entry->shortData3;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Init(void* heap, u32 heapSize) {
|
2021-07-27 23:44:58 +00:00
|
|
|
char pad[0x48];
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 numFonts;
|
2021-07-27 23:44:58 +00:00
|
|
|
void* temp_v0_3;
|
|
|
|
s32 i;
|
|
|
|
u64* heapP;
|
|
|
|
u8* ctxP;
|
|
|
|
s16* u2974p;
|
|
|
|
|
|
|
|
D_801755D0 = NULL;
|
|
|
|
gAudioContext.resetTimer = 0;
|
|
|
|
|
|
|
|
{
|
|
|
|
s32 i;
|
2021-09-07 18:14:09 +00:00
|
|
|
u8* ctxP = (u8*)&gAudioContext;
|
2021-07-27 23:44:58 +00:00
|
|
|
for (i = sizeof(gAudioContext); i >= 0; i--) {
|
|
|
|
*ctxP++ = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (osTvType) {
|
|
|
|
case OS_TV_PAL:
|
|
|
|
gAudioContext.unk_2960 = 20.03042f;
|
|
|
|
gAudioContext.refreshRate = 50;
|
|
|
|
break;
|
|
|
|
case OS_TV_MPAL:
|
|
|
|
gAudioContext.unk_2960 = 16.546f;
|
|
|
|
gAudioContext.refreshRate = 60;
|
|
|
|
break;
|
|
|
|
case OS_TV_NTSC:
|
|
|
|
default:
|
|
|
|
gAudioContext.unk_2960 = 16.713f;
|
|
|
|
gAudioContext.refreshRate = 60;
|
|
|
|
}
|
|
|
|
|
|
|
|
Audio_InitMesgQueues();
|
|
|
|
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
|
|
gAudioContext.aiBufLengths[i] = 0xA0;
|
|
|
|
}
|
|
|
|
|
|
|
|
gAudioContext.totalTaskCnt = 0;
|
|
|
|
gAudioContext.rspTaskIdx = 0;
|
|
|
|
gAudioContext.curAIBufIdx = 0;
|
|
|
|
gAudioContext.soundMode = 0;
|
|
|
|
gAudioContext.currTask = NULL;
|
|
|
|
gAudioContext.rspTask[0].task.t.data_size = 0;
|
|
|
|
gAudioContext.rspTask[1].task.t.data_size = 0;
|
2021-11-07 16:58:50 +00:00
|
|
|
osCreateMesgQueue(&gAudioContext.syncDmaQueue, &gAudioContext.syncDmaMesg, 1);
|
|
|
|
osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf, 0x40);
|
|
|
|
osCreateMesgQueue(&gAudioContext.externalLoadQueue, gAudioContext.externalLoadMesgBuf,
|
|
|
|
ARRAY_COUNT(gAudioContext.externalLoadMesgBuf));
|
|
|
|
osCreateMesgQueue(&gAudioContext.preloadSampleQueue, gAudioContext.preloadSampleMesgBuf,
|
|
|
|
ARRAY_COUNT(gAudioContext.externalLoadMesgBuf));
|
2021-09-07 18:14:09 +00:00
|
|
|
gAudioContext.curAudioFrameDmaCount = 0;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sampleDmaCount = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
gAudioContext.cartHandle = osCartRomInit();
|
|
|
|
|
|
|
|
if (heap == NULL) {
|
|
|
|
gAudioContext.audioHeap = gAudioHeap;
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.audioHeapSize = D_8014A6C4.heapSize;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
|
|
|
void** hp = &heap;
|
|
|
|
gAudioContext.audioHeap = *hp;
|
|
|
|
gAudioContext.audioHeapSize = heapSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < (s32)gAudioContext.audioHeapSize / 8; i++) {
|
|
|
|
((u64*)gAudioContext.audioHeap)[i] = 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_InitMainPools(D_8014A6C4.initPoolSize);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
for (i = 0; i < 3; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN * sizeof(s16));
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.sequenceTable = (AudioTable*)gSequenceTable;
|
|
|
|
gAudioContext.soundFontTable = (AudioTable*)gSoundFontTable;
|
|
|
|
gAudioContext.sampleBankTable = (AudioTable*)gSampleBankTable;
|
|
|
|
gAudioContext.sequenceFontTable = gSequenceFontTable;
|
|
|
|
gAudioContext.numSequences = gAudioContext.sequenceTable->numEntries;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-08-30 00:08:41 +00:00
|
|
|
gAudioContext.audioResetSpecIdToLoad = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
gAudioContext.resetStatus = 1;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_ResetStep();
|
|
|
|
AudioLoad_InitTable(gAudioContext.sequenceTable, _AudioseqSegmentRomStart, 0);
|
|
|
|
AudioLoad_InitTable(gAudioContext.soundFontTable, _AudiobankSegmentRomStart, 0);
|
|
|
|
AudioLoad_InitTable(gAudioContext.sampleBankTable, _AudiotableSegmentRomStart, 0);
|
|
|
|
numFonts = gAudioContext.soundFontTable->numEntries;
|
|
|
|
gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont));
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < numFonts; i++) {
|
|
|
|
AudioLoad_InitSoundFontMeta(i);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (temp_v0_3 = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), temp_v0_3 == NULL) {
|
|
|
|
// cast away const from D_8014A6C4
|
|
|
|
*((u32*)&D_8014A6C4.permanentPoolSize) = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, temp_v0_3, D_8014A6C4.permanentPoolSize);
|
|
|
|
gAudioContextInitalized = true;
|
|
|
|
osSendMesg(gAudioContext.taskStartQueueP, (void*)gAudioContext.totalTaskCnt, OS_MESG_NOBLOCK);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitSlowLoads(void) {
|
|
|
|
gAudioContext.slowLoads[0].status = 0;
|
|
|
|
gAudioContext.slowLoads[1].status = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) {
|
|
|
|
SoundFontSample* sample;
|
|
|
|
AudioSlowLoad* slowLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = AudioLoad_GetFontSample(fontId, instId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (sample == NULL) {
|
|
|
|
*isDone = 0;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (sample->medium == MEDIUM_RAM) {
|
2021-07-27 23:44:58 +00:00
|
|
|
*isDone = 2;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad = &gAudioContext.slowLoads[gAudioContext.slowLoadPos];
|
|
|
|
if (slowLoad->status == LOAD_STATUS_DONE) {
|
|
|
|
slowLoad->status = LOAD_STATUS_WAITING;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->sample = *sample;
|
|
|
|
slowLoad->isDone = isDone;
|
|
|
|
slowLoad->curRamAddr =
|
|
|
|
AudioHeap_AllocSampleCache(sample->size, fontId, sample->sampleAddr, sample->medium, CACHE_TEMPORARY);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (slowLoad->curRamAddr == NULL) {
|
|
|
|
if (sample->medium == MEDIUM_UNK || sample->codec == CODEC_S16_INMEMORY) {
|
2021-07-27 23:44:58 +00:00
|
|
|
*isDone = 0;
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
*isDone = 3;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->status = LOAD_STATUS_START;
|
|
|
|
slowLoad->bytesRemaining = ALIGN16(sample->size);
|
|
|
|
slowLoad->ramAddr = slowLoad->curRamAddr;
|
|
|
|
slowLoad->curDevAddr = sample->sampleAddr;
|
|
|
|
slowLoad->medium = sample->medium;
|
|
|
|
slowLoad->seqOrFontId = fontId;
|
|
|
|
slowLoad->instId = instId;
|
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
|
|
|
slowLoad->unkMediumParam = gAudioContext.sampleBankTable->unkMediumParam;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.slowLoadPos ^= 1;
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId) {
|
|
|
|
SoundFontSample* ret;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (instId < 0x80) {
|
|
|
|
Instrument* instrument = Audio_GetInstrumentInner(fontId, instId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (instrument == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
ret = instrument->normalNotesSound.sample;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (instId < 0x100) {
|
|
|
|
Drum* drum = Audio_GetDrum(fontId, instId - 0x80);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (drum == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
ret = drum->sound.sample;
|
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontSound* sound = Audio_GetSfx(fontId, instId - 0x100);
|
|
|
|
if (sound == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
ret = sound->sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Unused2(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_FinishSlowLoad(AudioSlowLoad* slowLoad) {
|
|
|
|
SoundFontSample* sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (slowLoad->sample.sampleAddr == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = AudioLoad_GetFontSample(slowLoad->seqOrFontId, slowLoad->instId);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (sample == NULL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->sample = *sample;
|
|
|
|
sample->sampleAddr = slowLoad->ramAddr;
|
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessSlowLoads(s32 resetStatus) {
|
|
|
|
AudioSlowLoad* slowLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gAudioContext.slowLoads); i++) {
|
|
|
|
slowLoad = &gAudioContext.slowLoads[i];
|
|
|
|
switch (gAudioContext.slowLoads[i].status) {
|
2021-07-27 23:44:58 +00:00
|
|
|
case LOAD_STATUS_LOADING:
|
2021-11-07 16:58:50 +00:00
|
|
|
if (slowLoad->medium != MEDIUM_UNK) {
|
|
|
|
osRecvMesg(&slowLoad->msgqueue, NULL, OS_MESG_BLOCK);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (resetStatus != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->status = LOAD_STATUS_DONE;
|
2021-07-27 23:44:58 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
case LOAD_STATUS_START:
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->status = LOAD_STATUS_LOADING;
|
|
|
|
if (slowLoad->bytesRemaining == 0) {
|
|
|
|
AudioLoad_FinishSlowLoad(slowLoad);
|
|
|
|
slowLoad->status = LOAD_STATUS_DONE;
|
|
|
|
*slowLoad->isDone = 1;
|
|
|
|
} else if (slowLoad->bytesRemaining < 0x400) {
|
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
|
|
|
u32 size = slowLoad->bytesRemaining;
|
|
|
|
AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, size,
|
|
|
|
slowLoad->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_DmaSlowCopy(slowLoad, slowLoad->bytesRemaining);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->bytesRemaining = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, 0x400,
|
|
|
|
slowLoad->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_DmaSlowCopy(slowLoad, 0x400);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->bytesRemaining -= 0x400;
|
|
|
|
slowLoad->curRamAddr += 0x400;
|
|
|
|
slowLoad->curDevAddr += 0x400;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size) {
|
|
|
|
Audio_osInvalDCache(slowLoad->curRamAddr, size);
|
|
|
|
osCreateMesgQueue(&slowLoad->msgqueue, &slowLoad->msg, 1);
|
|
|
|
AudioLoad_Dma(&slowLoad->ioMesg, 0U, 0, slowLoad->curDevAddr, slowLoad->curRamAddr, size, &slowLoad->msgqueue,
|
|
|
|
slowLoad->medium, "SLOWCOPY");
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_DmaSlowCopyUnkMedium(s32 devAddr, u8* ramAddr, s32 size, s32 arg3) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_SlowLoadSeq(s32 seqId, u8* ramAddr, s8* isDone) {
|
|
|
|
AudioSlowLoad* slowLoad;
|
|
|
|
AudioTable* seqTable;
|
2021-07-27 23:44:58 +00:00
|
|
|
u32 size;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (seqId >= gAudioContext.numSequences) {
|
2021-07-27 23:44:58 +00:00
|
|
|
*isDone = 0;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
seqId = AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId);
|
|
|
|
seqTable = AudioLoad_GetLoadTable(SEQUENCE_TABLE);
|
|
|
|
slowLoad = &gAudioContext.slowLoads[gAudioContext.slowLoadPos];
|
|
|
|
if (slowLoad->status == LOAD_STATUS_DONE) {
|
|
|
|
slowLoad->status = LOAD_STATUS_WAITING;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->sample.sampleAddr = NULL;
|
|
|
|
slowLoad->isDone = isDone;
|
|
|
|
size = seqTable->entries[seqId].size;
|
2021-07-27 23:44:58 +00:00
|
|
|
size = ALIGN16(size);
|
2021-11-07 16:58:50 +00:00
|
|
|
slowLoad->curRamAddr = ramAddr;
|
|
|
|
slowLoad->status = LOAD_STATUS_START;
|
|
|
|
slowLoad->bytesRemaining = size;
|
|
|
|
slowLoad->ramAddr = ramAddr;
|
|
|
|
slowLoad->curDevAddr = seqTable->entries[seqId].romAddr;
|
|
|
|
slowLoad->medium = seqTable->entries[seqId].medium;
|
|
|
|
slowLoad->seqOrFontId = seqId;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (slowLoad->medium == MEDIUM_UNK) {
|
|
|
|
slowLoad->unkMediumParam = seqTable->unkMediumParam;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.slowLoadPos ^= 1;
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitAsyncLoads(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) {
|
|
|
|
gAudioContext.asyncLoads[i].status = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoadUnkMedium(s32 unkMediumParam, u32 devAddr, void* ramAddr, s32 size, s32 medium,
|
|
|
|
s32 nChunks, OSMesgQueue* retQueue, s32 retMsg) {
|
|
|
|
AudioAsyncLoad* asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad = AudioLoad_StartAsyncLoad(devAddr, ramAddr, size, medium, nChunks, retQueue, retMsg);
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
osSendMesg(&gAudioContext.asyncLoadUnkMediumQueue, asyncLoad, OS_MESG_NOBLOCK);
|
|
|
|
asyncLoad->unkMediumParam = unkMediumParam;
|
|
|
|
return asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, void* ramAddr, u32 size, s32 medium, s32 nChunks,
|
|
|
|
OSMesgQueue* retQueue, s32 retMsg) {
|
|
|
|
AudioAsyncLoad* asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) {
|
|
|
|
if (gAudioContext.asyncLoads[i].status == 0) {
|
|
|
|
asyncLoad = &gAudioContext.asyncLoads[i];
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
// no more available async loads
|
|
|
|
if (i == ARRAY_COUNT(gAudioContext.asyncLoads)) {
|
2021-07-27 23:44:58 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->status = LOAD_STATUS_START;
|
|
|
|
asyncLoad->curDevAddr = devAddr;
|
|
|
|
asyncLoad->ramAddr = ramAddr;
|
|
|
|
asyncLoad->curRamAddr = ramAddr;
|
|
|
|
asyncLoad->bytesRemaining = size;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
if (nChunks == 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->chunkSize = 0x1000;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else if (nChunks == 1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->chunkSize = size;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->chunkSize = (((s32)size / nChunks) + 0xFF) & ~0xFF;
|
|
|
|
if (asyncLoad->chunkSize < 0x100) {
|
|
|
|
asyncLoad->chunkSize = 0x100;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->retQueue = retQueue;
|
|
|
|
asyncLoad->delay = 3;
|
|
|
|
asyncLoad->medium = medium;
|
|
|
|
asyncLoad->retMsg = retMsg;
|
|
|
|
osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1);
|
|
|
|
return asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessAsyncLoads(s32 resetStatus) {
|
|
|
|
AudioAsyncLoad* asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
|
|
|
if (gAudioContext.resetTimer == 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.curUnkMediumLoad == NULL) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (resetStatus != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
// Clear and ignore queue if resetting.
|
2021-07-27 23:44:58 +00:00
|
|
|
do {
|
2021-11-07 16:58:50 +00:00
|
|
|
} while (osRecvMesg(&gAudioContext.asyncLoadUnkMediumQueue, (OSMesg*)&asyncLoad, OS_MESG_NOBLOCK) != -1);
|
|
|
|
} else if (osRecvMesg(&gAudioContext.asyncLoadUnkMediumQueue, (OSMesg*)&asyncLoad, OS_MESG_NOBLOCK) == -1) {
|
|
|
|
gAudioContext.curUnkMediumLoad = NULL;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.curUnkMediumLoad = asyncLoad;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.curUnkMediumLoad != NULL) {
|
|
|
|
AudioLoad_ProcessAsyncLoadUnkMedium(gAudioContext.curUnkMediumLoad, resetStatus);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) {
|
|
|
|
if (gAudioContext.asyncLoads[i].status == 1) {
|
|
|
|
asyncLoad = &gAudioContext.asyncLoads[i];
|
|
|
|
if (asyncLoad->medium != MEDIUM_UNK) {
|
|
|
|
AudioLoad_ProcessAsyncLoad(asyncLoad, resetStatus);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessAsyncLoadUnkMedium(AudioAsyncLoad* asyncLoad, s32 resetStatus) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_FinishAsyncLoad(AudioAsyncLoad* asyncLoad) {
|
|
|
|
u32 retMsg = asyncLoad->retMsg;
|
|
|
|
u32 fontId;
|
2021-07-27 23:44:58 +00:00
|
|
|
u32 pad;
|
|
|
|
OSMesg doneMsg;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 sampleBankId1;
|
|
|
|
u32 sampleBankId2;
|
|
|
|
RelocInfo relocInfo;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
|
|
|
if (1) {}
|
|
|
|
switch (ASYNC_TBLTYPE(retMsg)) {
|
|
|
|
case SEQUENCE_TABLE:
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SetSeqLoadStatus(ASYNC_ID(retMsg), ASYNC_STATUS(retMsg));
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case SAMPLE_TABLE:
|
|
|
|
AudioLoad_SetSampleFontLoadStatusAndApplyCaches(ASYNC_ID(retMsg), ASYNC_STATUS(retMsg));
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
2021-11-07 16:58:50 +00:00
|
|
|
case FONT_TABLE:
|
|
|
|
fontId = ASYNC_ID(retMsg);
|
|
|
|
sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
|
|
|
|
sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
|
|
|
|
relocInfo.sampleBankId1 = sampleBankId1;
|
|
|
|
relocInfo.sampleBankId2 = sampleBankId2;
|
|
|
|
relocInfo.baseAddr1 =
|
|
|
|
sampleBankId1 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId1, &relocInfo.medium1) : 0;
|
|
|
|
relocInfo.baseAddr2 =
|
|
|
|
sampleBankId2 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId2, &relocInfo.medium2) : 0;
|
|
|
|
AudioLoad_SetFontLoadStatus(fontId, ASYNC_STATUS(retMsg));
|
|
|
|
AudioLoad_RelocateFontAndPreloadSamples(fontId, asyncLoad->ramAddr, &relocInfo, true);
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
doneMsg = asyncLoad->retMsg;
|
2021-07-27 23:44:58 +00:00
|
|
|
if (1) {}
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->status = LOAD_STATUS_WAITING;
|
|
|
|
osSendMesg(asyncLoad->retQueue, doneMsg, OS_MESG_NOBLOCK);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus) {
|
|
|
|
AudioTable* sampleBankTable = gAudioContext.sampleBankTable;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad->delay >= 2) {
|
|
|
|
asyncLoad->delay--;
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad->delay == 1) {
|
|
|
|
asyncLoad->delay = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else if (resetStatus != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
// Await the previous DMA response synchronously, then return.
|
|
|
|
osRecvMesg(&asyncLoad->msgQueue, NULL, OS_MESG_BLOCK);
|
|
|
|
asyncLoad->status = LOAD_STATUS_WAITING;
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
2021-11-07 16:58:50 +00:00
|
|
|
} else if (osRecvMesg(&asyncLoad->msgQueue, NULL, OS_MESG_NOBLOCK) == -1) {
|
|
|
|
// If the previous DMA step isn't done, return.
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad->bytesRemaining == 0) {
|
|
|
|
AudioLoad_FinishAsyncLoad(asyncLoad);
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad->bytesRemaining < asyncLoad->chunkSize) {
|
|
|
|
if (asyncLoad->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->bytesRemaining,
|
|
|
|
sampleBankTable->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AsyncDma(asyncLoad, asyncLoad->bytesRemaining);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->bytesRemaining = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (asyncLoad->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->chunkSize,
|
|
|
|
sampleBankTable->unkMediumParam);
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AsyncDma(asyncLoad, asyncLoad->chunkSize);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
asyncLoad->bytesRemaining -= asyncLoad->chunkSize;
|
|
|
|
asyncLoad->curDevAddr += asyncLoad->chunkSize;
|
|
|
|
asyncLoad->curRamAddr += asyncLoad->chunkSize;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size) {
|
2021-07-27 23:44:58 +00:00
|
|
|
size = ALIGN16(size);
|
2021-11-07 16:58:50 +00:00
|
|
|
Audio_osInvalDCache(asyncLoad->curRamAddr, size);
|
|
|
|
osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1);
|
|
|
|
AudioLoad_Dma(&asyncLoad->ioMesg, 0, 0, asyncLoad->curDevAddr, asyncLoad->curRamAddr, size, &asyncLoad->msgQueue,
|
|
|
|
asyncLoad->medium, "BGCOPY");
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, void* ramAddr, u32 size, s16 arg3) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
#define RELOC(v, base) (reloc = (void*)((u32)(v) + (u32)(base)))
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo) {
|
|
|
|
SoundFontSample* sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
void* reloc;
|
|
|
|
|
|
|
|
if ((u32)sound->sample <= 0x80000000) {
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = sound->sample = RELOC(sound->sample, mem);
|
|
|
|
if (sample->size != 0 && sample->unk_bit25 != 1) {
|
|
|
|
sample->loop = RELOC(sample->loop, mem);
|
|
|
|
sample->book = RELOC(sample->book, mem);
|
|
|
|
|
|
|
|
// Resolve the sample medium 2-bit bitfield into a real value based on relocInfo.
|
2021-08-31 22:53:35 +00:00
|
|
|
switch (sample->medium) {
|
2021-07-27 23:44:58 +00:00
|
|
|
case 0:
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1);
|
|
|
|
sample->medium = relocInfo->medium1;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr2);
|
|
|
|
sample->medium = relocInfo->medium2;
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
case 3:
|
2021-11-07 16:58:50 +00:00
|
|
|
// Invalid? This leaves sample->medium as MEDIUM_CART and MEDIUM_DISK_DRIVE
|
|
|
|
// respectively, and the sampleAddr unrelocated.
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->unk_bit25 = 1;
|
|
|
|
if (sample->unk_bit26 && (sample->medium != MEDIUM_RAM)) {
|
|
|
|
gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-07 18:14:09 +00:00
|
|
|
#undef RELOC
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo, s32 async) {
|
|
|
|
AudioPreloadReq* preload;
|
|
|
|
AudioPreloadReq* topPreload;
|
|
|
|
SoundFontSample* sample;
|
|
|
|
s32 size;
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 nChunks;
|
|
|
|
u8* addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 preloadInProgress;
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
preloadInProgress = false;
|
|
|
|
if (gAudioContext.preloadSampleStackTop != 0) {
|
|
|
|
preloadInProgress = true;
|
2021-09-07 18:14:09 +00:00
|
|
|
} else {
|
|
|
|
D_8016B780 = 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.numUsedSamples = 0;
|
|
|
|
AudioLoad_RelocateFont(fontId, mem, relocInfo);
|
|
|
|
|
|
|
|
size = 0;
|
|
|
|
for (i = 0; i < gAudioContext.numUsedSamples; i++) {
|
|
|
|
size += ALIGN16(gAudioContext.usedSamples[i]->size);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
if (size && size) {}
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < gAudioContext.numUsedSamples; i++) {
|
|
|
|
if (gAudioContext.preloadSampleStackTop == 120) {
|
2021-09-07 18:14:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = gAudioContext.usedSamples[i];
|
2021-09-07 18:14:09 +00:00
|
|
|
addr = NULL;
|
2021-11-07 16:58:50 +00:00
|
|
|
switch (async) {
|
|
|
|
case false:
|
2021-09-07 18:14:09 +00:00
|
|
|
if (sample->medium == relocInfo->medium1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_PERSISTENT);
|
2021-09-07 18:14:09 +00:00
|
|
|
} else if (sample->medium == relocInfo->medium2) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_PERSISTENT);
|
|
|
|
} else if (sample->medium == MEDIUM_DISK_DRIVE) {
|
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium,
|
|
|
|
CACHE_PERSISTENT);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
case true:
|
2021-09-07 18:14:09 +00:00
|
|
|
if (sample->medium == relocInfo->medium1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_TEMPORARY);
|
2021-09-07 18:14:09 +00:00
|
|
|
} else if (sample->medium == relocInfo->medium2) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_TEMPORARY);
|
|
|
|
} else if (sample->medium == MEDIUM_DISK_DRIVE) {
|
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium,
|
|
|
|
CACHE_TEMPORARY);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (addr == NULL) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
switch (async) {
|
|
|
|
case false:
|
|
|
|
if (sample->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_SyncDmaUnkMedium((u32)sample->sampleAddr, addr, sample->size,
|
|
|
|
gAudioContext.sampleBankTable->unkMediumParam);
|
2021-09-07 18:14:09 +00:00
|
|
|
sample->sampleAddr = addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-09-07 18:14:09 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncDma((u32)sample->sampleAddr, addr, sample->size, sample->medium);
|
2021-09-07 18:14:09 +00:00
|
|
|
sample->sampleAddr = addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
if (sample->medium == MEDIUM_DISK_DRIVE) {}
|
2021-09-07 18:14:09 +00:00
|
|
|
break;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
case true:
|
|
|
|
preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop];
|
|
|
|
preload->sample = sample;
|
|
|
|
preload->ramAddr = addr;
|
|
|
|
preload->encodedInfo = (gAudioContext.preloadSampleStackTop << 24) | 0xFFFFFF;
|
|
|
|
preload->isFree = false;
|
|
|
|
preload->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium;
|
|
|
|
gAudioContext.preloadSampleStackTop++;
|
2021-09-07 18:14:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.numUsedSamples = 0;
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.preloadSampleStackTop != 0 && !preloadInProgress) {
|
|
|
|
topPreload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1];
|
|
|
|
sample = topPreload->sample;
|
2021-09-07 18:14:09 +00:00
|
|
|
nChunks = (sample->size >> 12) + 1;
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, topPreload->ramAddr, sample->size, sample->medium, nChunks,
|
|
|
|
&gAudioContext.preloadSampleQueue, topPreload->encodedInfo);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
}
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus) {
|
|
|
|
SoundFontSample* sample;
|
|
|
|
AudioPreloadReq* preload;
|
|
|
|
u32 preloadIndex;
|
2021-08-30 00:51:57 +00:00
|
|
|
u32 key;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 nChunks;
|
2021-08-30 00:51:57 +00:00
|
|
|
s32 pad;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.preloadSampleStackTop > 0) {
|
2021-07-27 23:44:58 +00:00
|
|
|
if (resetStatus != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
// Clear result queue and preload stack and return.
|
|
|
|
osRecvMesg(&gAudioContext.preloadSampleQueue, (OSMesg*)&preloadIndex, OS_MESG_NOBLOCK);
|
|
|
|
gAudioContext.preloadSampleStackTop = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
if (osRecvMesg(&gAudioContext.preloadSampleQueue, (OSMesg*)&preloadIndex, OS_MESG_NOBLOCK) == -1) {
|
|
|
|
// Previous preload is not done yet.
|
2021-07-27 23:44:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
preloadIndex >>= 24;
|
|
|
|
preload = &gAudioContext.preloadSampleStack[preloadIndex];
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (preload->isFree == false) {
|
|
|
|
sample = preload->sample;
|
2021-08-31 22:53:35 +00:00
|
|
|
key = (u32)sample->sampleAddr + sample->size + sample->medium;
|
2021-11-07 16:58:50 +00:00
|
|
|
if (key == preload->endAndMediumKey) {
|
|
|
|
// Change storage for sample to the preloaded version.
|
|
|
|
sample->sampleAddr = preload->ramAddr;
|
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
preload->isFree = true;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
// Pop requests with isFree = true off the stack, as far as possible,
|
|
|
|
// and dispatch the next DMA.
|
2021-08-30 00:51:57 +00:00
|
|
|
for (;;) {
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.preloadSampleStackTop <= 0) {
|
2021-08-30 00:51:57 +00:00
|
|
|
break;
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1];
|
|
|
|
if (preload->isFree == true) {
|
|
|
|
gAudioContext.preloadSampleStackTop--;
|
2021-07-27 23:44:58 +00:00
|
|
|
continue;
|
2021-08-30 00:51:57 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = preload->sample;
|
|
|
|
nChunks = (sample->size >> 12) + 1;
|
2021-08-31 22:53:35 +00:00
|
|
|
key = (u32)sample->sampleAddr + sample->size + sample->medium;
|
2021-11-07 16:58:50 +00:00
|
|
|
if (key != preload->endAndMediumKey) {
|
|
|
|
preload->isFree = true;
|
|
|
|
gAudioContext.preloadSampleStackTop--;
|
2021-07-27 23:44:58 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, preload->ramAddr, sample->size, sample->medium,
|
|
|
|
nChunks, &gAudioContext.preloadSampleQueue, preload->encodedInfo);
|
2021-08-30 00:51:57 +00:00
|
|
|
break;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_AddToSampleSet(SoundFontSample* sample, s32 numSamples, SoundFontSample** sampleSet) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < numSamples; i++) {
|
|
|
|
if (sample->sampleAddr == sampleSet[i]->sampleAddr) {
|
2021-07-27 23:44:58 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (i == numSamples) {
|
|
|
|
sampleSet[numSamples] = sample;
|
|
|
|
numSamples++;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
return numSamples;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 i;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 numDrums;
|
|
|
|
s32 numInstruments;
|
|
|
|
s32 numSamples = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
numDrums = gAudioContext.soundFonts[fontId].numDrums;
|
|
|
|
numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < numDrums; i++) {
|
|
|
|
Drum* drum = Audio_GetDrum(fontId, i);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (1) {}
|
|
|
|
if (drum != NULL) {
|
2021-11-07 16:58:50 +00:00
|
|
|
numSamples = AudioLoad_AddToSampleSet(drum->sound.sample, numSamples, sampleSet);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < numInstruments; i++) {
|
|
|
|
Instrument* instrument = Audio_GetInstrumentInner(fontId, i);
|
2021-07-27 23:44:58 +00:00
|
|
|
if (instrument != NULL) {
|
|
|
|
if (instrument->normalRangeLo != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
numSamples = AudioLoad_AddToSampleSet(instrument->lowNotesSound.sample, numSamples, sampleSet);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
if (instrument->normalRangeHi != 0x7F) {
|
2021-11-07 16:58:50 +00:00
|
|
|
numSamples = AudioLoad_AddToSampleSet(instrument->highNotesSound.sample, numSamples, sampleSet);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
numSamples = AudioLoad_AddToSampleSet(instrument->normalNotesSound.sample, numSamples, sampleSet);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
|
|
|
|
// Should really also process sfx, but this method is never called, so whatever.
|
|
|
|
return numSamples;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_AddUsedSample(SoundFontSound* sound) {
|
|
|
|
SoundFontSample* sample = sound->sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if ((sample->size != 0) && (sample->unk_bit26) && (sample->medium != MEDIUM_RAM)) {
|
|
|
|
gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, RelocInfo* relocInfo) {
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 numDrums;
|
|
|
|
s32 numInstruments;
|
|
|
|
s32 numSfx;
|
|
|
|
Drum* drum;
|
|
|
|
Instrument* instrument;
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontSound* sound;
|
|
|
|
AudioPreloadReq* preload;
|
|
|
|
AudioPreloadReq* topPreload;
|
2021-09-07 18:14:09 +00:00
|
|
|
u8* addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
s32 size;
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 i;
|
2021-11-07 16:58:50 +00:00
|
|
|
SoundFontSample* sample;
|
|
|
|
s32 preloadInProgress;
|
2021-09-07 18:14:09 +00:00
|
|
|
s32 nChunks;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
preloadInProgress = false;
|
|
|
|
if (gAudioContext.preloadSampleStackTop != 0) {
|
|
|
|
preloadInProgress = true;
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.numUsedSamples = 0;
|
|
|
|
|
|
|
|
numDrums = gAudioContext.soundFonts[fontId].numDrums;
|
|
|
|
numInstruments = gAudioContext.soundFonts[fontId].numInstruments;
|
|
|
|
numSfx = gAudioContext.soundFonts[fontId].numSfx;
|
2021-09-07 18:14:09 +00:00
|
|
|
|
|
|
|
for (i = 0; i < numInstruments; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
instrument = Audio_GetInstrumentInner(fontId, i);
|
2021-09-07 18:14:09 +00:00
|
|
|
if (instrument != NULL) {
|
|
|
|
if (instrument->normalRangeLo != 0) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AddUsedSample(&instrument->lowNotesSound);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
if (instrument->normalRangeHi != 0x7F) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AddUsedSample(&instrument->highNotesSound);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AddUsedSample(&instrument->normalNotesSound);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < numDrums; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
drum = Audio_GetDrum(fontId, i);
|
2021-09-07 18:14:09 +00:00
|
|
|
if (drum != NULL) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AddUsedSample(&drum->sound);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < numSfx; i++) {
|
2021-11-07 16:58:50 +00:00
|
|
|
sound = Audio_GetSfx(fontId, i);
|
2021-09-07 18:14:09 +00:00
|
|
|
if (sound != NULL) {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_AddUsedSample(sound);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.numUsedSamples == 0) {
|
2021-09-07 18:14:09 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
size = 0;
|
|
|
|
for (i = 0; i < gAudioContext.numUsedSamples; i++) {
|
|
|
|
size += ALIGN16(gAudioContext.usedSamples[i]->size);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
if (size) {}
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
for (i = 0; i < gAudioContext.numUsedSamples; i++) {
|
|
|
|
if (gAudioContext.preloadSampleStackTop == 120) {
|
2021-09-07 18:14:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sample = gAudioContext.usedSamples[i];
|
|
|
|
if (sample->medium == MEDIUM_RAM) {
|
2021-09-07 18:14:09 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
switch (async) {
|
|
|
|
case false:
|
2021-09-07 18:14:09 +00:00
|
|
|
if (sample->medium == relocInfo->medium1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_PERSISTENT);
|
2021-09-07 18:14:09 +00:00
|
|
|
} else if (sample->medium == relocInfo->medium2) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_PERSISTENT);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
case true:
|
2021-09-07 18:14:09 +00:00
|
|
|
if (sample->medium == relocInfo->medium1) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_TEMPORARY);
|
2021-09-07 18:14:09 +00:00
|
|
|
} else if (sample->medium == relocInfo->medium2) {
|
2021-11-07 16:58:50 +00:00
|
|
|
addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr,
|
|
|
|
sample->medium, CACHE_TEMPORARY);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (addr == NULL) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
switch (async) {
|
|
|
|
case false:
|
|
|
|
if (sample->medium == MEDIUM_UNK) {
|
|
|
|
AudioLoad_SyncDmaUnkMedium((u32)sample->sampleAddr, addr, sample->size,
|
|
|
|
gAudioContext.sampleBankTable->unkMediumParam);
|
2021-09-07 18:14:09 +00:00
|
|
|
sample->sampleAddr = addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-09-07 18:14:09 +00:00
|
|
|
} else {
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_SyncDma((u32)sample->sampleAddr, addr, sample->size, sample->medium);
|
2021-09-07 18:14:09 +00:00
|
|
|
sample->sampleAddr = addr;
|
2021-11-07 16:58:50 +00:00
|
|
|
sample->medium = MEDIUM_RAM;
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
case true:
|
|
|
|
preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop];
|
|
|
|
preload->sample = sample;
|
|
|
|
preload->ramAddr = addr;
|
|
|
|
preload->encodedInfo = (gAudioContext.preloadSampleStackTop << 24) | 0xFFFFFF;
|
|
|
|
preload->isFree = false;
|
|
|
|
preload->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium;
|
|
|
|
gAudioContext.preloadSampleStackTop++;
|
2021-09-07 18:14:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
gAudioContext.numUsedSamples = 0;
|
2021-09-07 18:14:09 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (gAudioContext.preloadSampleStackTop != 0 && !preloadInProgress) {
|
|
|
|
topPreload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1];
|
|
|
|
sample = topPreload->sample;
|
2021-09-07 18:14:09 +00:00
|
|
|
nChunks = (sample->size >> 12) + 1;
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, topPreload->ramAddr, sample->size, sample->medium, nChunks,
|
|
|
|
&gAudioContext.preloadSampleQueue, topPreload->encodedInfo);
|
2021-09-07 18:14:09 +00:00
|
|
|
}
|
|
|
|
}
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_LoadPermanentSamples(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 pad;
|
2021-11-07 16:58:50 +00:00
|
|
|
u32 fontId;
|
|
|
|
AudioTable* sampleBankTable;
|
2021-07-27 23:44:58 +00:00
|
|
|
s32 pad2;
|
|
|
|
s32 i;
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
sampleBankTable = AudioLoad_GetLoadTable(SAMPLE_TABLE);
|
|
|
|
for (i = 0; i < gAudioContext.permanentPool.count; i++) {
|
|
|
|
RelocInfo relocInfo;
|
|
|
|
|
|
|
|
if (gAudioContext.permanentCache[i].tableType == FONT_TABLE) {
|
|
|
|
fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.permanentCache[i].id);
|
|
|
|
relocInfo.sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1;
|
|
|
|
relocInfo.sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2;
|
|
|
|
|
|
|
|
if (relocInfo.sampleBankId1 != 0xFF) {
|
|
|
|
relocInfo.sampleBankId1 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId1);
|
|
|
|
relocInfo.medium1 = sampleBankTable->entries[relocInfo.sampleBankId1].medium;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (relocInfo.sampleBankId2 != 0xFF) {
|
|
|
|
relocInfo.sampleBankId2 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId2);
|
|
|
|
relocInfo.medium2 = sampleBankTable->entries[relocInfo.sampleBankId2].medium;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
2021-11-07 16:58:50 +00:00
|
|
|
AudioLoad_PreloadSamplesForFont(fontId, false, &relocInfo);
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Unused3(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Unused4(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_Unused5(void) {
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ScriptLoad(s32 tableType, s32 id, s8* isDone) {
|
|
|
|
static u32 sLoadIndex = 0;
|
|
|
|
sScriptLoadDonePointers[sLoadIndex] = isDone;
|
|
|
|
AudioLoad_AsyncLoad(tableType, id, 0, sLoadIndex, &sScriptLoadQueue);
|
|
|
|
sLoadIndex++;
|
|
|
|
if (sLoadIndex == 0x10) {
|
|
|
|
sLoadIndex = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_ProcessScriptLoads(void) {
|
|
|
|
u32 temp;
|
2021-07-27 23:44:58 +00:00
|
|
|
u32 sp20;
|
2021-11-07 16:58:50 +00:00
|
|
|
s8* isDone;
|
2021-07-27 23:44:58 +00:00
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
if (osRecvMesg(&sScriptLoadQueue, (OSMesg*)&sp20, OS_MESG_NOBLOCK) != -1) {
|
|
|
|
temp = sp20 >> 24;
|
|
|
|
isDone = sScriptLoadDonePointers[temp];
|
|
|
|
if (isDone != NULL) {
|
|
|
|
*isDone = 0;
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:58:50 +00:00
|
|
|
void AudioLoad_InitScriptLoads(void) {
|
|
|
|
osCreateMesgQueue(&sScriptLoadQueue, sScriptLoadMesgBuf, ARRAY_COUNT(sScriptLoadMesgBuf));
|
2021-07-27 23:44:58 +00:00
|
|
|
}
|