You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
Bugfix: patch_audio_bank crash (hopefully) resolved for good
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user