Prevent UB that can happen when using more than 64 total soundbanks (#575)

This commit is contained in:
Gregory Heskett
2023-01-29 14:29:39 -05:00
committed by GitHub
parent 52a7aedaf4
commit 1fadb78632
5 changed files with 12 additions and 11 deletions

View File

@@ -26,14 +26,14 @@
#define PERSISTENT_BANK_MEM 0xDC00
#define TEMPORARY_SEQ_MEM 0xE800
#define TEMPORARY_BANK_MEM 0x5500
#define BANK_SETS_ALLOC 0x400
#define MAX_NUM_SOUNDBANKS 0x100
#define EXT_AUDIO_INIT_POOL_SIZE 0x2000
#else
#define PERSISTENT_SEQ_MEM 0x4100
#define PERSISTENT_BANK_MEM 0x6E00
#define TEMPORARY_SEQ_MEM 0x7400
#define TEMPORARY_BANK_MEM 0x2A80
#define BANK_SETS_ALLOC 0x100
#define MAX_NUM_SOUNDBANKS 0x40
#define EXT_AUDIO_INIT_POOL_SIZE 0x0
#endif
@@ -185,9 +185,9 @@ extern OSMesgQueue *D_SH_80350FA8;
#endif
#if defined(VERSION_EU) || defined(VERSION_SH)
#define AUDIO_INIT_POOL_SIZE (0x2B00 + BANK_SETS_ALLOC + EXT_AUDIO_INIT_POOL_SIZE)
#define AUDIO_INIT_POOL_SIZE (0x2B00 + (MAX_NUM_SOUNDBANKS * sizeof(s32)) + EXT_AUDIO_INIT_POOL_SIZE)
#else
#define AUDIO_INIT_POOL_SIZE (0x2400 + BANK_SETS_ALLOC + EXT_AUDIO_INIT_POOL_SIZE)
#define AUDIO_INIT_POOL_SIZE (0x2400 + (MAX_NUM_SOUNDBANKS * sizeof(s32)) + EXT_AUDIO_INIT_POOL_SIZE)
#endif
// TODO: needs validation once EU can compile. EU is very likely incorrect!

View File

@@ -56,9 +56,9 @@ struct PoolSplit sPersistentCommonPoolSplit;
struct PoolSplit sTemporaryCommonPoolSplit;
#ifdef VERSION_SH
u8 gUnkLoadStatus[0x40];
u8 gUnkLoadStatus[MAX_NUM_SOUNDBANKS];
#endif
u8 gBankLoadStatus[0x40];
u8 gBankLoadStatus[MAX_NUM_SOUNDBANKS];
u8 gSeqLoadStatus[0x100];
#if defined(VERSION_EU) || defined(VERSION_SH)

View File

@@ -4,6 +4,7 @@
#include <PR/ultratypes.h>
#include "internal.h"
#include "data.h"
enum SoundLoadStatus {
SOUND_LOAD_STATUS_NOT_LOADED,
@@ -115,8 +116,8 @@ extern struct Unk1Pool gUnkPool1;
extern struct UnkPool gUnkPool2;
extern struct UnkPool gUnkPool3;
#endif
extern u8 gBankLoadStatus[64];
extern u8 gSeqLoadStatus[256];
extern u8 gBankLoadStatus[MAX_NUM_SOUNDBANKS];
extern u8 gSeqLoadStatus[0x100];
extern volatile u8 gAudioResetStatus;
extern u8 gAudioResetPresetIdToLoad;

View File

@@ -919,8 +919,8 @@ void audio_init() {
alSeqFileNew(gAlTbl, gSoundDataRaw);
// Load bank sets for each sequence
gAlBankSets = soundAlloc(&gAudioInitPool, BANK_SETS_ALLOC);
audio_dma_copy_immediate((uintptr_t) gBankSetsData, gAlBankSets, BANK_SETS_ALLOC);
gAlBankSets = soundAlloc(&gAudioInitPool, MAX_NUM_SOUNDBANKS * sizeof(s32));
audio_dma_copy_immediate((uintptr_t) gBankSetsData, gAlBankSets, MAX_NUM_SOUNDBANKS * sizeof(s32));
init_sequence_players();
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;

View File

@@ -505,7 +505,7 @@ void *func_sh_802f3564(s32 seqId) {
return func_sh_802f3764(0, seqId2, &temp);
}
extern u8 gUnkLoadStatus[0x40];
extern u8 gUnkLoadStatus[MAX_NUM_SOUNDBANKS];
void *func_sh_802f3598(s32 idx, s32 *medium) {
void *ret;