From cef885db725e38905e33caa3849a9f30fd170fc5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 7 Jul 2023 22:10:48 +1000 Subject: [PATCH] Replace a heap of literals, mostly in sound code --- include/PR/n_libaudio.h | 2 +- src/game/chrmgr.c | 8 +++--- src/game/setupcover.c | 8 +++--- src/game/title.c | 8 +++--- src/game/titlereset.c | 2 +- src/include/game/title.h | 2 ++ src/include/types.h | 20 +------------- src/lib/audiomgr.c | 8 +++--- src/lib/mp3.c | 31 +++++++++++---------- src/lib/naudio/n_csplayer.c | 2 +- src/lib/naudio/n_drvrNew.c | 4 +-- src/lib/naudio/n_mainbus.c | 7 ++--- src/lib/naudio/n_sndplayer.c | 2 +- src/lib/naudio/n_synthInternals.h | 23 +++------------- src/lib/naudio/n_synthesizer.c | 10 +++---- src/lib/sched.c | 4 +-- src/lib/snd.c | 46 +++++++++++++++++++++---------- 17 files changed, 87 insertions(+), 100 deletions(-) diff --git a/include/PR/n_libaudio.h b/include/PR/n_libaudio.h index f707f00a4..969a96e73 100644 --- a/include/PR/n_libaudio.h +++ b/include/PR/n_libaudio.h @@ -208,7 +208,7 @@ struct fx { s16 unk00; s16 unk02; s32 unk04; - s16 unk08[8]; + s16 unk08[16]; }; typedef struct N_ALVoiceState_s { diff --git a/src/game/chrmgr.c b/src/game/chrmgr.c index 494191dcd..08dec6d76 100644 --- a/src/game/chrmgr.c +++ b/src/game/chrmgr.c @@ -33,8 +33,8 @@ void chrmgrReset(void) g_ChrIndexes = NULL; var80062960 = mempAlloc(ALIGN16(15 * sizeof(struct var80062960)), MEMPOOL_STAGE); - for (i = 0; i < 20; i++) { - var8009ccc0[i] = (void *)ALIGN64(mempAlloc(0x240, MEMPOOL_STAGE)); + for (i = 0; i < ARRAYCOUNT(var8009ccc0); i++) { + var8009ccc0[i] = (void *)ALIGN64(mempAlloc(16 * 16 * sizeof(u16) + 0x40, MEMPOOL_STAGE)); } resetSomeStageThings(); @@ -54,8 +54,8 @@ void chrmgrConfigure(s32 numchrs) } g_NumChrs = 0; - g_Chrnums = mempAlloc(ALIGN16(g_NumChrSlots * 2), MEMPOOL_STAGE); - g_ChrIndexes = mempAlloc(ALIGN16(g_NumChrSlots * 2), MEMPOOL_STAGE); + g_Chrnums = mempAlloc(ALIGN16(g_NumChrSlots * sizeof(g_Chrnums[0])), MEMPOOL_STAGE); + g_ChrIndexes = mempAlloc(ALIGN16(g_NumChrSlots * sizeof(g_ChrIndexes[0])), MEMPOOL_STAGE); for (i = 0; i < g_NumChrSlots; i++) { g_Chrnums[i] = -1; diff --git a/src/game/setupcover.c b/src/game/setupcover.c index 7a592b953..5b446c12a 100644 --- a/src/game/setupcover.c +++ b/src/game/setupcover.c @@ -13,7 +13,7 @@ void coverAllocateSpecial(u16 *specialcovernums) { s32 i; - g_SpecialCoverNums = mempAlloc(ALIGN16(g_NumSpecialCovers * sizeof(u16)), MEMPOOL_STAGE); + g_SpecialCoverNums = mempAlloc(ALIGN16(g_NumSpecialCovers * sizeof(g_SpecialCoverNums[0])), MEMPOOL_STAGE); if (g_SpecialCoverNums != NULL) { for (i = 0; i < g_NumSpecialCovers; i++) { @@ -34,9 +34,9 @@ void setupPrepareCover(void) RoomNum inrooms[21]; RoomNum aboverooms[21]; - g_CoverFlags = mempAlloc(ALIGN16(numcovers * sizeof(u16)), MEMPOOL_STAGE); - g_CoverRooms = mempAlloc(ALIGN16(numcovers * sizeof(s32)), MEMPOOL_STAGE); - g_CoverCandidates = mempAlloc(ALIGN16(numcovers * 0x10), MEMPOOL_STAGE); + g_CoverFlags = mempAlloc(ALIGN16(numcovers * sizeof(g_CoverFlags[0])), MEMPOOL_STAGE); + g_CoverRooms = mempAlloc(ALIGN16(numcovers * sizeof(g_CoverRooms[0])), MEMPOOL_STAGE); + g_CoverCandidates = mempAlloc(ALIGN16(numcovers * sizeof(g_CoverCandidates[0])), MEMPOOL_STAGE); g_NumSpecialCovers = 0; g_SpecialCoverNums = NULL; diff --git a/src/game/title.c b/src/game/title.c index 606277e91..21a601153 100644 --- a/src/game/title.c +++ b/src/game/title.c @@ -532,10 +532,10 @@ void titleInitPdLogo(void) { struct coord coord = {0, 0, 0}; - g_ModelStates[MODEL_NLOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_NLOGO].fileid, nextaddr, 0x47800, 0); + g_ModelStates[MODEL_NLOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_NLOGO].fileid, nextaddr, TITLE_ALLOCSIZE, 0); size = ALIGN64(fileGetLoadedSize(g_ModelStates[MODEL_NLOGO].fileid)); nextaddr += size; - remaining = 0x47800 - size; + remaining = TITLE_ALLOCSIZE - size; modelAllocateRwData(g_ModelStates[MODEL_NLOGO].modeldef); g_TitleModel = modelmgrInstantiateModelWithAnim(g_ModelStates[MODEL_NLOGO].modeldef); @@ -1782,7 +1782,7 @@ void titleInitNintendoLogo(void) { struct coord coord = {0, 0, 0}; - g_ModelStates[MODEL_NINTENDOLOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_NINTENDOLOGO].fileid, nextaddr, 0x47800, 0); + g_ModelStates[MODEL_NINTENDOLOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_NINTENDOLOGO].fileid, nextaddr, TITLE_ALLOCSIZE, 0); modelAllocateRwData(g_ModelStates[MODEL_NINTENDOLOGO].modeldef); g_TitleModel = modelmgrInstantiateModelWithoutAnim(g_ModelStates[MODEL_NINTENDOLOGO].modeldef); @@ -1941,7 +1941,7 @@ void titleInitRareLogo(void) { struct coord coord = {0, 0, 0}; - g_ModelStates[MODEL_RARELOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_RARELOGO].fileid, nextaddr, 0x47800, 0); + g_ModelStates[MODEL_RARELOGO].modeldef = modeldefLoad(g_ModelStates[MODEL_RARELOGO].fileid, nextaddr, TITLE_ALLOCSIZE, 0); modelAllocateRwData(g_ModelStates[MODEL_RARELOGO].modeldef); g_TitleModel = modelmgrInstantiateModelWithoutAnim(g_ModelStates[MODEL_RARELOGO].modeldef); diff --git a/src/game/titlereset.c b/src/game/titlereset.c index 77e57ee9c..1144943ec 100644 --- a/src/game/titlereset.c +++ b/src/game/titlereset.c @@ -21,7 +21,7 @@ void titleReset(void) g_TitleNextMode = TITLEMODE_SKIP; } - var8009cca0 = mempAlloc(0x47800, MEMPOOL_STAGE); + var8009cca0 = mempAlloc(TITLE_ALLOCSIZE, MEMPOOL_STAGE); getitleReset(); } diff --git a/src/include/game/title.h b/src/include/game/title.h index b65659136..6dc4ed517 100644 --- a/src/include/game/title.h +++ b/src/include/game/title.h @@ -4,6 +4,8 @@ #include "data.h" #include "types.h" +#define TITLE_ALLOCSIZE 1024 * 286 + extern u32 var800624d4; extern u32 var800624d8; extern u32 var800624dc; diff --git a/src/include/types.h b/src/include/types.h index ce4ec5f7c..cbf2096b5 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5788,7 +5788,6 @@ typedef struct AudioInfo_s { short *data; /* Output data pointer */ short frameSamples; /* # of samples synthesized in this frame */ OSScTask task; /* scheduler structure */ - AudioMsg msg; /* completion message */ } AudioInfo; typedef struct { @@ -5896,12 +5895,7 @@ struct mp3vars { /*0x38*/ struct mp3thing *var8009c3c8; /*0x3c*/ s32 var8009c3cc; /*0x40*/ s32 var8009c3d0; - - union { - /*0x44*/ u32 *var8009c3d4; - /*0x44*/ u32 *var8009c3d4_arr[1]; - }; - + /*0x44*/ u32 *var8009c3d4[1]; /*0x48*/ u32 var8009c3d8; /*0x4c*/ void *var8009c3dc; /*0x50*/ u32 var8009c3e0; @@ -5913,18 +5907,6 @@ struct mp3vars { /*0x61*/ u8 var8009c3f1; }; -struct sndcache { - /*0x0000*/ u16 *indexes; // indexed by sfxnum, value is cache index (0-44) or 0xffff - /*0x0004*/ u8 refcounts[45]; - /*0x0032*/ u16 ages[45]; - /*0x008c*/ ALEnvelope envelopes[45]; - /*0x035c*/ ALKeyMap keymaps[45]; - /*0x046c*/ ALWaveTable wavetables[45]; - /*0x07f0*/ ALADPCMBook books[45]; - /*0x3658*/ ALADPCMloop loops[45]; - /*0x3e14*/ ALSound sounds[45]; -}; - struct rdptask { OSScTask sctask; u16 *framebuffer; diff --git a/src/lib/audiomgr.c b/src/lib/audiomgr.c index 382ee38e0..496adc4d0 100644 --- a/src/lib/audiomgr.c +++ b/src/lib/audiomgr.c @@ -1,6 +1,7 @@ #include #include "lib/boot.h" #include "lib/sched.h" +#include "naudio/n_synthInternals.h" #include "constants.h" #include "bss.h" #include "lib/audiodma.h" @@ -85,8 +86,8 @@ void amgrCreate(ALSynConfig *config) g_AmgrFreqPerTick++; } - g_AmgrFreqPerTick = g_AmgrFreqPerTick / 184 * 184 + 184; - var800918dc = g_AmgrFreqPerTick - 184; + g_AmgrFreqPerTick = g_AmgrFreqPerTick / SAMPLES * SAMPLES + SAMPLES; + var800918dc = g_AmgrFreqPerTick - SAMPLES; var800918e4 = g_AmgrFreqPerTick + 80; var8005cf94 = 0; @@ -108,8 +109,7 @@ void amgrCreate(ALSynConfig *config) } for (i = 0; i < ARRAYCOUNT(g_AudioManager.audioInfo); i++) { - // @todo: Find out why AudioInfo is only 0x60 - g_AudioManager.audioInfo[i] = alHeapAlloc(&g_SndHeap, 1, 0x60); + g_AudioManager.audioInfo[i] = alHeapAlloc(&g_SndHeap, 1, sizeof(AudioInfo)); g_AudioManager.audioInfo[i]->frameSamples = 0; g_AudioManager.audioInfo[i]->data = alHeapAlloc(&g_SndHeap, 1, PAL ? 3688 : 1024 * 3); } diff --git a/src/lib/mp3.c b/src/lib/mp3.c index f65ee5335..325993d76 100644 --- a/src/lib/mp3.c +++ b/src/lib/mp3.c @@ -1,6 +1,8 @@ #include #include #include "naudio/n_abi.h" +#include "ultra/audio/synthInternals.h" +#include "naudio/n_synthInternals.h" #include "lib/mp3.h" #include "mp3/mp3.h" #include "types.h" @@ -42,19 +44,18 @@ void mp3Init(ALHeap *heap) #endif g_AsiStream = alHeapAlloc(heap, sizeof(struct asistream), 1); - var8005f6f8 = alHeapAlloc(heap, 1, 0x2200); - var8005f6fc = alHeapAlloc(heap, 1, 0x2200); + var8005f6f8 = alHeapAlloc(heap, 1, 34 * 256 * sizeof(var8005f6f8[0])); + var8005f6fc = alHeapAlloc(heap, 1, 34 * 256 * sizeof(var8005f6fc[0])); - var8009c6d8 = alHeapAlloc(heap, 256 * sizeof(f32), 1); - var8009c6dc = alHeapAlloc(heap, 256 * sizeof(f32), 1); + var8009c6d8 = alHeapAlloc(heap, 256 * sizeof(var8009c6d8[0]), 1); + var8009c6dc = alHeapAlloc(heap, 256 * sizeof(var8009c6dc[0]), 1); var8009c640 = alHeapAlloc(heap, 10500 * sizeof(struct mp3decfourbytes), 1); - var8009c644 = alHeapAlloc(heap, 8192 * sizeof(f32), 1); + var8009c644 = alHeapAlloc(heap, 8192 * sizeof(var8009c644[0]), 1); mp3mainInit(); - g_Mp3Vars.var8009c398 = alHeapAlloc(heap, 1, 0x50); - *(u8 **)((uintptr_t)&g_Mp3Vars+0x44) = alHeapAlloc(heap, 1, 0x440); - + g_Mp3Vars.var8009c398 = alHeapAlloc(heap, 1, ALIGN16(sizeof(ALEnvMixer))); + g_Mp3Vars.var8009c3d4[0] = alHeapAlloc(heap, 1, 0x440); g_Mp3Vars.var8009c3e0 = 0; g_Mp3Vars.var8009c3e4 = 0x7fff; g_Mp3Vars.var8009c3ec = g_Mp3Vars.var8009c3ee = 0x40; @@ -169,8 +170,8 @@ s32 func00037fc0(s32 arg0, Acmd **cmd) struct mp3thing *sp58; struct mp3thing *sp54 = NULL; s32 sp50; - s32 sp4c = 0x4e0; - s32 sp48 = 0x650; + s32 sp4c = N_AL_MAIN_L_OUT; + s32 sp48 = N_AL_MAIN_R_OUT; if (g_Mp3Vars.var8009c3ec != g_Mp3Vars.var8009c3ee) { sp60 = g_Mp3Vars.var8009c3ee - g_Mp3Vars.var8009c3ec; @@ -201,7 +202,7 @@ s32 func00037fc0(s32 arg0, Acmd **cmd) g_Mp3Vars.var8009c3d0 = 0; g_Mp3Vars.var8009c3d8 = 0; - bzero(*(u32 **)&g_Mp3Vars.var8009c3d4, 0x440); + bzero(g_Mp3Vars.var8009c3d4[0], 0x440); } } else { g_Mp3Vars.var8009c3f0--; @@ -234,7 +235,7 @@ s32 func00037fc0(s32 arg0, Acmd **cmd) g_Mp3Vars.var8009c3c8 = sp58; for (i = 0; i < sp5c; i++) { - acmd08((*cmd)++, osVirtualToPhysical(g_Mp3Vars.var8009c3d4_arr[i])); + acmd08((*cmd)++, osVirtualToPhysical(g_Mp3Vars.var8009c3d4[i])); acmd07((*cmd)++, g_Mp3Vars.var8009c3d8, osVirtualToPhysical(sp58)); sp58++; @@ -283,7 +284,7 @@ s32 func00037fc0(s32 arg0, Acmd **cmd) func00038924(&g_Mp3Vars); if (!g_Mp3Vars.var8009c3f1) { - aClearBuffer((*cmd)++, 0x4e0, 0x2e0); + aClearBuffer((*cmd)++, N_AL_MAIN_L_OUT, N_AL_TEMP_2); if (g_Mp3Vars.var8009c3b4) { g_Mp3Vars.var8009c3b4 = 0; @@ -302,7 +303,7 @@ s32 func00037fc0(s32 arg0, Acmd **cmd) n_aEnvMixer((*cmd)++, 0, 0, osVirtualToPhysical(g_Mp3Vars.var8009c398)); } - g_Mp3Vars.samples += 184; + g_Mp3Vars.samples += SAMPLES; if (g_Mp3Vars.samples > g_Mp3Vars.var8009c3bc) { g_Mp3Vars.samples = g_Mp3Vars.var8009c3bc; @@ -356,7 +357,7 @@ void func00038924(struct mp3vars *vars) } vars->samples = 0; - vars->var8009c3bc = (vars->var8009c3e8 + 183) / 184 * 184; + vars->var8009c3bc = SAMPLE184(vars->var8009c3e8); vars->var8009c3b4 = 1; } } diff --git a/src/lib/naudio/n_csplayer.c b/src/lib/naudio/n_csplayer.c index cc534816d..f8e849c86 100644 --- a/src/lib/naudio/n_csplayer.c +++ b/src/lib/naudio/n_csplayer.c @@ -281,7 +281,7 @@ ALMicroTime __n_CSPVoiceHandler(void *node) ALFxRef fx = func0003e5b8(seqp->nextEvent.msg.evt19.unk00); if (fx) { - func0003e674((struct fx *) fx, seqp->nextEvent.msg.evt19.unk01, &seqp->nextEvent.msg.evt19.param); + func0003e674(fx, seqp->nextEvent.msg.evt19.unk01, &seqp->nextEvent.msg.evt19.param); } } break; diff --git a/src/lib/naudio/n_drvrNew.c b/src/lib/naudio/n_drvrNew.c index 89b497d59..47383a3dd 100644 --- a/src/lib/naudio/n_drvrNew.c +++ b/src/lib/naudio/n_drvrNew.c @@ -175,11 +175,11 @@ void n_alFxNew(ALFx **fx_ar, ALSynConfig *c, s16 bus, ALHeap *hp) r->base[1] = alHeapAlloc(hp, r->length, sizeof(s16)); r->input[1] = r->base[1]; - for (k=0; k < r->length; k++) { + for (k = 0; k < r->length; k++) { r->base[0][k] = r->base[1][k] = 0; } - for ( i=0; isection_count; i++ ){ + for (i = 0; i < r->section_count; i++) { d = &r->delay[i]; d->input = param[j++]; d->output = param[j++]; diff --git a/src/lib/naudio/n_mainbus.c b/src/lib/naudio/n_mainbus.c index bba347bbe..102c86f7f 100644 --- a/src/lib/naudio/n_mainbus.c +++ b/src/lib/naudio/n_mainbus.c @@ -32,15 +32,14 @@ Acmd *n_alMainBusPull(s32 sampleOffset, Acmd *p) aMix(ptr++, 0, 0x7fff, N_AL_AUX_L_OUT, N_AL_MAIN_L_OUT); } - if (n_syn->auxBus[i].unk44->unk02 > 0) { + if (n_syn->auxBus[i].unk44->fx.unk02 > 0) { struct auxbus44 *bus44 = n_syn->auxBus[i].unk44; if (bus44->unk28) { - // @todo: Remove cast - func0003ba64((struct fx *)bus44, n_syn->outputRate); + func0003ba64(&bus44->fx, n_syn->outputRate); } - n_aLoadADPCM(ptr++, 32, osVirtualToPhysical(&bus44->unk08)); + n_aLoadADPCM(ptr++, 32, osVirtualToPhysical(&bus44->fx.unk08)); n_aPoleFilter(ptr++, 0, N_AL_MAIN_L_OUT, 0, osVirtualToPhysical(bus44->unk2c) & 0xffffff); n_aPoleFilter(ptr++, 0, N_AL_MAIN_R_OUT, 0, osVirtualToPhysical(bus44->unk30) & 0xffffff); diff --git a/src/lib/naudio/n_sndplayer.c b/src/lib/naudio/n_sndplayer.c index 82f4fdbac..9c3e4e8ae 100644 --- a/src/lib/naudio/n_sndplayer.c +++ b/src/lib/naudio/n_sndplayer.c @@ -41,7 +41,7 @@ void n_alSndpNew(ALSndpConfig *config) g_SndPlayer->sndState = ptr; // Init the event queue - ptr = alHeapAlloc(config->heap, 1, config->maxEvents * 0x1c); + ptr = alHeapAlloc(config->heap, 1, config->maxEvents * sizeof(N_ALEventListItem)); n_alEvtqNew(&g_SndPlayer->evtq, ptr, config->maxEvents); g_SndpFreeStatesHead = g_SndPlayer->sndState; diff --git a/src/lib/naudio/n_synthInternals.h b/src/lib/naudio/n_synthInternals.h index a5f91400b..faf6334ae 100644 --- a/src/lib/naudio/n_synthInternals.h +++ b/src/lib/naudio/n_synthInternals.h @@ -99,10 +99,6 @@ typedef struct N_PVoice_s { u8 unk8c; u16 unk8e; struct fx fx; - s32 unka8; - s32 unkac; - s32 unkb0; - s32 unkb4; s32 unkb8; void *unkbc; // size 8 } N_PVoice; @@ -123,25 +119,14 @@ typedef struct N_ALMainBus_s { N_ALFilter filter; } N_ALMainBus; -// Suspected to be the same as struct fx, but auxbus44 is too big to fit inside N_PVoice. -// Maybe auxbus44 contains struct fx at unk00, then adds unk30 and unk34? struct auxbus44 { - u16 unk00; - s16 unk02; - u32 unk04; - u32 unk08; - u32 unk0c; - u32 unk10; - u32 unk14; - u32 unk18; - u32 unk1c; - u32 unk20; - u32 unk24; + struct fx fx; u32 unk28; - void *unk2c; // size 8 - void *unk30; // size 8 + POLEF_STATE *unk2c; + POLEF_STATE *unk30; u32 unk34; }; + typedef struct N_ALAuxBus_s { ALFilter filter; s32 sourceCount; diff --git a/src/lib/naudio/n_synthesizer.c b/src/lib/naudio/n_synthesizer.c index 9d335dff3..1afc79931 100644 --- a/src/lib/naudio/n_synthesizer.c +++ b/src/lib/naudio/n_synthesizer.c @@ -36,18 +36,18 @@ void n_alSynNew(ALSynConfig *c) for (i = 0; i < n_syn->maxAuxBusses; i++) { n_syn->auxBus[i].sourceCount = 0; n_syn->auxBus[i].maxSources = c->maxPVoices; - n_syn->auxBus[i].sources = alHeapAlloc(hp, c->maxPVoices, 4); + n_syn->auxBus[i].sources = alHeapAlloc(hp, c->maxPVoices, sizeof(void *)); if (c->fxTypes[i]) { n_syn->auxBus[i].fx = n_alSynAllocFX(i, c, hp); } else { - n_syn->auxBus[i].fx = 0; + n_syn->auxBus[i].fx = NULL; } n_syn->auxBus[i].unk44 = alHeapAlloc(hp, 1, sizeof(struct auxbus44)); - n_syn->auxBus[i].unk44->unk02 = 0; - n_syn->auxBus[i].unk44->unk2c = alHeapAlloc(hp, 1, 8); - n_syn->auxBus[i].unk44->unk30 = alHeapAlloc(hp, 1, 8); + n_syn->auxBus[i].unk44->fx.unk02 = 0; + n_syn->auxBus[i].unk44->unk2c = alHeapAlloc(hp, 1, sizeof(POLEF_STATE)); + n_syn->auxBus[i].unk44->unk30 = alHeapAlloc(hp, 1, sizeof(POLEF_STATE)); } /******* main new *******************************/ diff --git a/src/lib/sched.c b/src/lib/sched.c index 9d0311593..266e4cb68 100644 --- a/src/lib/sched.c +++ b/src/lib/sched.c @@ -352,7 +352,7 @@ void __scHandleRetrace(OSSched *sc) schedRenderCrashPeriodically(sc->frameCount); } -extern struct sndcache g_SndCache; +extern u8 g_SndCache; /** * __scHandleTasks is called both on retrace and when the RDP completes a task. @@ -411,7 +411,7 @@ void __scHandleTasks(OSSched *sc) } if (checksum != CHECKSUM_PLACEHOLDER) { - u8 *addr = (u8 *) &g_SndCache; + u8 *addr = &g_SndCache; for (i = 0; i < 40; i++) { addr[4 + i] = 0xff; diff --git a/src/lib/snd.c b/src/lib/snd.c index edca566ea..3d085c6b2 100644 --- a/src/lib/snd.c +++ b/src/lib/snd.c @@ -23,6 +23,24 @@ #include "data.h" #include "types.h" +#define MAX_SEQ_SIZE_4MB 1024 * 14 +#define MAX_SEQ_SIZE_8MB 1024 * 18 + +#define NUM_CACHE_SLOTS 45 +#define NUM_KEYTHINGS 9 + +struct sndcache { + /*0x0000*/ u16 *indexes; // indexed by sfxnum, value is cache index (0-44) or 0xffff + /*0x0004*/ u8 refcounts[NUM_CACHE_SLOTS]; + /*0x0032*/ u16 ages[NUM_CACHE_SLOTS]; + /*0x008c*/ ALEnvelope envelopes[NUM_CACHE_SLOTS]; + /*0x035c*/ ALKeyMap keymaps[NUM_CACHE_SLOTS]; + /*0x046c*/ ALWaveTable wavetables[NUM_CACHE_SLOTS]; + /*0x07f0*/ ALADPCMBook books[NUM_CACHE_SLOTS]; + /*0x3658*/ ALADPCMloop loops[NUM_CACHE_SLOTS]; + /*0x3e14*/ ALSound sounds[NUM_CACHE_SLOTS]; +}; + struct curmp3 { union soundnumhack sfxref; u32 playing; @@ -882,7 +900,7 @@ void sndSetSfxVolume(u16 volume) } #endif - for (i = 0; i < 9; i++) { + for (i = 0; i < NUM_KEYTHINGS; i++) { func00033f44(i, volume); } @@ -899,7 +917,7 @@ void snd0000ea80(u16 volume) } #endif - for (i = 0; i < 9; i++) { + for (i = 0; i < NUM_KEYTHINGS; i++) { func00033f44(i, volume); } } @@ -976,7 +994,7 @@ void sndLoadSfxCtl(void) g_SndCache.indexes[i] = -1; } - for (i = 0; i < 45; i++) { + for (i = 0; i < NUM_CACHE_SLOTS; i++) { #if VERSION >= VERSION_NTSC_1_0 g_SndCache.ages[i] = 1; #else @@ -992,7 +1010,7 @@ void sndIncrementAges(void) { s32 i; - for (i = 0; i < 45; i++) { + for (i = 0; i < NUM_CACHE_SLOTS; i++) { if (g_SndCache.refcounts[i] == 0 && g_SndCache.ages[i] < 32000) { g_SndCache.ages[i]++; } @@ -1314,7 +1332,7 @@ ALSound *sndLoadSound(s16 soundnum) oldestindex = -1; oldestage = 0; - for (i = 0; i < 45; i++) { + for (i = 0; i < NUM_CACHE_SLOTS; i++) { if (g_SndCache.refcounts[i] == 0) { #if VERSION >= VERSION_NTSC_1_0 if (g_SndCache.ages[i] > oldestage) { @@ -1383,9 +1401,9 @@ void seqInit(struct seqinstance *seq) func00030c98(&config); if (IS4MB()) { - g_SeqBufferSize = 0x3800; + g_SeqBufferSize = MAX_SEQ_SIZE_4MB; } else { - g_SeqBufferSize = 0x4800; + g_SeqBufferSize = MAX_SEQ_SIZE_8MB; } seq->data = alHeapAlloc(&g_SndHeap, 1, g_SeqBufferSize); @@ -1398,7 +1416,7 @@ void seqInit(struct seqinstance *seq) void sndAddRef(ALSound *sound) { - if (sound >= &g_SndCache.sounds[0] && sound <= &g_SndCache.sounds[44]) { + if (sound >= &g_SndCache.sounds[0] && sound <= &g_SndCache.sounds[NUM_CACHE_SLOTS - 1]) { s32 cacheindex = sound - g_SndCache.sounds; g_SndCache.refcounts[cacheindex]++; } @@ -1406,7 +1424,7 @@ void sndAddRef(ALSound *sound) void sndRemoveRef(ALSound *sound) { - if (sound >= &g_SndCache.sounds[0] && sound <= &g_SndCache.sounds[44]) { + if (sound >= &g_SndCache.sounds[0] && sound <= &g_SndCache.sounds[NUM_CACHE_SLOTS - 1]) { s32 cacheindex = sound - g_SndCache.sounds; g_SndCache.refcounts[cacheindex]--; } @@ -1417,7 +1435,7 @@ void sndInit(void) ALSndpConfig sndpconfig; ALSynConfig synconfig; #if VERSION >= VERSION_PAL_BETA - u32 settings[3]; + u32 settings[3]; #endif #if VERSION >= VERSION_JPN_FINAL @@ -1469,7 +1487,7 @@ void sndInit(void) // Allocate some space at the start of the heap for a string identifier. // This might be used to determine if the heap has overflowed. - g_SndGuardStringPtr = alHeapAlloc(&g_SndHeap, 1, 32); + g_SndGuardStringPtr = alHeapAlloc(&g_SndHeap, 1, ALIGN16(sizeof(g_SndGuardString))); strcpy(g_SndGuardStringPtr, g_SndGuardString); // Load sfx.ctl @@ -1492,7 +1510,7 @@ void sndInit(void) len = g_SeqTable->count * sizeof(struct seqtableentry) + 4; g_SeqTable = alHeapDBAlloc(0, 0, &g_SndHeap, 1, len); - dmaExec(g_SeqTable, (romptr_t) &_sequencesSegmentRomStart, (len + 0xf) & 0xfffffff0); + dmaExec(g_SeqTable, (romptr_t) &_sequencesSegmentRomStart, (len + 0xf) & ~0xf); // Promote segment-relative offsets to ROM addresses for (i = 0; i < g_SeqTable->count; i++) { @@ -1514,7 +1532,7 @@ void sndInit(void) sndpconfig.maxEvents = 64; sndpconfig.maxStates = 64; sndpconfig.maxSounds = 20; - sndpconfig.unk10 = 9; + sndpconfig.unk10 = NUM_KEYTHINGS; sndpconfig.heap = &g_SndHeap; #if VERSION >= VERSION_PAL_BETA @@ -1537,7 +1555,7 @@ void sndInit(void) osSyncPrintf("RWI : MP3 player Initialising Done\n"); } - for (i = 0; i < 3; i++) { + for (i = 0; i < ARRAYCOUNT(g_SeqInstances); i++) { seqInit(&g_SeqInstances[i]); }