From d9008938f8518de31bce394615b0db19287e0805 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 12 Mar 2023 15:55:25 -0400 Subject: [PATCH] Makes sequenceMap and seqLoadStatus a dynamic size (#2610) Refactors to allow the above two arrays to be a dynamic size when the game launches, size is set during the AudioLoad_Init function. --- soh/include/z64audio.h | 5 +++-- soh/src/code/audio_heap.c | 2 +- soh/src/code/audio_load.c | 12 ++++++++---- soh/src/code/audio_seqplayer.c | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/soh/include/z64audio.h b/soh/include/z64audio.h index 0942772c4..a7587ea2c 100644 --- a/soh/include/z64audio.h +++ b/soh/include/z64audio.h @@ -22,7 +22,8 @@ #define CALC_RESAMPLE_FREQ(sampleRate) ((float)sampleRate / (s32)gAudioContext.audioBufferParameters.frequency) -#define MAX_SEQUENCES 0x400 +//#define MAX_SEQUENCES 0x800 +extern size_t sequenceMapSize; extern char* fontMap[256]; @@ -917,7 +918,7 @@ typedef struct { /* 0x342C */ AudioPoolSplit3 temporaryCommonPoolSplit; /* 0x3438 */ u8 sampleFontLoadStatus[0x30]; /* 0x3468 */ u8 fontLoadStatus[0x30]; - /* 0x3498 */ u8 seqLoadStatus[MAX_SEQUENCES]; + /* 0x3498 */ u8* seqLoadStatus; /* 0x3518 */ volatile u8 resetStatus; /* 0x3519 */ u8 audioResetSpecIdToLoad; /* 0x351C */ s32 audioResetFadeOutFramesLeft; diff --git a/soh/src/code/audio_heap.c b/soh/src/code/audio_heap.c index 72c1c8870..8d0e97fa3 100644 --- a/soh/src/code/audio_heap.c +++ b/soh/src/code/audio_heap.c @@ -53,7 +53,7 @@ void AudioHeap_ResetLoadStatus(void) { } } - for (i = 0; i < MAX_SEQUENCES; i++) { + for (i = 0; i < sequenceMapSize; i++) { if (gAudioContext.seqLoadStatus[i] != 5) { gAudioContext.seqLoadStatus[i] = 0; } diff --git a/soh/src/code/audio_load.c b/soh/src/code/audio_load.c index 81d395a81..eb788fd0c 100644 --- a/soh/src/code/audio_load.c +++ b/soh/src/code/audio_load.c @@ -77,7 +77,8 @@ void* sUnusedHandler = NULL; s32 gAudioContextInitalized = false; -char* sequenceMap[MAX_SEQUENCES]; +char** sequenceMap; +size_t sequenceMapSize; // A map of authentic sequence IDs to their cache policies, for use with sequence swapping. u8 seqCachePolicyMap[MAX_AUTHENTIC_SEQID]; char* fontMap[256]; @@ -488,7 +489,7 @@ u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) { return NULL; u16 newSeqId = AudioEditor_GetReplacementSeq(seqId); - if (newSeqId > MAX_SEQUENCES || !sequenceMap[newSeqId]) { + if (newSeqId > sequenceMapSize || !sequenceMap[newSeqId]) { return NULL; } SequenceData sDat = ResourceMgr_LoadSeqByName(sequenceMap[newSeqId]); @@ -1342,7 +1343,12 @@ void AudioLoad_Init(void* heap, size_t heapSize) { AudioHeap_ResetStep(); int seqListSize = 0; + int customSeqListSize = 0; char** seqList = ResourceMgr_ListFiles("audio/sequences*", &seqListSize); + char** customSeqList = ResourceMgr_ListFiles("custom/music/*", &customSeqListSize); + sequenceMapSize = (size_t)(seqListSize + customSeqListSize); + sequenceMap = malloc(sequenceMapSize * sizeof(char*)); + gAudioContext.seqLoadStatus = malloc(sequenceMapSize * sizeof(char*)); for (size_t i = 0; i < seqListSize; i++) { @@ -1357,9 +1363,7 @@ void AudioLoad_Init(void* heap, size_t heapSize) { free(seqList); - int customSeqListSize = 0; int startingSeqNum = MAX_AUTHENTIC_SEQID; // 109 is the highest vanilla sequence - char** customSeqList = ResourceMgr_ListFiles("custom/music/*", &customSeqListSize); qsort(customSeqList, customSeqListSize, sizeof(char*), strcmp_sort); for (size_t i = startingSeqNum; i < startingSeqNum + customSeqListSize; i++) { diff --git a/soh/src/code/audio_seqplayer.c b/soh/src/code/audio_seqplayer.c index 0b5192b0b..9e9ee645c 100644 --- a/soh/src/code/audio_seqplayer.c +++ b/soh/src/code/audio_seqplayer.c @@ -3,7 +3,7 @@ #include #include "global.h" -extern char* sequenceMap[MAX_SEQUENCES]; +extern char** sequenceMap; #define PORTAMENTO_IS_SPECIAL(x) ((x).mode & 0x80) #define PORTAMENTO_MODE(x) ((x).mode & ~0x80)