Bugfix: patch_audio_bank crash (hopefully) resolved for good

This commit is contained in:
gheskett
2022-07-15 00:25:18 -04:00
parent 62d6ee135f
commit 8698cc0f89
3 changed files with 30 additions and 50 deletions

View File

@@ -274,7 +274,7 @@ void sound_alloc_pool_init(struct SoundAllocPool *pool, void *memAddr, u32 size)
#ifdef VERSION_SH #ifdef VERSION_SH
pool->size = size - ((uintptr_t) memAddr & 0xf); pool->size = size - ((uintptr_t) memAddr & 0xf);
#else #else
pool->size = size; pool->size = ALIGN16(size);
#endif #endif
pool->numAllocatedEntries = 0; pool->numAllocatedEntries = 0;
} }
@@ -408,6 +408,8 @@ void *alloc_bank_or_seq(struct SoundMultiPool *arg0, s32 arg1, s32 size, s32 arg
u32 leftAvail, rightAvail; u32 leftAvail, rightAvail;
#endif #endif
size = ALIGN16(size);
#ifdef VERSION_SH #ifdef VERSION_SH
switch (poolIdx) { switch (poolIdx) {
case 0: case 0:
@@ -656,7 +658,7 @@ void *alloc_bank_or_seq(struct SoundMultiPool *arg0, s32 arg1, s32 size, s32 arg
#if defined(VERSION_SH) #if defined(VERSION_SH)
tp->entries[1].ptr = (u8 *) ((uintptr_t) (pool->start + pool->size - size) & ~0x0f); tp->entries[1].ptr = (u8 *) ((uintptr_t) (pool->start + pool->size - size) & ~0x0f);
#else #else
tp->entries[1].ptr = pool->start + pool->size - size - 0x10; tp->entries[1].ptr = pool->start + pool->size - size;
#endif #endif
tp->entries[1].id = id; tp->entries[1].id = id;
tp->entries[1].size = size; tp->entries[1].size = size;

View File

@@ -38,8 +38,14 @@ struct SeqOrBankEntry {
struct PersistentPool { struct PersistentPool {
/*0x00*/ u32 numEntries; /*0x00*/ u32 numEntries;
/*0x04*/ struct SoundAllocPool pool; /*0x04*/ struct SoundAllocPool pool;
#ifdef EXPAND_AUDIO_HEAP // TODO: Make this a configurable define rather than using static values
/*0x14*/ struct SeqOrBankEntry entries[64];
// size = 0x314
#else
/*0x14*/ struct SeqOrBankEntry entries[32]; /*0x14*/ struct SeqOrBankEntry entries[32];
}; // size = 0x194 // size = 0x194
#endif
};
struct TemporaryPool { struct TemporaryPool {
/*EU, SH*/ /*EU, SH*/
@@ -64,9 +70,14 @@ struct SoundMultiPool {
/* */ u32 pad2[4]; /* */ u32 pad2[4];
}; // size = 0x1D0 }; // size = 0x1D0
#ifdef VERSION_SH
struct Unk1Pool { struct Unk1Pool {
struct SoundAllocPool pool; struct SoundAllocPool pool;
#ifdef EXPAND_AUDIO_HEAP
struct SeqOrBankEntry entries[64];
#else
struct SeqOrBankEntry entries[32]; struct SeqOrBankEntry entries[32];
#endif
}; };
struct UnkEntry { struct UnkEntry {
@@ -85,6 +96,7 @@ struct UnkPool {
/*0x510*/ s32 numEntries; /*0x510*/ s32 numEntries;
/*0x514*/ u32 unk514; /*0x514*/ u32 unk514;
}; };
#endif
extern u8 gAudioHeap[]; extern u8 gAudioHeap[];
extern s16 gVolume; extern s16 gVolume;

View File

@@ -24,6 +24,8 @@ struct SharedDma {
// EU only // EU only
void port_eu_init(void); void port_eu_init(void);
ALIGNED16 u32 dmaTempBuffer[4];
struct Note *gNotes; struct Note *gNotes;
struct SequencePlayer gSequencePlayers[SEQUENCE_PLAYERS]; struct SequencePlayer gSequencePlayers[SEQUENCE_PLAYERS];
@@ -199,11 +201,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
if (arg2 != 0 || *dmaIndexRef >= sSampleDmaListSize1) { if (arg2 != 0 || *dmaIndexRef >= sSampleDmaListSize1) {
for (i = sSampleDmaListSize1; i < gSampleDmaNumListItems; i++) { for (i = sSampleDmaListSize1; i < gSampleDmaNumListItems; i++) {
#if defined(VERSION_EU)
dma = &sSampleDmas[i]; dma = &sSampleDmas[i];
#else
dma = sSampleDmas + i;
#endif
bufferPos = devAddr - dma->source; bufferPos = devAddr - dma->source;
if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) { if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) {
// We already have a DMA request for this memory range. // We already have a DMA request for this memory range.
@@ -220,11 +218,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
} }
dma->ttl = 60; dma->ttl = 60;
*dmaIndexRef = (u8) i; *dmaIndexRef = (u8) i;
#if defined(VERSION_EU)
return &dma->buffer[(devAddr - dma->source)];
#else
return (devAddr - dma->source) + dma->buffer; return (devAddr - dma->source) + dma->buffer;
#endif
} }
} }
@@ -237,12 +231,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
hasDma = TRUE; hasDma = TRUE;
} }
} else { } else {
#if defined(VERSION_EU)
dma = sSampleDmas;
dma += *dmaIndexRef;
#else
dma = sSampleDmas + *dmaIndexRef; dma = sSampleDmas + *dmaIndexRef;
#endif
bufferPos = devAddr - dma->source; bufferPos = devAddr - dma->source;
if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) { if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) {
// We already have DMA for this memory range. // We already have DMA for this memory range.
@@ -258,11 +247,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
sSampleDmaReuseQueueTail1++; sSampleDmaReuseQueueTail1++;
} }
dma->ttl = 2; dma->ttl = 2;
#if defined(VERSION_EU)
return dma->buffer + (devAddr - dma->source); return dma->buffer + (devAddr - dma->source);
#else
return (devAddr - dma->source) + dma->buffer;
#endif
} }
} }
@@ -279,21 +264,13 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
dma->ttl = 2; dma->ttl = 2;
dma->source = dmaDevAddr; dma->source = dmaDevAddr;
dma->sizeUnused = transfer; dma->sizeUnused = transfer;
#ifdef VERSION_US #ifdef VERSION_US // TODO: Is there a reason this only exists in US?
osInvalDCache(dma->buffer, transfer); osInvalDCache(dma->buffer, transfer);
#endif #endif
#if defined(VERSION_EU)
osPiStartDma(&gCurrAudioFrameDmaIoMesgBufs[gCurrAudioFrameDmaCount++], OS_MESG_PRI_NORMAL, osPiStartDma(&gCurrAudioFrameDmaIoMesgBufs[gCurrAudioFrameDmaCount++], OS_MESG_PRI_NORMAL,
OS_READ, dmaDevAddr, dma->buffer, transfer, &gCurrAudioFrameDmaQueue); OS_READ, dmaDevAddr, dma->buffer, transfer, &gCurrAudioFrameDmaQueue);
*dmaIndexRef = dmaIndex; *dmaIndexRef = dmaIndex;
return (devAddr - dmaDevAddr) + dma->buffer; return (devAddr - dmaDevAddr) + dma->buffer;
#else
gCurrAudioFrameDmaCount++;
osPiStartDma(&gCurrAudioFrameDmaIoMesgBufs[gCurrAudioFrameDmaCount - 1], OS_MESG_PRI_NORMAL,
OS_READ, dmaDevAddr, dma->buffer, transfer, &gCurrAudioFrameDmaQueue);
*dmaIndexRef = dmaIndex;
return dma->buffer + (devAddr - dmaDevAddr);
#endif
} }
@@ -526,8 +503,6 @@ void patch_audio_bank(struct AudioBank *mem, u8 *offset, u32 numInstruments, u32
} }
struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) { struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) {
u32 buf[4];
// (This is broken if the length is 1 (mod 16), but that never happens -- // (This is broken if the length is 1 (mod 16), but that never happens --
// it's always divisible by 4.) // it's always divisible by 4.)
s32 alloc = gAlCtlHeader->seqArray[bankId].len + 0xf; s32 alloc = gAlCtlHeader->seqArray[bankId].len + 0xf;
@@ -539,9 +514,9 @@ struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) {
return NULL; return NULL;
} }
audio_dma_copy_immediate((uintptr_t) ctlData, buf, 0x10); audio_dma_copy_immediate((uintptr_t) ctlData, dmaTempBuffer, 0x10);
u32 numInstruments = buf[0]; u32 numInstruments = dmaTempBuffer[0];
u32 numDrums = buf[1]; u32 numDrums = dmaTempBuffer[1];
audio_dma_copy_immediate((uintptr_t)(ctlData + 0x10), ret, alloc); audio_dma_copy_immediate((uintptr_t)(ctlData + 0x10), ret, alloc);
patch_audio_bank(ret, gAlTbl->seqArray[bankId].offset, numInstruments, numDrums); patch_audio_bank(ret, gAlTbl->seqArray[bankId].offset, numInstruments, numDrums);
gCtlEntries[bankId].numInstruments = (u8) numInstruments; gCtlEntries[bankId].numInstruments = (u8) numInstruments;
@@ -553,8 +528,6 @@ struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) {
} }
struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *seqPlayer) { struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *seqPlayer) {
u32 buf[4];
size_t alloc = gAlCtlHeader->seqArray[bankId].len + 0xf; size_t alloc = gAlCtlHeader->seqArray[bankId].len + 0xf;
alloc = ALIGN16(alloc); alloc = ALIGN16(alloc);
alloc -= 0x10; alloc -= 0x10;
@@ -564,9 +537,9 @@ struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *s
return NULL; return NULL;
} }
audio_dma_copy_immediate((uintptr_t) ctlData, buf, 0x10); audio_dma_copy_immediate((uintptr_t) ctlData, dmaTempBuffer, 0x10);
u32 numInstruments = buf[0]; u32 numInstruments = dmaTempBuffer[0];
u32 numDrums = buf[1]; u32 numDrums = dmaTempBuffer[1];
seqPlayer->loadingBankId = (u8) bankId; seqPlayer->loadingBankId = (u8) bankId;
#if defined(VERSION_EU) #if defined(VERSION_EU)
gCtlEntries[bankId].numInstruments = numInstruments; gCtlEntries[bankId].numInstruments = numInstruments;
@@ -830,11 +803,8 @@ void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) {
// (void) must be omitted from parameters to fix stack with -framepointer // (void) must be omitted from parameters to fix stack with -framepointer
void audio_init() { void audio_init() {
#if defined(VERSION_JP) || defined(VERSION_US) || defined(VERSION_EU)
u8 buf[0x10];
#endif
s32 i, /*j,*/ k; s32 i, /*j,*/ k;
UNUSED u32 size; u32 size;
void *data; void *data;
gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED; gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
@@ -909,10 +879,6 @@ void audio_init() {
bzero(&gAiBuffers, sizeof(gAiBuffers)); bzero(&gAiBuffers, sizeof(gAiBuffers));
for (i = 0; i < NUMAIBUFFERS; i++) { for (i = 0; i < NUMAIBUFFERS; i++) {
gAiBuffers[i] = soundAlloc(&gAudioInitPool, AIBUFFER_LEN); gAiBuffers[i] = soundAlloc(&gAudioInitPool, AIBUFFER_LEN);
/*for (j = 0; j < (s32) (AIBUFFER_LEN / sizeof(s16)); j++) {
gAiBuffers[i][j] = 0;
}*/
} }
#if defined(VERSION_EU) #if defined(VERSION_EU)
@@ -929,7 +895,7 @@ void audio_init() {
eu_stubbed_printf_0("Main Heap Initialize.\n"); eu_stubbed_printf_0("Main Heap Initialize.\n");
// Load headers for sounds and sequences // Load headers for sounds and sequences
gSeqFileHeader = (ALSeqFile *) buf; gSeqFileHeader = (ALSeqFile *) dmaTempBuffer;
data = gMusicData; data = gMusicData;
audio_dma_copy_immediate((uintptr_t) data, gSeqFileHeader, 0x10); audio_dma_copy_immediate((uintptr_t) data, gSeqFileHeader, 0x10);
gSequenceCount = gSeqFileHeader->seqCount; gSequenceCount = gSeqFileHeader->seqCount;
@@ -940,7 +906,7 @@ void audio_init() {
alSeqFileNew(gSeqFileHeader, data); alSeqFileNew(gSeqFileHeader, data);
// Load header for CTL (instrument metadata) // Load header for CTL (instrument metadata)
gAlCtlHeader = (ALSeqFile *) buf; gAlCtlHeader = (ALSeqFile *) dmaTempBuffer;
data = gSoundDataADSR; data = gSoundDataADSR;
audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, 0x10); audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, 0x10);
size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4; size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4;
@@ -951,7 +917,7 @@ void audio_init() {
alSeqFileNew(gAlCtlHeader, data); alSeqFileNew(gAlCtlHeader, data);
// Load header for TBL (raw sound data) // Load header for TBL (raw sound data)
gAlTbl = (ALSeqFile *) buf; gAlTbl = (ALSeqFile *) dmaTempBuffer;
audio_dma_copy_immediate((uintptr_t) data, gAlTbl, 0x10); audio_dma_copy_immediate((uintptr_t) data, gAlTbl, 0x10);
size = gAlTbl->seqCount * sizeof(ALSeqData) + 4; size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
size = ALIGN16(size); size = ALIGN16(size);