From 5ad7cf9dbb90c1609d772d57f2f171828b4bf171 Mon Sep 17 00:00:00 2001 From: zelda2774 <69368340+zelda2774@users.noreply.github.com> Date: Sun, 7 Nov 2021 17:58:50 +0100 Subject: [PATCH] Document parts of audio (#1000) * Minor labelling * progress * play percentage -> delay * duration -> gatetime * more * more * more * seqIdx -> playerIdx * more * more * more * more * format * fix comment * filters * more * media * confusion * Sync load is actually slow load * AudioHeap prefix * more * more * reformat * more * more * AudioLoad * more * more * seq banks * more consistent * more * name last function in audio_load * More audio_synthesis * clean up audio tables * minor * slow/fast load ramAddr * format * remove unused * Remove union * remove padding * audio bank -> sound font * seqLayer -> layer * stuff * seqChannel -> channel * ChannelLayer -> Layer * remove define, add bug comment * format * more * cache enum * more * AudioSeq function prefix * naming * bankIdx -> bankId * more * format * review * more * fixes * avoid hardcoded sfxid's * SE -> Sfx Co-authored-by: zelda2774 --- data/audio_synthesis.data.s | 6 +- data/code_800F7260.bss.s | 18 +- data/rsp.rodata.s | 6 +- include/functions.h | 227 +-- include/variables.h | 79 +- include/z64audio.h | 599 +++--- spec | 2 +- src/boot/yaz0.c | 4 +- src/boot/z_std_dma.c | 32 +- src/code/audioMgr.c | 6 +- src/code/audio_effects.c | 68 +- src/code/audio_heap.c | 946 ++++----- .../{audio_rodata.c => audio_init_params.c} | 4 +- src/code/audio_load.c | 1816 +++++++++-------- src/code/audio_playback.c | 393 ++-- src/code/audio_seqplayer.c | 802 ++++---- src/code/audio_synthesis.c | 286 +-- src/code/code_8006BA00.c | 4 +- src/code/code_800C3C20.c | 2 +- src/code/code_800E4FE0.c | 84 +- src/code/code_800EC960.c | 765 +++---- src/code/code_800F7260.c | 551 ++--- src/code/code_800F9280.c | 215 +- src/code/fault.c | 6 +- src/code/sched.c | 2 +- src/code/z_actor.c | 2 +- src/code/z_camera.c | 4 +- src/code/z_effect_soft_sprite.c | 4 +- src/code/z_play.c | 4 +- .../actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c | 2 +- .../actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c | 2 +- .../ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c | 2 +- .../actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c | 2 +- src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c | 2 +- .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 10 +- .../actors/ovl_Boss_Goma/z_boss_goma.c | 2 +- src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c | 2 +- src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c | 2 +- .../ovl_En_Diving_Game/z_en_diving_game.c | 2 +- .../actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c | 2 +- src/overlays/actors/ovl_En_GeldB/z_en_geldb.c | 4 +- src/overlays/actors/ovl_En_Go2/z_en_go2.c | 4 +- src/overlays/actors/ovl_En_Horse/z_en_horse.c | 2 +- .../actors/ovl_En_Po_Field/z_en_po_field.c | 2 +- src/overlays/actors/ovl_En_Poh/z_en_poh.c | 4 +- src/overlays/actors/ovl_En_Test/z_en_test.c | 6 +- .../actors/ovl_En_Viewer/z_en_viewer.c | 2 +- .../actors/ovl_En_Wallmas/z_en_wallmas.c | 2 +- .../ovl_En_Yabusame_Mark/z_en_yabusame_mark.c | 2 +- .../actors/ovl_player_actor/z_player.c | 6 +- 50 files changed, 3493 insertions(+), 3508 deletions(-) rename src/code/{audio_rodata.c => audio_init_params.c} (69%) diff --git a/data/audio_synthesis.data.s b/data/audio_synthesis.data.s index b2c81bdc94..c6d32b16d1 100644 --- a/data/audio_synthesis.data.s +++ b/data/audio_synthesis.data.s @@ -59,7 +59,7 @@ glabel gNoteFrequencies glabel gDefaultShortNoteVelocityTable .incbin "baserom.z64", 0xBA6C54, 0x10 -glabel gDefaultShortNoteDurationTable +glabel gDefaultShortNoteGateTimeTable .incbin "baserom.z64", 0xBA6C64, 0x10 glabel gDefaultEnvelope @@ -95,10 +95,10 @@ glabel gDefaultPanVolume glabel D_80130224 .incbin "baserom.z64", 0xBA73C4, 0x4 -glabel D_80130228 +glabel sLowPassFilterData .incbin "baserom.z64", 0xBA73C8, 0x100 -glabel D_80130328 +glabel sHighPassFilterData .incbin "baserom.z64", 0xBA74C8, 0x148 glabel D_80130470 diff --git a/data/code_800F7260.bss.s b/data/code_800F7260.bss.s index db9ffff2db..7a55499e0e 100644 --- a/data/code_800F7260.bss.s +++ b/data/code_800F7260.bss.s @@ -33,34 +33,34 @@ glabel D_8016C8B0 glabel sSoundRequests .space 0x1800 -glabel D_8016E1A0 +glabel sSoundBankListEnd .space 0x8 -glabel D_8016E1A8 +glabel sSoundBankFreeListStart .space 0x8 -glabel D_8016E1B0 +glabel sSoundBankUnused .space 0x8 -glabel D_8016E1B8 +glabel gActiveSounds .space 0xA8 -glabel D_8016E260 +glabel sCurSfxPlayerChannelIdx .space 0x4 glabel gSoundBankMuted .space 0xC -glabel D_8016E270 +glabel sUnusedBankLerp .space 0x70 -glabel gAudioSEFlagSwapSource +glabel gAudioSfxSwapSource .space 0x18 -glabel gAudioSEFlagSwapTarget +glabel gAudioSfxSwapTarget .space 0x18 -glabel gAudioSEFlagSwapMode +glabel gAudioSfxSwapMode .space 0x10 glabel D_8016E320 diff --git a/data/rsp.rodata.s b/data/rsp.rodata.s index 2dd4535a96..82c2c97c62 100644 --- a/data/rsp.rodata.s +++ b/data/rsp.rodata.s @@ -9,16 +9,16 @@ .balign 16 -glabel gAudioBankTable +glabel gSoundFontTable .incbin "baserom.z64", 0xBCC270, 0x270 -glabel D_80155340 +glabel gSequenceFontTable .incbin "baserom.z64", 0xBCC4E0, 0x1C0 glabel gSequenceTable .incbin "baserom.z64", 0xBCC6A0, 0x6F0 -glabel gAudioTable +glabel gSampleBankTable .incbin "baserom.z64", 0xBCCD90, 0x80 glabel rspAspMainDataStart diff --git a/include/functions.h b/include/functions.h index 5c9dd189f1..f38472f96c 100644 --- a/include/functions.h +++ b/include/functions.h @@ -17,9 +17,8 @@ void Idle_ThreadEntry(void* arg); void ViConfig_UpdateVi(u32 mode); void ViConfig_UpdateBlack(void); s32 DmaMgr_CompareName(const char* name1, const char* name2); -s32 DmaMgr_DMARomToRam(u32 rom, u32 ram, u32 size); -s32 DmaMgr_DmaCallback0(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction); -void DmaMgr_DmaCallback1(u32 ram, u32 rom, u32 size); +s32 DmaMgr_DmaRomToRam(u32 rom, u32 ram, u32 size); +s32 DmaMgr_DmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction); void DmaMgr_Error(DmaRequest* req, const char* file, const char* errorName, const char* errorDesc); const char* DmaMgr_GetFileNameImpl(u32 vrom); const char* DmaMgr_GetFileName(u32 vrom); @@ -1891,76 +1890,57 @@ void UCodeDisas_Destroy(UCodeDisas*); void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*); void UCodeDisas_SetCurUCode(UCodeDisas*, void*); Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen); -void Audio_DiscardBank(s32 bankId); -void Audio_DiscardSequence(s32 seqId); -void func_800DE238(void* mem, u32 size); -void* func_800DE258(SoundAllocPool* pool, u32 size); -void* func_800DE2B0(SoundAllocPool* pool, u32 size); -void* Audio_AllocDmaMemory(SoundAllocPool* pool, u32 size); -void* Audio_AllocDmaMemoryZeroed(SoundAllocPool* pool, u32 size); -void* Audio_AllocZeroed(SoundAllocPool* pool, u32 size); -void* Audio_Alloc(SoundAllocPool* pool, u32 size); -void Audio_SoundAllocPoolInit(SoundAllocPool* pool, void* memAddr, u32 size); -void Audio_PersistentPoolClear(PersistentPool* persistent); -void Audio_TemporaryPoolClear(TemporaryPool* temporary); -void func_800DE4B0(s32 poolIdx); -void Audio_InitMainPools(s32 sizeForAudioInitPool); -void Audio_SessionPoolsInit(AudioPoolSplit4* split); -void Audio_SeqAndBankPoolInit(AudioPoolSplit2* split); -void Audio_PersistentPoolsInit(AudioPoolSplit3* split); -void Audio_TemporaryPoolsInit(AudioPoolSplit3* split); -void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id); -void* func_800DF074(s32 poolIdx, s32 arg1, s32 id); -void* func_800DF0CC(s32 poolIdx, s32 arg1, s32 id); -void func_800DF5DC(s16* arg0, s32 arg1); -void func_800DF630(s16* arg0, s32 arg1); -void func_800DF688(s16* arg0, s32 arg1, s32 arg2); -void func_800DF7C4(void); -void func_800DF888(void); -s32 Audio_ResetStep(void); -void Audio_InitHeap(void); -void* func_800E04E8(s32 poolIdx, s32 id); -void* func_800E0540(s32 poolIdx, s32 id, u32 size); -void* func_800E05C4(u32 size, s32 arg1, void* arg2, s8 arg3, s32 arg4); -void func_800E0634(u32 arg0, u32 arg1); -UnkHeapEntry* func_800E06CC(u32 size); -void func_800E0964(UnkHeapEntry* entry, s32 bankId); -void func_800E0AD8(UnkHeapEntry* entry); -void func_800E0BB4(UnkHeapEntry* entry, AudioBankSample* sample); -UnkHeapEntry* func_800E0BF8(u32 size); -// ? func_800E0C80(?); -void func_800E0CBC(void); -void func_800E0E6C(s32 id); -void func_800E0E90(s32 id); -void func_800E0EB4(s32 arg0, s32 id); -void func_800E1148(void); -void func_800E11F0(void); -void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 medium); -void func_800E1618(s32 arg0); -s32 Audio_IsBankLoadComplete(s32 bankId); -s32 Audio_IsSeqLoadComplete(s32 seqId); -void Audio_SetBankLoadStatus(s32 bankId, s32 status); -void Audio_SetSeqLoadStatus(s32 seqId, s32 status); -void func_800E1C18(s32 channelIdx, s32 arg1); -s32 func_800E1D64(s32 arg0, s32 arg1, s32 arg2); -void Audio_AudioSeqAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3); -void Audio_AudioTableAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3); -void Audio_AudioBankAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3); -u8* func_800E1F38(s32 arg0, u32* arg1); -void func_800E1F7C(s32 arg0); -s32 func_800E20D4(s32 playerIndex, s32 seqId, s32 arg2); -s32 func_800E2124(s32 playerIndex, s32 seqId, s32 arg2); -void Audio_ProcessLoads(s32 resetStatus); -void func_800E301C(void* callback); -void Audio_ContextInit(void* heap, u32 heapSize); -void Audio_SyncLoadsInit(void); -s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, s8* arg2); -s32 Audio_SyncLoadSeq(s32 seqIdx, u8* ramAddr, s8* arg2); -void Audio_AsyncLoadReqInit(void); -void func_800E4D94(void); -void func_800E4EEC(s32 tableType, s32 arg1, s8* arg2); -void func_800E4F58(void); -void func_800E4FB0(void); +void AudioHeap_DiscardFont(s32 fontId); +void AudioHeap_DiscardSequence(s32 seqId); +void AudioHeap_WritebackDCache(void* mem, u32 size); +void* AudioHeap_AllocZeroedAttemptExternal(AudioAllocPool* pool, u32 size); +void* AudioHeap_AllocAttemptExternal(AudioAllocPool* pool, u32 size); +void* AudioHeap_AllocDmaMemory(AudioAllocPool* pool, u32 size); +void* AudioHeap_AllocDmaMemoryZeroed(AudioAllocPool* pool, u32 size); +void* AudioHeap_AllocZeroed(AudioAllocPool* pool, u32 size); +void* AudioHeap_Alloc(AudioAllocPool* pool, u32 size); +void AudioHeap_AllocPoolInit(AudioAllocPool* pool, void* mem, u32 size); +void AudioHeap_PersistentCacheClear(AudioPersistentCache* persistent); +void AudioHeap_TemporaryCacheClear(AudioTemporaryCache* temporary); +void AudioHeap_PopCache(s32 tableType); +void AudioHeap_InitMainPools(s32 sizeForAudioInitPool); +void* AudioHeap_AllocCached(s32 tableType, s32 size, s32 cache, s32 id); +void* AudioHeap_SearchCaches(s32 tableType, s32 arg1, s32 id); +void* AudioHeap_SearchRegularCaches(s32 tableType, s32 cache, s32 id); +void AudioHeap_LoadFilter(s16* filter, s32 filter1, s32 filter2); +s32 AudioHeap_ResetStep(void); +void AudioHeap_Init(void); +void* AudioHeap_SearchPermanentCache(s32 tableType, s32 id); +void* AudioHeap_AllocPermanent(s32 tableType, s32 id, u32 size); +void* AudioHeap_AllocSampleCache(u32 size, s32 fontId, void* sampleAddr, s8 medium, s32 cache); +void AudioHeap_ApplySampleBankCache(s32 sampleBankId); +void AudioLoad_DecreaseSampleDmaTtls(void); +void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 medium); +void AudioLoad_InitSampleDmaBuffers(s32 arg0); +s32 AudioLoad_IsFontLoadComplete(s32 fontId); +s32 AudioLoad_IsSeqLoadComplete(s32 seqId); +void AudioLoad_SetFontLoadStatus(s32 fontId, s32 status); +void AudioLoad_SetSeqLoadStatus(s32 seqId, s32 status); +void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1); +s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId); +void AudioLoad_AsyncLoadSeq(s32 seqId, s32 arg1, s32 retData, OSMesgQueue* retQueue); +void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 arg1, s32 retData, OSMesgQueue* retQueue); +void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* retQueue); +u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* arg1); +void AudioLoad_DiscardSeqFonts(s32 seqId); +s32 AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2); +s32 AudioLoad_SyncInitSeqPlayerSkipTicks(s32 playerIdx, s32 seqId, s32 arg2); +void AudioLoad_ProcessLoads(s32 resetStatus); +void AudioLoad_SetDmaHandler(DmaHandler callback); +void AudioLoad_Init(void* heap, u32 heapSize); +void AudioLoad_InitSlowLoads(void); +s32 AudioLoad_SlowLoadSample(s32 arg0, s32 arg1, s8* arg2); +s32 AudioLoad_SlowLoadSeq(s32 playerIdx, u8* ramAddr, s8* arg2); +void AudioLoad_InitAsyncLoads(void); +void AudioLoad_LoadPermanentSamples(void); +void AudioLoad_ScriptLoad(s32 tableType, s32 arg1, s8* arg2); +void AudioLoad_ProcessScriptLoads(void); +void AudioLoad_InitScriptLoads(void); AudioTask* func_800E4FE0(void); void Audio_QueueCmdF32(u32 arg0, f32 arg1); void Audio_QueueCmdS32(u32 arg0, s32 arg1); @@ -1983,16 +1963,16 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput); void Audio_NoteInit(Note* note); void Audio_NoteDisable(Note* note); void Audio_ProcessNotes(void); -AudioBankSound* Audio_InstrumentGetAudioBankSound(Instrument* instrument, s32 semitone); -Instrument* Audio_GetInstrumentInner(s32 bankId, s32 instId); -Drum* Audio_GetDrum(s32 bankId, s32 drumId); -AudioBankSound* Audio_GetSfx(s32 bankId, s32 sfxId); -s32 func_800E7744(s32 instrument, s32 bankId, s32 instId, void* arg3); -void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target); -void Audio_SeqChanLayerNoteDecay(SequenceChannelLayer* seqLayer); -void Audio_SeqChanLayerNoteRelease(SequenceChannelLayer* seqLayer); -s32 Audio_BuildSyntheticWave(Note* note, SequenceChannelLayer* seqLayer, s32 waveId); -void Audio_InitSyntheticWave(Note* note, SequenceChannelLayer* seqLayer); +SoundFontSound* Audio_InstrumentGetSound(Instrument* instrument, s32 semitone); +Instrument* Audio_GetInstrumentInner(s32 fontId, s32 instId); +Drum* Audio_GetDrum(s32 fontId, s32 drumId); +SoundFontSound* Audio_GetSfx(s32 fontId, s32 sfxId); +s32 Audio_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, void* value); +void Audio_SeqLayerDecayRelease(SequenceLayer* layer, s32 target); +void Audio_SeqLayerNoteDecay(SequenceLayer* layer); +void Audio_SeqLayerNoteRelease(SequenceLayer* layer); +s32 Audio_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveId); +void Audio_InitSyntheticWave(Note* note, SequenceLayer* layer); void Audio_InitNoteList(AudioListItem* list); void Audio_InitNoteLists(NotePool* pool); void Audio_InitNoteFreeList(void); @@ -2000,16 +1980,16 @@ void Audio_NotePoolClear(NotePool* pool); void Audio_NotePoolFill(NotePool* pool, s32 count); void Audio_AudioListPushFront(AudioListItem* list, AudioListItem* item); void Audio_AudioListRemove(AudioListItem* item); -Note* Audio_PopNodeWithValueLessEqual(AudioListItem* list, s32 limit); -void Audio_NoteInitForLayer(Note* note, SequenceChannelLayer* seqLayer); -void func_800E82C0(Note* note, SequenceChannelLayer* seqLayer); -void Audio_NoteReleaseAndTakeOwnership(Note* note, SequenceChannelLayer* seqLayer); -Note* Audio_AllocNoteFromDisabled(NotePool* pool, SequenceChannelLayer* seqLayer); -Note* Audio_AllocNoteFromDecaying(NotePool* pool, SequenceChannelLayer* seqLayer); -Note* Audio_AllocNoteFromActive(NotePool* pool, SequenceChannelLayer* seqLayer); -Note* Audio_AllocNote(SequenceChannelLayer* seqLayer); +Note* Audio_FindNodeWithPrioLessThan(AudioListItem* list, s32 limit); +void Audio_NoteInitForLayer(Note* note, SequenceLayer* layer); +void func_800E82C0(Note* note, SequenceLayer* layer); +void Audio_NoteReleaseAndTakeOwnership(Note* note, SequenceLayer* layer); +Note* Audio_AllocNoteFromDisabled(NotePool* pool, SequenceLayer* layer); +Note* Audio_AllocNoteFromDecaying(NotePool* pool, SequenceLayer* layer); +Note* Audio_AllocNoteFromActive(NotePool* pool, SequenceLayer* layer); +Note* Audio_AllocNote(SequenceLayer* layer); void Audio_NoteInitAll(void); -void Audio_SequenceChannelProcessSound(SequenceChannel* seqChannel, s32 recalculateVolume, s32 b); +void Audio_SequenceChannelProcessSound(SequenceChannel* channel, s32 recalculateVolume, s32 b); void Audio_SequencePlayerProcessSound(SequencePlayer* seqPlayer); f32 Audio_GetPortamentoFreqScale(Portamento* p); s16 Audio_GetVibratoPitchChange(VibratoState* vib); @@ -2019,16 +1999,16 @@ void Audio_NoteVibratoInit(Note* note); void Audio_NotePortamentoInit(Note* note); void Audio_AdsrInit(AdsrState* adsr, AdsrEnvelope* envelope, s16* volOut); f32 Audio_AdsrUpdate(AdsrState* adsr); -void Audio_SequenceChannelDisable(SequenceChannel* seqChannel); -void Audio_SequencePlayerDisableAsFinished(SequencePlayer* seqPlayer); -void Audio_SequencePlayerDisable(SequencePlayer* seqPlayer); -void Audio_AudioListPushBack(AudioListItem* list, AudioListItem* item); -void* Audio_AudioListPopBack(AudioListItem* list); -void Audio_ProcessSequences(s32 arg0); -void Audio_ProcessSequence(SequencePlayer* seqPlayer); -void Audio_ResetSequencePlayer(SequencePlayer* seqPlayer); -void func_800EC734(s32 seqPlayerIdx); -void Audio_InitSequencePlayers(void); +void AudioSeq_SequenceChannelDisable(SequenceChannel* channel); +void AudioSeq_SequencePlayerDisableAsFinished(SequencePlayer* seqPlayer); +void AudioSeq_SequencePlayerDisable(SequencePlayer* seqPlayer); +void AudioSeq_AudioListPushBack(AudioListItem* list, AudioListItem* item); +void* AudioSeq_AudioListPopBack(AudioListItem* list); +void AudioSeq_ProcessSequences(s32 arg0); +void AudioSeq_SkipForwardSequence(SequencePlayer* seqPlayer); +void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer); +void AudioSeq_InitSequencePlayerChannels(s32 playerIdx); +void AudioSeq_InitSequencePlayers(void); void func_800ECC04(u16); void func_800ED858(u8); void func_800ED93C(s8 songIdx, s8 arg1); @@ -2042,7 +2022,7 @@ void func_800EE824(void); void AudioDebug_Draw(GfxPrint* printer); void AudioDebug_ScrPrt(const s8* str, u16 num); void func_800F3054(void); -void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx); +void Audio_SetSoundProperties(u8 bankId, u8 entryIdx, u8 channelIdx); void func_800F3F3C(u8); void func_800F4010(Vec3f* pos, u16 sfxId, f32); void Audio_PlaySoundRandom(Vec3f* pos, u16 baseSfxId, u8 randLim); @@ -2084,7 +2064,7 @@ void func_800F5B58(void); void func_800F5BF0(u8 arg0); void func_800F5C64(u16); void func_800F5C2C(void); -void func_800F5E18(u8 seqIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4); +void func_800F5E18(u8 playerIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4); void func_800F5E90(u8); void func_800F6114(f32 dist); void func_800F6268(f32 dist, u16); @@ -2093,8 +2073,8 @@ void func_800F6584(u8 arg0); void Audio_SetEnvReverb(s8 reverb); void Audio_SetCodeReverb(s8 reverb); void func_800F6700(s8 outputMode); -void func_800F67A0(u8); -void func_800F6828(u8); +void Audio_SetBaseFilter(u8); +void Audio_SetExtraFilter(u8); void Audio_SetCutsceneFlag(s8 flag); void Audio_PlaySoundIfNotInCutscene(u16 sfxId); void func_800F6964(u16); @@ -2106,33 +2086,30 @@ void Audio_PreNMI(); void func_800F6D58(u8, u8, u8); // ? func_800F6E7C(?); void func_800F6FB4(u8); -void func_800F70F8(); -void func_800F711C(); +void Audio_Init(); +void Audio_InitSound(); void func_800F7170(void); void func_800F71BC(s32 arg0); void Audio_SetSoundBanksMute(u16 muteMask); -void Audio_QueueSeqCmdMute(u8); -void Audio_ClearBGMMute(u8); -void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 a2, f32* freqScale, f32* a4, s8* reverbAdd); +void Audio_QueueSeqCmdMute(u8 channelIdx); +void Audio_ClearBGMMute(u8 channelIdx); +void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* a4, s8* reverbAdd); void Audio_ProcessSoundRequest(void); -void func_800F7B54(u8, u8); -void func_800F7CEC(u8); -void func_800F8480(u8); -void func_800F87A0(u8); +void Audio_ChooseActiveSounds(u8 bankId); +void Audio_PlayActiveSounds(u8 bankId); +void Audio_StopSfxByBank(u8 bankId); void func_800F8884(u8, Vec3f*); -void func_800F89A0(u8, Vec3f*); -void func_800F89E8(Vec3f*); -void func_800F9280(u8 seqIdx, u8 seqId, u8 arg2, u16 fadeTimer); +void Audio_StopSfxByPosAndBank(u8, Vec3f*); +void Audio_StopSfxByPos(Vec3f*); +void func_800F9280(u8 playerIdx, u8 seqId, u8 arg2, u16 fadeTimer); void Audio_QueueSeqCmd(u32 bgmID); -void func_800F8A44(Vec3f* pos, u16 sfxId); -void func_800F8BA0(u8, u16); -void Audio_StopSfx(u32 sfxId); +void Audio_StopSfxByPosAndId(Vec3f* pos, u16 sfxId); +void Audio_StopSfxByTokenAndId(u8, u16); +void Audio_StopSfxById(u32 sfxId); void Audio_ProcessSoundRequests(void); -void func_800F8EA0(u8, u8, u16); -void func_800F8F34(u8); void func_800F8F88(void); u8 Audio_IsSfxPlaying(u32 sfxId); -void func_800F905C(void); +void Audio_ResetSounds(void); void func_800F9474(u8, u16); void func_800F94FC(u32); void Audio_ProcessSeqCmd(u32); @@ -2141,7 +2118,7 @@ u16 func_800FA0B4(u8 a0); s32 func_800FA11C(u32 arg0, u32 arg1); void func_800FA174(u8); void func_800FA18C(u8, u8); -void Audio_SetVolScale(u8 seqIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer); +void Audio_SetVolScale(u8 playerIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer); void func_800FA3DC(void); u8 func_800FAD34(void); void func_800FADF8(void); diff --git a/include/variables.h b/include/variables.h index d6cc3463a9..bd1ac24f51 100644 --- a/include/variables.h +++ b/include/variables.h @@ -331,7 +331,7 @@ extern f32 gPitchBendFrequencyScale[256]; extern f32 D_8012F4B4[256]; extern f32 gNoteFrequencies[]; extern u8 gDefaultShortNoteVelocityTable[16]; -extern u8 gDefaultShortNoteDurationTable[16]; +extern u8 gDefaultShortNoteGateTimeTable[16]; extern AdsrEnvelope gDefaultEnvelope[3]; extern NoteSubEu gZeroNoteSub; extern NoteSubEu gDefaultNoteSub; @@ -339,14 +339,14 @@ extern u16 gHeadsetPanQuantization[0x10]; extern f32 gHeadsetPanVolume[128]; extern f32 gStereoPanVolume[128]; extern f32 gDefaultPanVolume[128]; -extern s16 D_80130228[]; -extern s16 D_80130328[]; +extern s16 sLowPassFilterData[16*8]; +extern s16 sHighPassFilterData[15*8]; extern s32 gAudioContextInitalized; extern f32 D_80130510; extern s32 D_80130514; -extern u8 D_80130570[7]; -extern u8 D_80130578[4][7]; -extern u8 D_80130594[4][7]; +extern u8 gIsLargeSoundBank[7]; +extern u8 gChannelsPerBank[4][7]; +extern u8 gUsedChannelsPerBank[4][7]; extern u8 gMorphaTransposeTable[16]; extern u8* gFrogsSongPtr; extern OcarinaNote* gScarecrowCustomSongPtr; @@ -357,13 +357,13 @@ extern char D_80133390[]; extern char D_80133398[]; extern SoundBankEntry* gSoundBanks[7]; extern u8 sBankSizes[7]; -extern u8 D_801333CC; +extern u8 gSfxChannelLayout; extern u16 D_801333D0; extern Vec3f D_801333D4; extern f32 D_801333E0; extern s8 D_801333E8; extern u8 D_801333F0; -extern u8 gAudioSEFlagSwapOff; +extern u8 gAudioSfxSwapOff; extern u8 D_801333F8; //extern ? sSeqCmdWrPos; //extern ? sSeqCmdRdPos; @@ -2818,10 +2818,10 @@ extern s16 D_80153960[]; //extern ? D_80154AE8; //extern ? D_80154AFC; //extern ? D_80154B00; -extern u8 gAudioBankTable[]; -extern u8 D_80155340[]; +extern u8 gSoundFontTable[]; +extern u8 gSequenceFontTable[]; extern u8 gSequenceTable[]; -extern u8 gAudioTable[]; +extern u8 gSampleBankTable[]; extern u8 D_80155F50[]; extern u8 D_80157580[]; extern u8 D_801579A0[]; @@ -3038,60 +3038,11 @@ extern SpeedMeterTimeEntry* gSpeedMeterTimeEntryPtr; //extern ? D_8016A794; //extern ? D_8016A7AC; extern FaultThreadStruct gFaultStruct; -//extern ? D_8016B5F6; -//extern ? D_8016B684; -//extern ? D_8016B690; -//extern ? D_8016B692; -//extern ? D_8016B6A0; -//extern ? D_8016B6B5; -//extern ? D_8016B6B8; -extern OSMesgQueue D_8016B6E0; -//extern ? D_8016B7A8; -//extern ? D_8016B7AC; -//extern ? D_8016B7B0; -//extern ? D_8016B7D8; -//extern ? D_8016B7DC; -//extern ? D_8016B7E0; -//extern ? D_8016B8B0; -//extern ? D_8016B8B1; -//extern ? D_8016B8B2; -//extern ? D_8016B8B3; -//extern ? D_8016B8B8; -//extern ? D_8016B9B8; -//extern ? D_8016B9D8; -//extern ? D_8016B9F2; -//extern ? D_8016B9F3; -//extern ? D_8016B9F4; -//extern ? D_8016B9F6; -//extern ? D_8016B9F8; -//extern ? D_8016B9F9; -//extern ? D_8016BA00; -//extern ? D_8016BA04; -//extern ? D_8016BA08; -//extern ? D_8016BA09; -//extern ? D_8016BA10; -//extern ? D_8016BA18; -//extern ? D_8016BA2E; -//extern ? D_8016BA50; -//extern ? D_8016BA70; -//extern ? D_8016BAA0; -extern SoundBankEntry D_8016BAD0[9]; -extern SoundBankEntry D_8016BC80[12]; -extern SoundBankEntry D_8016BEC0[22]; -extern SoundBankEntry D_8016C2E0[20]; -extern SoundBankEntry D_8016C6A0[8]; -extern SoundBankEntry D_8016C820[3]; -extern SoundBankEntry D_8016C8B0[5]; -extern u8 D_8016E1A0[7]; -extern u8 D_8016E1A8[7]; -extern u8 D_8016E1B0[7]; -extern Struct_800F7CEC D_8016E1B8[7][3]; // total size = 0xA8 -extern u8 D_8016E260; +extern ActiveSound gActiveSounds[7][MAX_CHANNELS_PER_BANK]; // total size = 0xA8 extern u8 gSoundBankMuted[]; -//extern ? D_8016E270; -extern u16 gAudioSEFlagSwapSource[10]; -extern u16 gAudioSEFlagSwapTarget[10]; -extern u8 gAudioSEFlagSwapMode[10]; +extern u16 gAudioSfxSwapSource[10]; +extern u16 gAudioSfxSwapTarget[10]; +extern u8 gAudioSfxSwapMode[10]; //extern ? D_8016E320; //extern ? D_8016E348; extern unk_D_8016E750 D_8016E750[4]; diff --git a/include/z64audio.h b/include/z64audio.h index 9eaef0fa6b..ce1b716b6a 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -3,42 +3,68 @@ #define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0)) -/** - * Structs in this repository have primarily been imported from the SM64 Decompilation. - * Some struct members may be wrong; the symbol '?' next to an offset means the member is a guess. - */ - -#define NO_LAYER ((SequenceChannelLayer*)(-1)) -#define NO_CHANNEL ((SequenceChannel*)(-1)) +#define NO_LAYER ((SequenceLayer*)(-1)) #define TATUMS_PER_BEAT 48 #define IS_SEQUENCE_CHANNEL_VALID(ptr) ((u32)(ptr) != (u32)&gAudioContext.sequenceChannelNone) -#define ADSR_STATE_DISABLED 0 -#define ADSR_STATE_INITIAL 1 -#define ADSR_STATE_START_LOOP 2 -#define ADSR_STATE_LOOP 3 -#define ADSR_STATE_FADE 4 -#define ADSR_STATE_HANG 5 -#define ADSR_STATE_DECAY 6 -#define ADSR_STATE_RELEASE 7 -#define ADSR_STATE_SUSTAIN 8 +#define MAX_CHANNELS_PER_BANK 3 #define ADSR_DISABLE 0 #define ADSR_HANG -1 #define ADSR_GOTO -2 #define ADSR_RESTART -3 -#define AIBUF_LEN 0xB00 +#define AIBUF_LEN 0x580 -#define CODEC_ADPCM 0 -#define CODEC_S8 1 +typedef enum { + /* 0 */ ADSR_STATE_DISABLED, + /* 1 */ ADSR_STATE_INITIAL, + /* 2 */ ADSR_STATE_START_LOOP, + /* 3 */ ADSR_STATE_LOOP, + /* 4 */ ADSR_STATE_FADE, + /* 5 */ ADSR_STATE_HANG, + /* 6 */ ADSR_STATE_DECAY, + /* 7 */ ADSR_STATE_RELEASE, + /* 8 */ ADSR_STATE_SUSTAIN +} AdsrStatus; + +typedef enum { + /* 0 */ MEDIUM_RAM, + /* 1 */ MEDIUM_UNK, + /* 2 */ MEDIUM_CART, + /* 3 */ MEDIUM_DISK_DRIVE +} SampleMedium; + +typedef enum { + /* 0 */ CODEC_ADPCM, + /* 1 */ CODEC_S8, + /* 2 */ CODEC_S16_INMEMORY, + /* 3 */ CODEC_SMALL_ADPCM, + /* 4 */ CODEC_REVERB, + /* 5 */ CODEC_S16 +} SampleCodec; + +typedef enum { + /* 0 */ SEQUENCE_TABLE, + /* 1 */ FONT_TABLE, + /* 2 */ SAMPLE_TABLE +} SampleBankTableType; + +typedef enum { + /* 0 */ CACHE_TEMPORARY, + /* 1 */ CACHE_PERSISTENT, + /* 2 */ CACHE_EITHER, + /* 3 */ CACHE_PERMANENT +} AudioCacheType; + +typedef s32 (*DmaHandler)(OSPiHandle* handle, OSIoMesg* mb, s32 direction); struct Note; struct NotePool; struct SequenceChannel; -struct SequenceChannelLayer; +struct SequenceLayer; typedef struct AudioListItem { // A node in a circularly linked list. Each node is either a head or an item: @@ -51,7 +77,7 @@ typedef struct AudioListItem { /* 0x00 */ struct AudioListItem* prev; /* 0x04 */ struct AudioListItem* next; /* 0x08 */ union { - void* value; // either Note* or SequenceChannelLayer* + void* value; // either Note* or SequenceLayer* s32 count; } u; /* 0x0C */ struct NotePool* pool; @@ -97,18 +123,18 @@ typedef struct { typedef struct { /* 0x00 */ u32 codec : 4; /* 0x00 */ u32 medium : 2; - /* 0x00 */ u32 unk_bits26 : 1; - /* 0x00 */ u32 unk_bits25 : 1; + /* 0x00 */ u32 unk_bit26 : 1; + /* 0x00 */ u32 unk_bit25 : 1; /* 0x01 */ u32 size : 24; /* 0x04 */ u8* sampleAddr; /* 0x08 */ AdpcmLoop* loop; /* 0x0C */ AdpcmBook* book; -} AudioBankSample; // size = 0x10 +} SoundFontSample; // size = 0x10 typedef struct { - /* 0x00 */ AudioBankSample* sample; + /* 0x00 */ SoundFontSample* sample; /* 0x04 */ f32 tuning; // frequency scale factor -} AudioBankSound; // size = 0x8 +} SoundFontSound; // size = 0x8 typedef struct { /* 0x00 */ s16 numSamplesAfterDownsampling; // never read @@ -158,8 +184,8 @@ typedef struct { /* 0x274 */ s16* filterRight; /* 0x278 */ s16* filterLeftState; /* 0x27C */ s16* filterRightState; - /* 0x280 */ AudioBankSound sound; - /* 0x288 */ AudioBankSample sample; + /* 0x280 */ SoundFontSound sound; + /* 0x288 */ SoundFontSample sample; /* 0x298 */ AdpcmLoop loop; } SynthesisReverb; // size = 0x2C8 @@ -169,29 +195,29 @@ typedef struct { /* 0x02 */ u8 normalRangeHi; /* 0x03 */ u8 releaseRate; /* 0x04 */ AdsrEnvelope* envelope; - /* 0x08 */ AudioBankSound lowNotesSound; - /* 0x10 */ AudioBankSound normalNotesSound; - /* 0x18 */ AudioBankSound highNotesSound; + /* 0x08 */ SoundFontSound lowNotesSound; + /* 0x10 */ SoundFontSound normalNotesSound; + /* 0x18 */ SoundFontSound highNotesSound; } Instrument; // size = 0x20 typedef struct { /* 0x00 */ u8 releaseRate; /* 0x01 */ u8 pan; /* 0x02 */ u8 loaded; - /* 0x04 */ AudioBankSound sound; + /* 0x04 */ SoundFontSound sound; /* 0x14 */ AdsrEnvelope* envelope; } Drum; // size = 0x14 typedef struct { /* 0x00 */ u8 numInstruments; /* 0x01 */ u8 numDrums; - /* 0x02 */ u8 unk_02; - /* 0x03 */ u8 unk_03; + /* 0x02 */ u8 sampleBankId1; + /* 0x03 */ u8 sampleBankId2; /* 0x04 */ u16 numSfx; /* 0x08 */ Instrument** instruments; /* 0x0C */ Drum** drums; - /* 0x10 */ AudioBankSound* soundEffects; -} CtlEntry; // size = 0x14 + /* 0x10 */ SoundFontSound* soundEffects; +} SoundFont; // size = 0x14 typedef struct { /* 0x00 */ u8* pc; @@ -199,7 +225,7 @@ typedef struct { /* 0x14 */ u8 remLoopIters[4]; /* 0x18 */ u8 depth; /* 0x19 */ s8 value; -} M64ScriptState; // size = 0x1C +} SeqScriptState; // size = 0x1C // Also known as a Group, according to debug strings. typedef struct { @@ -207,17 +233,17 @@ typedef struct { /* 0x000 */ u8 finished : 1; /* 0x000 */ u8 muted : 1; /* 0x000 */ u8 seqDmaInProgress : 1; - /* 0x000 */ u8 bankDmaInProgress : 1; - /*?0x000 */ u8 recalculateVolume : 1; - /* 0x000 */ u8 unk_0b2 : 1; + /* 0x000 */ u8 fontDmaInProgress : 1; + /* 0x000 */ u8 recalculateVolume : 1; + /* 0x000 */ u8 stopScript : 1; /* 0x000 */ u8 unk_0b1 : 1; /* 0x001 */ u8 state; /* 0x002 */ u8 noteAllocPolicy; /* 0x003 */ u8 muteBehavior; /* 0x004 */ u8 seqId; - /* 0x005 */ u8 defaultBank; + /* 0x005 */ u8 defaultFont; /* 0x006 */ u8 unk_06[1]; - /* 0x007 */ s8 playerIndex; + /* 0x007 */ s8 playerIdx; /* 0x008 */ u16 tempo; // tatums per minute /* 0x00A */ u16 tempoAcc; /* 0x00C */ u16 unk_0C; @@ -234,23 +260,14 @@ typedef struct { /* 0x030 */ f32 appliedFadeVolume; /* 0x034 */ f32 unk_34; /* 0x038 */ struct SequenceChannel* channels[16]; - /* 0x078 */ M64ScriptState scriptState; + /* 0x078 */ SeqScriptState scriptState; /* 0x094 */ u8* shortNoteVelocityTable; - /* 0x098 */ u8* shortNoteDurationTable; + /* 0x098 */ u8* shortNoteGateTimeTable; /* 0x09C */ NotePool notePool; - /* 0x0DC */ s32 unk_DC; - /* 0x0E0 */ u32 unk_E0; - /* 0x0E4 */ u8 pad_E4[0x10]; // OSMesgQueue seqDmaMesgQueue; - /*?0x0F4 */ OSMesg seqDmaMesg; - /*?0x0F8 */ OSIoMesg seqDmaIoMesg; - /*?0x110 */ OSMesgQueue bankDmaMesgQueue; - /*?0x128 */ OSMesg bankDmaMesg; - /*?0x12C */ OSIoMesg bankDmaIoMesg; - /*?0x144 */ u8* bankDmaCurrMemAddr; - /*?0x148 */ u32 bankDmaCurrDevAddr; - /*?0x14C */ s32 bankDmaRemaining; - /* */ u8 pad_150[8]; - /* 0x158 */ s8 unk_158[8]; // "port" according to debug strings. seqVariationEu? soundScriptIO? + /* 0x0DC */ s32 skipTicks; + /* 0x0E0 */ u32 scriptCounter; + /* 0x0E4 */ char unk_E4[0x74]; // unused struct members for sequence/sound font dma management, according to sm64 decomp + /* 0x158 */ s8 soundScriptIO[8]; } SequencePlayer; // size = 0x160 typedef struct { @@ -282,8 +299,7 @@ typedef struct { } AdsrState; typedef struct { - /* 0x00 */ u8 bit0 : 1; // unused? - /* 0x00 */ u8 bit1 : 1; // unused? + /* 0x00 */ u8 unused : 2; /* 0x00 */ u8 bit2 : 2; /* 0x00 */ u8 strongRight : 1; /* 0x00 */ u8 strongLeft : 1; @@ -309,13 +325,12 @@ typedef struct { /* 0x14 */ s16 filterBuf[8]; } NoteAttributes; // size = 0x24 -// Also known as a SubTrack, according to debug strings. -// Confusingly, a SubTrack is a container of Tracks. +// Also known as a SubTrack, according to sm64 debug strings. typedef struct SequenceChannel { /* 0x00 */ u8 enabled : 1; /* 0x00 */ u8 finished : 1; /* 0x00 */ u8 stopScript : 1; - /* 0x00 */ u8 stopSomething2 : 1; // sets SequenceChannelLayer.stopSomething + /* 0x00 */ u8 stopSomething2 : 1; // sets SequenceLayer.stopSomething /* 0x00 */ u8 hasInstrument : 1; /* 0x00 */ u8 stereoHeadsetEffects : 1; /* 0x00 */ u8 largeNotes : 1; // notes specify duration and velocity @@ -333,14 +348,14 @@ typedef struct SequenceChannel { /* 0x04 */ u8 reverb; // or dry/wet mix /* 0x05 */ u8 notePriority; // 0-3 /* 0x06 */ u8 someOtherPriority; - /* 0x07 */ u8 bankId; + /* 0x07 */ u8 fontId; /* 0x08 */ u8 reverbIndex; /* 0x09 */ u8 bookOffset; /* 0x0A */ u8 newPan; /* 0x0B */ u8 panChannelWeight; // proportion of pan that comes from the channel (0..128) /* 0x0C */ u8 unk_0C; /* 0x0D */ u8 velocityRandomVariance; - /* 0x0E */ u8 durationRandomVariance; + /* 0x0E */ u8 gateTimeRandomVariance; /* 0x0F */ u8 unk_0F; /* 0x10 */ u16 vibratoRateStart; /* 0x12 */ u16 vibratoExtentStart; @@ -362,20 +377,20 @@ typedef struct SequenceChannel { /* 0x38 */ f32 freqScale; /* 0x3C */ u8 (*dynTable)[][2]; /* 0x40 */ struct Note* noteUnused; - /* 0x44 */ struct SequenceChannelLayer* layerUnused; + /* 0x44 */ struct SequenceLayer* layerUnused; /* 0x48 */ Instrument* instrument; /* 0x4C */ SequencePlayer* seqPlayer; - /* 0x50 */ struct SequenceChannelLayer* layers[4]; - /* 0x60 */ M64ScriptState scriptState; + /* 0x50 */ struct SequenceLayer* layers[4]; + /* 0x60 */ SeqScriptState scriptState; /* 0x7C */ AdsrSettings adsr; /* 0x84 */ NotePool notePool; - /* 0xC4 */ s8 soundScriptIO[8]; // bridge between sound script and audio lib + /* 0xC4 */ s8 soundScriptIO[8]; // bridge between sound script and audio lib, "io ports" /* 0xCC */ s16* filter; /* 0xD0 */ Stereo stereo; } SequenceChannel; // size = 0xD4 -// Also known as a Track, according to debug strings. -typedef struct SequenceChannelLayer { +// Might also be known as a Track, according to sm64 debug strings (?). +typedef struct SequenceLayer { /* 0x00 */ u8 enabled : 1; /* 0x00 */ u8 finished : 1; /* 0x00 */ u8 stopSomething : 1; @@ -386,20 +401,20 @@ typedef struct SequenceChannelLayer { /* 0x00 */ u8 notePropertiesNeedInit : 1; /* 0x01 */ Stereo stereo; /* 0x02 */ u8 instOrWave; - /* 0x03 */ u8 noteDuration; + /* 0x03 */ u8 gateTime; /* 0x04 */ u8 semitone; /* 0x05 */ u8 portamentoTargetNote; /* 0x06 */ u8 pan; // 0..128 /* 0x07 */ u8 notePan; /* 0x08 */ s16 delay; - /* 0x0A */ s16 duration; + /* 0x0A */ s16 gateDelay; /* 0x0C */ s16 delay2; /* 0x0E */ u16 portamentoTime; /* 0x10 */ s16 transposition; // #semitones added to play commands - // (m64 instruction encoding only allows referring to the limited range + // (seq instruction encoding only allows referring to the limited range // 0..0x3F; this makes 0x40..0x7F accessible as well) - /* 0x12 */ s16 shortNoteDefaultPlayPercentage; - /* 0x14 */ s16 playPercentage; + /* 0x12 */ s16 shortNoteDefaultDelay; + /* 0x14 */ s16 lastDelay; /* 0x18 */ AdsrSettings adsr; /* 0x20 */ Portamento portamento; /* 0x2C */ struct Note* note; @@ -410,11 +425,11 @@ typedef struct SequenceChannelLayer { /* 0x40 */ f32 noteVelocity; /* 0x44 */ f32 noteFreqScale; /* 0x48 */ Instrument* instrument; - /* 0x4C */ AudioBankSound* sound; - /* 0x50 */ SequenceChannel* seqChannel; - /* 0x54 */ M64ScriptState scriptState; + /* 0x4C */ SoundFontSound* sound; + /* 0x50 */ SequenceChannel* channel; + /* 0x54 */ SeqScriptState scriptState; /* 0x70 */ AudioListItem listItem; -} SequenceChannelLayer; // size = 0x80 +} SequenceLayer; // size = 0x80 typedef struct { /* 0x0000 */ s16 adpcmdecState[0x10]; @@ -431,7 +446,7 @@ typedef struct { /* 0x02 */ u8 prevHeadsetPanRight; /* 0x03 */ u8 prevHeadsetPanLeft; /* 0x04 */ u8 reverbVol; - /* 0x05 */ u8 numAdpcmParts; + /* 0x05 */ u8 numParts; /* 0x06 */ u16 samplePosFrac; /* 0x08 */ s32 samplePosInt; /* 0x0C */ NoteSynthesisBuffers* synthesisBuffers; @@ -446,7 +461,7 @@ typedef struct { } NoteSynthesisState; // size = 0x20 typedef struct { - /* 0x00 */ struct SequenceChannel* seqChannel; + /* 0x00 */ struct SequenceChannel* channel; /* 0x04 */ u32 time; /* 0x08 */ s16* curve; /* 0x0C */ f32 extent; @@ -461,44 +476,37 @@ typedef struct { /* 0x00 */ u8 priority; /* 0x01 */ u8 waveId; /* 0x02 */ u8 sampleCountIndex; - /* 0x03 */ u8 bankId; + /* 0x03 */ u8 fontId; /* 0x04 */ u8 unk_04; /* 0x05 */ u8 stereoHeadsetEffects; - /* 0x06 */ s16 adsrVolScale; // unused? + /* 0x06 */ s16 adsrVolScaleUnused; /* 0x08 */ f32 portamentoFreqScale; /* 0x0C */ f32 vibratoFreqScale; - /* 0x10 */ SequenceChannelLayer* prevParentLayer; - /* 0x14 */ SequenceChannelLayer* parentLayer; - /* 0x18 */ SequenceChannelLayer* wantedParentLayer; + /* 0x10 */ SequenceLayer* prevParentLayer; + /* 0x14 */ SequenceLayer* parentLayer; + /* 0x18 */ SequenceLayer* wantedParentLayer; /* 0x1C */ NoteAttributes attributes; /* 0x40 */ AdsrState adsr; // may contain portamento, vibratoState, if those are not part of Note itself } NotePlaybackState; typedef struct { - // these bitfields should perhaps be merged into a single struct - union { - struct { - /* 0x00 */ vu8 enabled : 1; - /* 0x00 */ u8 needsInit : 1; - /*?0x00 */ u8 finished : 1; - /* 0x00 */ u8 unused : 1; - /* 0x00 */ u8 stereoStrongRight : 1; - /* 0x00 */ u8 stereoStrongLeft : 1; - /* 0x00 */ u8 stereoHeadsetEffects : 1; - /*?0x00 */ u8 usesHeadsetPanEffects : 1; - } s; - /* 0x00 */ u8 asByte; // likely does not exist + struct { + /* 0x00 */ volatile u8 enabled : 1; + /* 0x00 */ u8 needsInit : 1; + /* 0x00 */ u8 finished : 1; // ? + /* 0x00 */ u8 unused : 1; + /* 0x00 */ u8 stereoStrongRight : 1; + /* 0x00 */ u8 stereoStrongLeft : 1; + /* 0x00 */ u8 stereoHeadsetEffects : 1; + /* 0x00 */ u8 usesHeadsetPanEffects : 1; // ? } bitField0; - union { - struct { - /* 0x01 */ u8 reverbIndex : 3; - /* 0x01 */ u8 bookOffset : 2; - /* 0x01 */ u8 isSyntheticWave : 1; - /* 0x01 */ u8 hasTwoAdpcmParts : 1; - /* 0x01 */ u8 usesHeadsetPanEffects2 : 1; - } s; - /* 0x01 */ u8 asByte; // likely does not exist + struct { + /* 0x01 */ u8 reverbIndex : 3; + /* 0x01 */ u8 bookOffset : 2; + /* 0x01 */ u8 isSyntheticWave : 1; + /* 0x01 */ u8 hasTwoParts : 1; + /* 0x01 */ u8 usesHeadsetPanEffects2 : 1; } bitField1; /* 0x02 */ u8 unk_2; /* 0x03 */ u8 headsetPanRight; @@ -511,7 +519,7 @@ typedef struct { /* 0x0C */ u16 resamplingRateFixedPoint; /* 0x0E */ u16 unk_0E; /* 0x10 */ union { - AudioBankSound* audioBankSound; + SoundFontSound* soundFontSound; s16* samples; // used for synthetic waves } sound; /* 0x14 */ s16* filter; @@ -540,30 +548,30 @@ typedef struct { /* 0x0E */ u16 leakLtr; /* 0x10 */ s8 unk_10; /* 0x12 */ u16 unk_12; - /* 0x14 */ s16 unk_14; - /* 0x16 */ s16 unk_16; + /* 0x14 */ s16 lowPassFilterCutoffLeft; + /* 0x16 */ s16 lowPassFilterCutoffRight; } ReverbSettings; // size = 0x18 typedef struct { /* 0x00 */ u32 frequency; /* 0x04 */ u8 unk_04; - /* 0x05 */ u8 maxSimultaneousNotes; + /* 0x05 */ u8 numNotes; /* 0x06 */ u8 numSequencePlayers; - /* 0x07 */ u8 unk_07[0x2]; + /* 0x07 */ u8 unk_07; // unused, set to zero + /* 0x08 */ u8 unk_08; // unused, set to zero /* 0x09 */ u8 numReverbs; - /* 0x0A */ u8 unk_0A[0x2]; /* 0x0C */ ReverbSettings* reverbSettings; - /* 0x10 */ u16 unk_10; - /* 0x12 */ u16 unk_12; + /* 0x10 */ u16 sampleDmaBufSize1; + /* 0x12 */ u16 sampleDmaBufSize2; /* 0x14 */ u16 unk_14; /* 0x18 */ u32 persistentSeqMem; - /* 0x1C */ u32 persistentBankMem; - /* 0x20 */ u32 persistentUnusedMem; + /* 0x1C */ u32 persistentFontMem; + /* 0x20 */ u32 persistentSampleMem; /* 0x24 */ u32 temporarySeqMem; - /* 0x28 */ u32 temporaryBankMem; - /* 0x2C */ u32 temporaryUnusedMem; - /* 0x30 */ s32 unk_30; - /* 0x34 */ s32 unk_34; + /* 0x28 */ u32 temporaryFontMem; + /* 0x2C */ u32 temporarySampleMem; + /* 0x30 */ s32 persistentSampleCacheMem; + /* 0x34 */ s32 temporarySampleCacheMem; } AudioSpec; // size = 0x38 typedef struct { @@ -588,52 +596,49 @@ typedef struct { /* 0x0 */ u8* start; /* 0x4 */ u8* cur; /* 0x8 */ s32 size; - /* 0xC */ s32 unused; // set to 0, never read -} SoundAllocPool; // size = 0x10 + /* 0xC */ s32 count; +} AudioAllocPool; // size = 0x10 typedef struct { /* 0x0 */ u8* ptr; /* 0x4 */ u32 size; - /* 0x8 */ s16 poolIndex; - /* 0xA */ s16 id; // seqId or bankId -} SeqOrBankEntry; // size = 0xC + /* 0x8 */ s16 tableType; + /* 0xA */ s16 id; +} AudioCacheEntry; // size = 0xC typedef struct { - /* 0x00 */ s8 unk_00; - /* 0x01 */ s8 unk_01; - /* 0x02 */ s8 unk_02; + /* 0x00 */ s8 inUse; + /* 0x01 */ s8 origMedium; + /* 0x02 */ s8 sampleBankId; /* 0x03 */ char unk_03[0x5]; - /* 0x08 */ u8* unk_08; - /* 0x0C */ void* unk_0C; + /* 0x08 */ u8* allocatedAddr; + /* 0x0C */ void* sampleAddr; /* 0x10 */ u32 size; -} UnkHeapEntry; // size = 0x14 +} SampleCacheEntry; // size = 0x14 typedef struct { - /* 0x000 */ SoundAllocPool pool; - /* 0x010 */ UnkHeapEntry entries[32]; + /* 0x000 */ AudioAllocPool pool; + /* 0x010 */ SampleCacheEntry entries[32]; /* 0x290 */ s32 size; -} UnkPool; // size = 0x294 +} AudioSampleCache; // size = 0x294 -typedef struct -{ +typedef struct { /* 0x00*/ u32 numEntries; - /* 0x04*/ SoundAllocPool pool; - /* 0x14*/ SeqOrBankEntry entries[16]; -} PersistentPool; // size = 0xD4 + /* 0x04*/ AudioAllocPool pool; + /* 0x14*/ AudioCacheEntry entries[16]; +} AudioPersistentCache; // size = 0xD4 -typedef struct -{ +typedef struct { /* 0x00*/ u32 nextSide; - /* 0x04*/ SoundAllocPool pool; - /* 0x14*/ SeqOrBankEntry entries[2]; -} TemporaryPool; // size = 0x3C + /* 0x04*/ AudioAllocPool pool; + /* 0x14*/ AudioCacheEntry entries[2]; +} AudioTemporaryCache; // size = 0x3C -typedef struct -{ - /* 0x000*/ PersistentPool persistent; - /* 0x0D4*/ TemporaryPool temporary; +typedef struct { + /* 0x000*/ AudioPersistentCache persistent; + /* 0x0D4*/ AudioTemporaryCache temporary; /* 0x100*/ u8 unk_100[0x10]; -} SoundMultiPool; // size = 0x110 +} AudioCache; // size = 0x110 typedef struct { u32 wantPersistent; @@ -642,40 +647,24 @@ typedef struct { typedef struct { u32 wantSeq; - u32 wantBank; - u32 wantUnused; + u32 wantFont; + u32 wantSample; } AudioPoolSplit3; // size = 0xC typedef struct { u32 wantSeq; - u32 wantBank; - u32 wantUnused; + u32 wantFont; + u32 wantSample; u32 wantCustom; } AudioPoolSplit4; // size = 0x10 -typedef struct { - u8* unk_0; - u8* unk_4; - u32 unk_8; - s8 unk_C; - s8 unk_D; - s16 unk_E; -} Struct_800E0E0C_2; - -typedef struct { - char unk_00[0x2]; - s16 unk_02; - char unk_04[0x8]; - Struct_800E0E0C_2 unk_C[1]; // unknown size -} ManyStruct_800E0E0C_2; - typedef struct { /* 0x00 */ u32 endAndMediumKey; - /* 0x04 */ AudioBankSample* sample; + /* 0x04 */ SoundFontSample* sample; /* 0x08 */ u8* ramAddr; /* 0x0C */ u32 encodedInfo; /* 0x10 */ s32 isFree; -} AudioStruct0D68; // size = 0x14 +} AudioPreloadReq; // size = 0x14 typedef struct { union{ @@ -698,111 +687,56 @@ typedef struct { }; } AudioCmd; -typedef struct { - union{ - struct { - s16 unk_00; - u16 unk_02; - }; - u32 unk_00w; - }; - u32 unk_04; - s8 unk_08; - char unk_09[0x7]; -} unk_dma_s; - -#define MK_ASYNC_MSG(b0,b1,b2,b3)(((b0) << 0x18) | ((b1) << 0x10) | ((b2) << 0x08) | ((b3) << 0x00)) -#define ASYNC_TBLTYPE(v)((u8)(v >> 0x10)) -#define ASYNC_B2(v)((u8)(v >> 0x08)) -#define ASYNC_B3(v)((u8)(v >> 0x00)) -#define AYSNC_B0(v)(((u8)(v >> 0x18)) - typedef struct { /* 0x00 */ s8 status; - /* 0x01 */ s8 unk_01; - /* 0x02 */ s8 unk_02; // type? - /* 0x03 */ char unk_03[0x1]; - /* 0x04 */ u32 unk_04; - /* 0x08 */ u32 devAddr; - /* 0x0C */ u8* ramAddr; + /* 0x01 */ s8 delay; + /* 0x02 */ s8 medium; + /* 0x04 */ u8* ramAddr; + /* 0x08 */ u32 curDevAddr; + /* 0x0C */ u8* curRamAddr; /* 0x10 */ u32 bytesRemaining; /* 0x14 */ u32 chunkSize; - /* 0x18 */ s32 unk_18; + /* 0x18 */ s32 unkMediumParam; /* 0x1C */ u32 retMsg; /* 0x20 */ OSMesgQueue* retQueue; /* 0x24 */ OSMesgQueue msgQueue; /* 0x3C */ OSMesg msg; /* 0x40 */ OSIoMesg ioMesg; -} AsyncLoadReq; // size = 0x58 +} AudioAsyncLoad; // size = 0x58 typedef struct { - /* 0x00 */ u8 unk_00; - /* 0x01 */ u8 unk_01; - /* 0x02 */ u16 unk_02; - /* 0x04 */ s32 unk_04; - /* 0x08 */ s32 devAddr; - /* 0x0C */ u8* ramAddr; - /* 0x10 */ u8* unk_10; + /* 0x00 */ u8 medium; + /* 0x01 */ u8 seqOrFontId; + /* 0x02 */ u16 instId; + /* 0x04 */ s32 unkMediumParam; + /* 0x08 */ s32 curDevAddr; + /* 0x0C */ u8* curRamAddr; + /* 0x10 */ u8* ramAddr; /* 0x14 */ s32 status; - /* 0x18 */ s32 size; + /* 0x18 */ s32 bytesRemaining; /* 0x1C */ s8* isDone; - /* 0x20 */ AudioBankSample sample; + /* 0x20 */ SoundFontSample sample; /* 0x30 */ OSMesgQueue msgqueue; /* 0x48 */ OSMesg msg; /* 0x4C */ OSIoMesg ioMesg; -} AudioSyncLoad; // size = 0x64 - -typedef struct { - u16 offsets[18]; - char data[1]; -} unk_283C; - -typedef struct { - /* 0x00 */ s16 entryCnt; - /* 0x02 */ s16 unk_02; - /* 0x04 */ u32 romAddr; - /* 0x08 */ char pad[0x8]; -} AudioTableHeader; // size = 0x10 +} AudioSlowLoad; // size = 0x64 typedef struct { /* 0x00 */ u32 romAddr; /* 0x04 */ u32 size; - /* 0x08 */ s8 unk_08; - /* 0x09 */ s8 type; - /* 0x0A */ char pad[6]; -} SequenceTableEntry; // size = 0x10 - -typedef struct { - /* 0x00 */ u32 romAddr; - /* 0x04 */ u32 size; - /* 0x08 */ u8 unk_08; - /* 0x09 */ u8 unk_09; - /* 0x0A */ s16 unk_0A; - /* 0x0C */ s16 unk_0C; - /* 0x0E */ s16 unk_0E; -} AudioBankTableEntry; // size = 0x10 - -typedef struct { - /* 0x00 */ u32 romAddr; - /* 0x04 */ u32 size; - /* 0x08 */ s8 unk_08; - /* 0x09 */ s8 unk_09; - /* 0x0A */ char pad[6]; + /* 0x08 */ s8 medium; + /* 0x09 */ s8 cachePolicy; + /* 0x0A */ s16 shortData1; + /* 0x0C */ s16 shortData2; + /* 0x0E */ s16 shortData3; } AudioTableEntry; // size = 0x10 typedef struct { - /* 0x00 */ AudioTableHeader header; - /* 0x10 */ SequenceTableEntry entries[1]; -} SequenceTable; // size >= 0x20 - -typedef struct { - /* 0x00 */ AudioTableHeader header; - /* 0x10 */ AudioBankTableEntry entries[1]; -} AudioBankTable; // size >= 0x20 - -typedef struct { - /* 0x00 */ AudioTableHeader header; - /* 0x10 */ AudioTableEntry entries[1]; + /* 0x00 */ s16 numEntries; + /* 0x02 */ s16 unkMediumParam; + /* 0x04 */ u32 romAddr; + /* 0x08 */ char pad[0x8]; + /* 0x10 */ AudioTableEntry entries[1]; // (dynamic size) } AudioTable; // size >= 0x20 typedef struct { @@ -820,22 +754,7 @@ typedef struct { /* 0x0C */ u8 unused; /* 0x0D */ u8 reuseIndex; // position in sSampleDmaReuseQueue1/2, if ttl == 0 /* 0x0E */ u8 ttl; // duration after which the DMA can be discarded -} SampleDmaReq; // size = 0x10 - -typedef struct { - /* 0x00 */ s32 index1; - /* 0x04 */ s32 index2; - /* 0x08 */ s32 baseAddr1; - /* 0x0C */ s32 baseAddr2; - /* 0x10 */ u32 medium1; - /* 0x14 */ u32 medium2; -} RelocInfo; // size = 0x18 - -typedef enum { - /* 0 */ SEQUENCE_TABLE, - /* 1 */ BANK_TABLE, - /* 2 */ AUDIO_TABLE -} AudioTableType; +} SampleDma; // size = 0x10 typedef struct { /* 0x0000 */ char unk_0000; @@ -847,56 +766,52 @@ typedef struct { /* 0x0014 */ NoteSubEu* noteSubsEu; /* 0x0018 */ SynthesisReverb synthesisReverbs[4]; /* 0x0B38 */ char unk_0B38[0x30]; - /* 0x0B68 */ AudioBankSample* unk_0B68[128]; - /* 0x0D68 */ AudioStruct0D68 unk_0D68[128]; - /* 0x1768 */ s32 unk_1768; - /* 0x176C */ s32 unk_176C; - /* 0x1770 */ AsyncLoadReq asyncReqs[0x10]; - /* 0x1CF0 */ OSMesgQueue asyncLoadQueue; + /* 0x0B68 */ SoundFontSample* usedSamples[128]; + /* 0x0D68 */ AudioPreloadReq preloadSampleStack[128]; + /* 0x1768 */ s32 numUsedSamples; + /* 0x176C */ s32 preloadSampleStackTop; + /* 0x1770 */ AudioAsyncLoad asyncLoads[0x10]; + /* 0x1CF0 */ OSMesgQueue asyncLoadUnkMediumQueue; /* 0x1D08 */ char unk_1D08[0x40]; - /* 0x1D48 */ AsyncLoadReq* curAsyncReq; - /* 0x1D4C */ u32 syncLoadPos; - /* 0x1D50 */ AudioSyncLoad syncLoads[2]; + /* 0x1D48 */ AudioAsyncLoad* curUnkMediumLoad; + /* 0x1D4C */ u32 slowLoadPos; + /* 0x1D50 */ AudioSlowLoad slowLoads[2]; /* 0x1E18 */ OSPiHandle* cartHandle; - /* probably an unused PI handle for n64 disk drive */ - /* 0x1E1C */ OSPiHandle* unk_1E1C; - /* 0x1E20 */ OSMesgQueue unk_1E20; - /* 0x1E38 */ OSMesg unk_1E38[0x10]; - /* 0x1E78 */ OSMesgQueue unk_1E78; - /* 0x1E90 */ OSMesg unk_1E90[0x10]; + /* 0x1E1C */ OSPiHandle* driveHandle; + /* 0x1E20 */ OSMesgQueue externalLoadQueue; + /* 0x1E38 */ OSMesg externalLoadMesgBuf[0x10]; + /* 0x1E78 */ OSMesgQueue preloadSampleQueue; + /* 0x1E90 */ OSMesg preloadSampleMesgBuf[0x10]; /* 0x1ED0 */ OSMesgQueue currAudioFrameDmaQueue; - /* 0x1EE8 */ OSMesg currAudioFrameDmaMesgBufs[0x40]; - /* 0x1FE8 */ OSIoMesg currAudioFrameDmaIoMesgBufs[0x40]; - /* 0x25E8 */ OSMesgQueue unk_25E8; - /* 0x2600 */ OSMesg unk_2600; - /* 0x2604 */ OSIoMesg unk_2604; - /* 0x261C */ SampleDmaReq* sampleDmaReqs; - /* 0x2620 */ u32 sampleDmaReqCnt; + /* 0x1EE8 */ OSMesg currAudioFrameDmaMesgBuf[0x40]; + /* 0x1FE8 */ OSIoMesg currAudioFrameDmaIoMesgBuf[0x40]; + /* 0x25E8 */ OSMesgQueue syncDmaQueue; + /* 0x2600 */ OSMesg syncDmaMesg; + /* 0x2604 */ OSIoMesg syncDmaIoMesg; + /* 0x261C */ SampleDma* sampleDmas; + /* 0x2620 */ u32 sampleDmaCount; /* 0x2624 */ u32 sampleDmaListSize1; - /* 0x2628 */ s32 unk_2628; + /* 0x2628 */ s32 unused2628; /* 0x262C */ u8 sampleDmaReuseQueue1[0x100]; // read pos <= write pos, wrapping mod 256 /* 0x272C */ u8 sampleDmaReuseQueue2[0x100]; /* 0x282C */ u8 sampleDmaReuseQueue1RdPos; /* 0x282D */ u8 sampleDmaReuseQueue2RdPos; /* 0x282E */ u8 sampleDmaReuseQueue1WrPos; /* 0x282F */ u8 sampleDmaReuseQueue2WrPos; - /* 0x2830 */ SequenceTable* sequenceTable; - /* 0x2834 */ AudioBankTable* audioBankTable; - /* 0x2838 */ AudioTable* audioTable; - union { - /* 0x283C */ u16* unk_283C; - /* 0x283C */ u8* unk_283Cb; - }; - /* 0x2840 */ u16 seqTabEntCnt; // channels used? - /* 0x2844 */ CtlEntry* ctlEntries; + /* 0x2830 */ AudioTable* sequenceTable; + /* 0x2834 */ AudioTable* soundFontTable; + /* 0x2838 */ AudioTable* sampleBankTable; + /* 0x283C */ u8* sequenceFontTable; + /* 0x2840 */ u16 numSequences; + /* 0x2844 */ SoundFont* soundFonts; /* 0x2848 */ AudioBufferParameters audioBufferParameters; /* 0x2870 */ f32 unk_2870; - /* 0x2874 */ s32 unk_2874; - /* 0x2874 */ s32 unk_2878; + /* 0x2874 */ s32 sampleDmaBufSize1; + /* 0x2874 */ s32 sampleDmaBufSize2; /* 0x287C */ char unk_287C[0x10]; - /* 0x288C */ s32 unk_288C; + /* 0x288C */ s32 sampleDmaBufSize; /* 0x2890 */ s32 maxAudioCmds; - /* 0x2894 */ s32 maxSimultaneousNotes; // (bad name) + /* 0x2894 */ s32 numNotes; /* 0x2898 */ s16 tempoInternalToExternal; /* 0x289A */ s8 soundMode; /* 0x289C */ s32 totalTaskCnt; @@ -916,27 +831,27 @@ typedef struct { /* 0x2980 */ s32 audioErrorFlags; /* 0x2984 */ volatile u32 resetTimer; /* 0x2988 */ char unk_2988[0x8]; - /* 0x2990 */ SoundAllocPool audioSessionPool; - /* 0x29A0 */ SoundAllocPool unkPool; - /* 0x29B0 */ SoundAllocPool audioInitPool; - /* 0x29C0 */ SoundAllocPool notesAndBuffersPool; + /* 0x2990 */ AudioAllocPool audioSessionPool; + /* 0x29A0 */ AudioAllocPool externalPool; + /* 0x29B0 */ AudioAllocPool audioInitPool; + /* 0x29C0 */ AudioAllocPool notesAndBuffersPool; /* 0x29D0 */ char unk_29D0[0x20]; // probably two unused pools - /* 0x29F0 */ SoundAllocPool seqAndBankPool; - /* 0x2A00 */ SoundAllocPool persistentCommonPool; - /* 0x2A10 */ SoundAllocPool temporaryCommonPool; - /* 0x2A20 */ SoundMultiPool seqLoadedPool; - /* 0x2B30 */ SoundMultiPool bankLoadedPool; - /* 0x2C40 */ SoundMultiPool unusedLoadedPool; // rename after we figure out what this is - /* 0x2D50 */ SoundAllocPool unk_2D50; - /* 0x2D60 */ SeqOrBankEntry unk_2D60[32]; - /* 0x2EE0 */ UnkPool unk_2EE0; - /* 0x3174 */ UnkPool unk_3174; + /* 0x29F0 */ AudioAllocPool cachePool; + /* 0x2A00 */ AudioAllocPool persistentCommonPool; + /* 0x2A10 */ AudioAllocPool temporaryCommonPool; + /* 0x2A20 */ AudioCache seqCache; + /* 0x2B30 */ AudioCache fontCache; + /* 0x2C40 */ AudioCache sampleBankCache; + /* 0x2D50 */ AudioAllocPool permanentPool; + /* 0x2D60 */ AudioCacheEntry permanentCache[32]; + /* 0x2EE0 */ AudioSampleCache persistentSampleCache; + /* 0x3174 */ AudioSampleCache temporarySampleCache; /* 0x3408 */ AudioPoolSplit4 sessionPoolSplit; - /* 0x3418 */ AudioPoolSplit2 seqAndBankPoolSplit; + /* 0x3418 */ AudioPoolSplit2 cachePoolSplit; /* 0x3420 */ AudioPoolSplit3 persistentCommonPoolSplit; /* 0x342C */ AudioPoolSplit3 temporaryCommonPoolSplit; - /* 0x3438 */ u8 audioTableLoadStatus[0x30]; - /* 0x3468 */ u8 bankLoadStatus[0x30]; + /* 0x3438 */ u8 sampleFontLoadStatus[0x30]; + /* 0x3468 */ u8 fontLoadStatus[0x30]; /* 0x3498 */ u8 seqLoadStatus[0x80]; /* 0x3518 */ volatile u8 resetStatus; /* 0x3519 */ u8 audioResetSpecIdToLoad; @@ -946,7 +861,7 @@ typedef struct { /* 0x3528 */ u32 audioHeapSize; /* 0x352C */ Note* notes; /* 0x3530 */ SequencePlayer seqPlayers[4]; - /* 0x3AB0 */ SequenceChannelLayer sequenceLayers[64]; + /* 0x3AB0 */ SequenceLayer sequenceLayers[64]; /* 0x5AB0 */ SequenceChannel sequenceChannelNone; /* 0x5B84 */ s32 noteSubEuOffset; /* 0x5B88 */ AudioListItem layerFreeList; @@ -954,7 +869,6 @@ typedef struct { /* 0x5BD8 */ u8 cmdWrPos; /* 0x5BD9 */ u8 cmdRdPos; /* 0x5BDA */ u8 cmdQueueFinished; - /* 0x5BDB */ char unk_5BDB[0x1]; /* 0x5BDC */ u16 unk_5BDC[4]; /* 0x5BE4 */ OSMesgQueue* audioResetQueueP; /* 0x5BE8 */ OSMesgQueue* taskStartQueueP; @@ -982,9 +896,9 @@ typedef struct { } NoteSubAttributes; // size = 0x18 typedef struct { - /* 0x00 */ u32 heap; - /* 0x04 */ u32 mainPool; - /* 0x08 */ u32 initPool; + /* 0x00 */ u32 heapSize; + /* 0x04 */ u32 initPoolSize; + /* 0x08 */ u32 permanentPoolSize; } AudioContextInitSizes; // size = 0xC typedef struct { @@ -1012,22 +926,18 @@ typedef struct { /* 0x020 */ f32 unk_20; /* 0x024 */ f32 unk_24; /* 0x028 */ u16 unk_28; - /* 0x02A */ char unk_2A[0x2]; /* 0x02C */ u32 unk_2C[8]; /* 0x04C */ u8 unk_4C; /* 0x04D */ u8 unk_4D; /* 0x04E */ u8 unk_4E; - /* 0x04F */ char unk_4F; /* 0x050 */ unk_50_s unk_50[0x10]; /* 0x250 */ u16 unk_250; /* 0x252 */ u16 unk_252; /* 0x254 */ u16 unk_254; /* 0x256 */ u16 unk_256; /* 0x258 */ u16 unk_258; - /* 0x25A */ char unk_25A[0x2]; /* 0x25C */ u32 unk_25C; /* 0x260 */ u8 unk_260; - /* 0x261 */ char unk_261[0x3]; } unk_D_8016E750; // size = 0x264 typedef enum { @@ -1040,24 +950,33 @@ typedef enum { /* 6 */ BANK_VOICE } SoundBankTypes; +typedef enum { + /* 0 */ SFX_STATE_EMPTY, + /* 1 */ SFX_STATE_QUEUED, + /* 2 */ SFX_STATE_READY, + /* 3 */ SFX_STATE_PLAYING_REFRESH, + /* 4 */ SFX_STATE_PLAYING_1, + /* 5 */ SFX_STATE_PLAYING_2 +} SfxState; + typedef struct { /* 0x00 */ f32* posX; /* 0x04 */ f32* posY; /* 0x08 */ f32* posZ; - /* 0x0C */ u8 unk_C; + /* 0x0C */ u8 token; /* 0x10 */ f32* freqScale; - /* 0x14 */ f32* unk_14; + /* 0x14 */ f32* vol; /* 0x18 */ s8* reverbAdd; /* 0x1C */ f32 dist; /* 0x20 */ u32 priority; // lower is more prioritized /* 0x24 */ u8 sfxImportance; /* 0x26 */ u16 sfxParams; /* 0x28 */ u16 sfxId; - /* 0x2A */ u8 unk_2A; - /* 0x2B */ u8 unk_2B; + /* 0x2A */ u8 state; // uses SfxState enum + /* 0x2B */ u8 freshness; /* 0x2C */ u8 prev; /* 0x2D */ u8 next; - /* 0x2E */ u8 unk_2E; + /* 0x2E */ u8 channelIdx; /* 0x2F */ u8 unk_2F; } SoundBankEntry; // size = 0x30 @@ -1084,8 +1003,8 @@ typedef struct { typedef struct { u32 priority; // lower is more prioritized - u8 unk_4; -} Struct_800F7CEC; + u8 entryIndex; +} ActiveSound; typedef struct { u8 importance; diff --git a/spec b/spec index dcb5e7dc77..3ef32a93b8 100644 --- a/spec +++ b/spec @@ -418,7 +418,7 @@ beginseg include "build/data/code_800F7260.bss.o" include "build/src/code/code_800F9280.o" include "build/data/code_800F9280.data.o" - include "build/src/code/audio_rodata.o" + include "build/src/code/audio_init_params.o" include "build/src/code/logseverity.o" include "build/src/code/gfxprint.o" include "build/src/code/code_800FBCE0.o" diff --git a/src/boot/yaz0.c b/src/boot/yaz0.c index dd4458d2ec..0da6aa362b 100644 --- a/src/boot/yaz0.c +++ b/src/boot/yaz0.c @@ -17,7 +17,7 @@ void* Yaz0_FirstDMA(void) { curSize = sYaz0CurDataEnd - (u32)sYaz0DataBuffer; dmaSize = (curSize > sYaz0CurSize) ? sYaz0CurSize : curSize; - DmaMgr_DMARomToRam(sYaz0CurRomStart, sYaz0DataBuffer, dmaSize); + DmaMgr_DmaRomToRam(sYaz0CurRomStart, sYaz0DataBuffer, dmaSize); sYaz0CurRomStart += dmaSize; sYaz0CurSize -= dmaSize; return sYaz0DataBuffer; @@ -38,7 +38,7 @@ void* Yaz0_NextDMA(void* curSrcPos) { } if (dmaSize != 0) { - DmaMgr_DMARomToRam(sYaz0CurRomStart, (u32)dst + restSize, dmaSize); + DmaMgr_DmaRomToRam(sYaz0CurRomStart, (u32)dst + restSize, dmaSize); sYaz0CurRomStart += dmaSize; sYaz0CurSize -= dmaSize; if (!sYaz0CurSize) { diff --git a/src/boot/z_std_dma.c b/src/boot/z_std_dma.c index 6a648ed5ce..37b8968963 100644 --- a/src/boot/z_std_dma.c +++ b/src/boot/z_std_dma.c @@ -1569,7 +1569,7 @@ s32 DmaMgr_CompareName(const char* name1, const char* name2) { return 0; } -s32 DmaMgr_DMARomToRam(u32 rom, u32 ram, u32 size) { +s32 DmaMgr_DmaRomToRam(u32 rom, u32 ram, u32 size) { OSIoMesg ioMsg; OSMesgQueue queue; OSMesg msg; @@ -1601,14 +1601,14 @@ s32 DmaMgr_DMARomToRam(u32 rom, u32 ram, u32 size) { ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ); if (ret) { - goto DmaMgr_DMARomToRam_end; + goto end; } if (D_80009460 == 10) { osSyncPrintf("%10lld ノーマルDMA START (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount); } - osRecvMesg(&queue, NULL, 1); + osRecvMesg(&queue, NULL, OS_MESG_BLOCK); if (D_80009460 == 10) { osSyncPrintf("%10lld ノーマルDMA END (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount); } @@ -1633,22 +1633,22 @@ s32 DmaMgr_DMARomToRam(u32 rom, u32 ram, u32 size) { ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ); if (ret) { - goto DmaMgr_DMARomToRam_end; + goto end; } - osRecvMesg(&queue, NULL, 1); + osRecvMesg(&queue, NULL, OS_MESG_BLOCK); if (D_80009460 == 10) { osSyncPrintf("%10lld ノーマルDMA END (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount); } -DmaMgr_DMARomToRam_end: +end: osInvalICache((void*)ram, size); osInvalDCache((void*)ram, size); return ret; } -s32 DmaMgr_DmaCallback0(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { +s32 DmaMgr_DmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { s32 ret; ASSERT(pihandle == gCartHandle, "pihandle == carthandle", "../z_std_dma.c", 530); @@ -1667,7 +1667,7 @@ s32 DmaMgr_DmaCallback0(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { return ret; } -void DmaMgr_DmaCallback1(u32 ram, u32 rom, u32 size) { +void DmaMgr_DmaFromDriveRom(u32 ram, u32 rom, u32 size) { OSPiHandle* handle = osDriveRomInit(); OSMesgQueue queue; OSMesg msg; @@ -1684,7 +1684,7 @@ void DmaMgr_DmaCallback1(u32 ram, u32 rom, u32 size) { ioMsg.size = size; handle->transferInfo.cmdType = 2; - osEPiStartDma(handle, &ioMsg, 0); + osEPiStartDma(handle, &ioMsg, OS_READ); osRecvMesg(&queue, NULL, OS_MESG_BLOCK); return; } @@ -1783,7 +1783,7 @@ void DmaMgr_ProcessMsg(DmaRequest* req) { "セグメント境界をまたがってDMA転送することはできません"); } - DmaMgr_DMARomToRam(iter->romStart + (vrom - iter->vromStart), (u32)ram, size); + DmaMgr_DmaRomToRam(iter->romStart + (vrom - iter->vromStart), (u32)ram, size); found = true; if (0) { @@ -1823,7 +1823,7 @@ void DmaMgr_ProcessMsg(DmaRequest* req) { return; } - DmaMgr_DMARomToRam(vrom, (u32)ram, size); + DmaMgr_DmaRomToRam(vrom, (u32)ram, size); if (0) { osSyncPrintf("No Press ROM:%08X RAM:%08X SIZE:%08X (非公式)\n", vrom, ram, size); @@ -1837,7 +1837,7 @@ void DmaMgr_ThreadEntry(void* arg0) { osSyncPrintf("DMAマネージャスレッド実行開始\n"); while (true) { - osRecvMesg(&sDmaMgrMsgQueue, &msg, 1); + osRecvMesg(&sDmaMgrMsgQueue, &msg, OS_MESG_BLOCK); req = (DmaRequest*)msg; if (req == NULL) { break; @@ -1861,8 +1861,8 @@ void DmaMgr_ThreadEntry(void* arg0) { s32 DmaMgr_SendRequestImpl(DmaRequest* req, u32 ram, u32 vrom, u32 size, u32 unk, OSMesgQueue* queue, OSMesg msg) { static s32 sDmaMgrQueueFullLogged = 0; - if ((1 && (ram == 0)) || (osMemSize < ram + size + 0x80000000) || (vrom & 1) || (vrom > 0x4000000) || - (size == 0) || (size & 1)) { + if ((1 && (ram == 0)) || (osMemSize < ram + size + 0x80000000) || (vrom & 1) || (vrom > 0x4000000) || (size == 0) || + (size & 1)) { DmaMgr_Error(req, NULL, "ILLIGAL DMA-FUNCTION CALL", "パラメータ異常です"); } @@ -1910,7 +1910,7 @@ void DmaMgr_Init(void) { s32 idx; DmaEntry* iter; - DmaMgr_DMARomToRam((u32)_dmadataSegmentRomStart, (u32)_dmadataSegmentStart, + DmaMgr_DmaRomToRam((u32)_dmadataSegmentRomStart, (u32)_dmadataSegmentStart, (u32)(_dmadataSegmentRomEnd - _dmadataSegmentRomStart)); osSyncPrintf("dma_rom_ad[]\n"); @@ -1972,6 +1972,6 @@ s32 DmaMgr_SendRequest1(void* ram0, u32 vrom, u32 size, const char* file, s32 li return ret; } - osRecvMesg(&queue, NULL, 1); + osRecvMesg(&queue, NULL, OS_MESG_BLOCK); return 0; } diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c index 202e9c57f3..a4775861e2 100644 --- a/src/code/audioMgr.c +++ b/src/code/audioMgr.c @@ -55,9 +55,9 @@ void AudioMgr_ThreadEntry(void* arg0) { s16* msg = NULL; osSyncPrintf("オーディオマネージャスレッド実行開始\n"); // "Start running audio manager thread" - func_800F70F8(); - func_800E301C(DmaMgr_DmaCallback0); - func_800F711C(); + Audio_Init(); + AudioLoad_SetDmaHandler(DmaMgr_DmaHandler); + Audio_InitSound(); osSendMesg(&audioMgr->unk_C8, NULL, OS_MESG_BLOCK); IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, &audioMgr->unk_74); diff --git a/src/code/audio_effects.c b/src/code/audio_effects.c index afe2bee38b..091a377808 100644 --- a/src/code/audio_effects.c +++ b/src/code/audio_effects.c @@ -1,51 +1,51 @@ #include "ultra64.h" #include "global.h" -void Audio_SequenceChannelProcessSound(SequenceChannel* seqChannel, s32 recalculateVolume, s32 b) { +void Audio_SequenceChannelProcessSound(SequenceChannel* channel, s32 recalculateVolume, s32 b) { f32 channelVolume; f32 chanFreqScale; s32 i; - if (seqChannel->changes.s.volume || recalculateVolume) { - channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->appliedFadeVolume; - if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & 0x20)) { - channelVolume = seqChannel->seqPlayer->muteVolumeScale * channelVolume; + if (channel->changes.s.volume || recalculateVolume) { + channelVolume = channel->volume * channel->volumeScale * channel->seqPlayer->appliedFadeVolume; + if (channel->seqPlayer->muted && (channel->muteBehavior & 0x20)) { + channelVolume = channel->seqPlayer->muteVolumeScale * channelVolume; } - seqChannel->appliedVolume = channelVolume * channelVolume; + channel->appliedVolume = channelVolume * channelVolume; } - if (seqChannel->changes.s.pan) { - seqChannel->pan = seqChannel->newPan * seqChannel->panChannelWeight; + if (channel->changes.s.pan) { + channel->pan = channel->newPan * channel->panChannelWeight; } - chanFreqScale = seqChannel->freqScale; + chanFreqScale = channel->freqScale; if (b != 0) { - chanFreqScale *= seqChannel->seqPlayer->unk_34; - seqChannel->changes.s.freqScale = true; + chanFreqScale *= channel->seqPlayer->unk_34; + channel->changes.s.freqScale = true; } for (i = 0; i < 4; i++) { - SequenceChannelLayer* layer = seqChannel->layers[i]; + SequenceLayer* layer = channel->layers[i]; if (layer != NULL && layer->enabled && layer->note != NULL) { if (layer->notePropertiesNeedInit) { layer->noteFreqScale = layer->freqScale * chanFreqScale; - layer->noteVelocity = layer->velocitySquare2 * seqChannel->appliedVolume; - layer->notePan = (seqChannel->pan + layer->pan * (0x80 - seqChannel->panChannelWeight)) >> 7; + layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume; + layer->notePan = (channel->pan + layer->pan * (0x80 - channel->panChannelWeight)) >> 7; layer->notePropertiesNeedInit = false; } else { - if (seqChannel->changes.s.freqScale) { + if (channel->changes.s.freqScale) { layer->noteFreqScale = layer->freqScale * chanFreqScale; } - if (seqChannel->changes.s.volume || recalculateVolume) { - layer->noteVelocity = layer->velocitySquare2 * seqChannel->appliedVolume; + if (channel->changes.s.volume || recalculateVolume) { + layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume; } - if (seqChannel->changes.s.pan) { - layer->notePan = (seqChannel->pan + layer->pan * (0x80 - seqChannel->panChannelWeight)) >> 7; + if (channel->changes.s.pan) { + layer->notePan = (channel->pan + layer->pan * (0x80 - channel->panChannelWeight)) >> 7; } } } } - seqChannel->changes.asByte = 0; + channel->changes.asByte = 0; } void Audio_SequencePlayerProcessSound(SequencePlayer* seqPlayer) { @@ -63,7 +63,7 @@ void Audio_SequencePlayerProcessSound(SequencePlayer* seqPlayer) { } if (--seqPlayer->fadeTimer == 0 && seqPlayer->state == 2) { - Audio_SequencePlayerDisable(seqPlayer); + AudioSeq_SequencePlayerDisable(seqPlayer); return; } } @@ -112,14 +112,16 @@ f32 Audio_GetVibratoFreqScale(VibratoState* vib) { f32 temp; f32 twoToThe16th = 65536.0f; s32 one = 1; - SequenceChannel* channel = vib->seqChannel; + SequenceChannel* channel = vib->channel; if (vib->delay != 0) { vib->delay--; return 1; } - if (channel != NO_CHANNEL) { + //! @bug this probably meant to compare with gAudioContext.sequenceChannelNone. + //! -1 isn't used as a channel pointer anywhere else. + if (channel != ((SequenceChannel*)(-1))) { if (vib->extentChangeTimer) { if (vib->extentChangeTimer == 1) { vib->extent = (s32)channel->vibratoExtentTarget; @@ -179,7 +181,7 @@ void Audio_NoteVibratoUpdate(Note* note) { void Audio_NoteVibratoInit(Note* note) { VibratoState* vib; - SequenceChannel* seqChannel; + SequenceChannel* channel; note->playbackState.vibratoFreqScale = 1.0f; @@ -189,20 +191,20 @@ void Audio_NoteVibratoInit(Note* note) { vib->time = 0; vib->curve = gWaveSamples[2]; - vib->seqChannel = note->playbackState.parentLayer->seqChannel; - seqChannel = vib->seqChannel; - if ((vib->extentChangeTimer = seqChannel->vibratoExtentChangeDelay) == 0) { - vib->extent = (s32)seqChannel->vibratoExtentTarget; + vib->channel = note->playbackState.parentLayer->channel; + channel = vib->channel; + if ((vib->extentChangeTimer = channel->vibratoExtentChangeDelay) == 0) { + vib->extent = (s32)channel->vibratoExtentTarget; } else { - vib->extent = (s32)seqChannel->vibratoExtentStart; + vib->extent = (s32)channel->vibratoExtentStart; } - if ((vib->rateChangeTimer = seqChannel->vibratoRateChangeDelay) == 0) { - vib->rate = (s32)seqChannel->vibratoRateTarget; + if ((vib->rateChangeTimer = channel->vibratoRateChangeDelay) == 0) { + vib->rate = (s32)channel->vibratoRateTarget; } else { - vib->rate = (s32)seqChannel->vibratoRateStart; + vib->rate = (s32)channel->vibratoRateStart; } - vib->delay = seqChannel->vibratoDelay; + vib->delay = channel->vibratoDelay; } void Audio_NotePortamentoInit(Note* note) { diff --git a/src/code/audio_heap.c b/src/code/audio_heap.c index 1d264a1e77..1ed73c81bf 100644 --- a/src/code/audio_heap.c +++ b/src/code/audio_heap.c @@ -1,6 +1,15 @@ #include "ultra64.h" #include "global.h" +void AudioHeap_InitSampleCaches(u32 persistentSize, u32 temporarySize); +SampleCacheEntry* AudioHeap_AllocTemporarySampleCacheEntry(u32 size); +SampleCacheEntry* AudioHeap_AllocPersistentSampleCacheEntry(u32 size); +void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry); +void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample); +void AudioHeap_DiscardSampleCaches(void); +void AudioHeap_DiscardSampleBank(s32 sampleBankId); +void AudioHeap_DiscardSampleBanks(void); + f32 func_800DDE20(f32 arg0) { return 256.0f * gAudioContext.audioBufferParameters.unkUpdatesPerFrameScaled / arg0; } @@ -29,18 +38,18 @@ void func_800DDE3C(void) { gAudioContext.unk_3520[0] = 0.0f; } -void Audio_ResetLoadStatus(void) { +void AudioHeap_ResetLoadStatus(void) { s32 i; for (i = 0; i < 0x30; i++) { - if (gAudioContext.bankLoadStatus[i] != 5) { - gAudioContext.bankLoadStatus[i] = 0; + if (gAudioContext.fontLoadStatus[i] != 5) { + gAudioContext.fontLoadStatus[i] = 0; } } for (i = 0; i < 0x30; i++) { - if (gAudioContext.audioTableLoadStatus[i] != 5) { - gAudioContext.audioTableLoadStatus[i] = 0; + if (gAudioContext.sampleFontLoadStatus[i] != 5) { + gAudioContext.sampleFontLoadStatus[i] = 0; } } @@ -51,32 +60,32 @@ void Audio_ResetLoadStatus(void) { } } -void Audio_DiscardBank(s32 bankId) { +void AudioHeap_DiscardFont(s32 fontId) { s32 i; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { Note* note = &gAudioContext.notes[i]; - if (note->playbackState.bankId == bankId) { + if (note->playbackState.fontId == fontId) { if (note->playbackState.unk_04 == 0 && note->playbackState.priority != 0) { note->playbackState.parentLayer->enabled = false; note->playbackState.parentLayer->finished = true; } Audio_NoteDisable(note); Audio_AudioListRemove(¬e->listItem); - Audio_AudioListPushBack(&gAudioContext.noteFreeLists.disabled, ¬e->listItem); + AudioSeq_AudioListPushBack(&gAudioContext.noteFreeLists.disabled, ¬e->listItem); } } } -void func_800DE12C(s32 bankId) { +void AudioHeap_ReleaseNotesForFont(s32 fontId) { s32 i; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { Note* note = &gAudioContext.notes[i]; NotePlaybackState* state = ¬e->playbackState; - if (state->bankId == bankId) { + if (state->fontId == fontId) { if (state->priority != 0 && state->adsr.action.s.state == ADSR_STATE_DECAY) { state->priority = 1; state->adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv; @@ -86,66 +95,66 @@ void func_800DE12C(s32 bankId) { } } -void Audio_DiscardSequence(s32 seqId) { +void AudioHeap_DiscardSequence(s32 seqId) { s32 i; for (i = 0; i < gAudioContext.audioBufferParameters.numSequencePlayers; i++) { if (gAudioContext.seqPlayers[i].enabled && gAudioContext.seqPlayers[i].seqId == seqId) { - Audio_SequencePlayerDisable(&gAudioContext.seqPlayers[i]); + AudioSeq_SequencePlayerDisable(&gAudioContext.seqPlayers[i]); } } } -void func_800DE238(void* mem, u32 size) { +void AudioHeap_WritebackDCache(void* mem, u32 size) { Audio_osWritebackDCache(mem, size); } -void* func_800DE258(SoundAllocPool* pool, u32 size) { +void* AudioHeap_AllocZeroedAttemptExternal(AudioAllocPool* pool, u32 size) { void* ret = NULL; - if (gAudioContext.unkPool.start != 0) { - ret = Audio_AllocZeroed(&gAudioContext.unkPool, size); + if (gAudioContext.externalPool.start != 0) { + ret = AudioHeap_AllocZeroed(&gAudioContext.externalPool, size); } if (ret == NULL) { - ret = Audio_AllocZeroed(pool, size); + ret = AudioHeap_AllocZeroed(pool, size); } return ret; } -void* func_800DE2B0(SoundAllocPool* pool, u32 size) { +void* AudioHeap_AllocAttemptExternal(AudioAllocPool* pool, u32 size) { void* ret = NULL; - if (gAudioContext.unkPool.start != NULL) { - ret = Audio_Alloc(&gAudioContext.unkPool, size); + if (gAudioContext.externalPool.start != NULL) { + ret = AudioHeap_Alloc(&gAudioContext.externalPool, size); } if (ret == NULL) { - ret = Audio_Alloc(pool, size); + ret = AudioHeap_Alloc(pool, size); } return ret; } -void* Audio_AllocDmaMemory(SoundAllocPool* pool, u32 size) { +void* AudioHeap_AllocDmaMemory(AudioAllocPool* pool, u32 size) { void* ret; - ret = Audio_Alloc(pool, size); + ret = AudioHeap_Alloc(pool, size); if (ret != NULL) { - func_800DE238(ret, size); + AudioHeap_WritebackDCache(ret, size); } return ret; } -void* Audio_AllocDmaMemoryZeroed(SoundAllocPool* pool, u32 size) { +void* AudioHeap_AllocDmaMemoryZeroed(AudioAllocPool* pool, u32 size) { void* ret; - ret = Audio_AllocZeroed(pool, size); + ret = AudioHeap_AllocZeroed(pool, size); if (ret != NULL) { - func_800DE238(ret, size); + AudioHeap_WritebackDCache(ret, size); } return ret; } -void* Audio_AllocZeroed(SoundAllocPool* pool, u32 size) { - u8* ret = Audio_Alloc(pool, size); +void* AudioHeap_AllocZeroed(AudioAllocPool* pool, u32 size) { + u8* ret = AudioHeap_Alloc(pool, size); u8* ptr; if (ret != NULL) { @@ -157,7 +166,7 @@ void* Audio_AllocZeroed(SoundAllocPool* pool, u32 size) { return ret; } -void* Audio_Alloc(SoundAllocPool* pool, u32 size) { +void* AudioHeap_Alloc(AudioAllocPool* pool, u32 size) { u32 aligned = ALIGN16(size); u8* ret = pool->cur; @@ -166,24 +175,24 @@ void* Audio_Alloc(SoundAllocPool* pool, u32 size) { } else { return NULL; } - pool->unused++; + pool->count++; return ret; } -void Audio_SoundAllocPoolInit(SoundAllocPool* pool, void* memAddr, u32 size) { - pool->cur = pool->start = (u8*)ALIGN16((u32)memAddr); - pool->size = size - ((u32)memAddr & 0xF); - pool->unused = 0; +void AudioHeap_AllocPoolInit(AudioAllocPool* pool, void* mem, u32 size) { + pool->cur = pool->start = (u8*)ALIGN16((u32)mem); + pool->size = size - ((u32)mem & 0xF); + pool->count = 0; } -void Audio_PersistentPoolClear(PersistentPool* persistent) { - persistent->pool.unused = 0; +void AudioHeap_PersistentCacheClear(AudioPersistentCache* persistent) { + persistent->pool.count = 0; persistent->numEntries = 0; persistent->pool.cur = persistent->pool.start; } -void Audio_TemporaryPoolClear(TemporaryPool* temporary) { - temporary->pool.unused = 0; +void AudioHeap_TemporaryCacheClear(AudioTemporaryCache* temporary) { + temporary->pool.count = 0; temporary->pool.cur = temporary->pool.start; temporary->nextSide = 0; temporary->entries[0].ptr = temporary->pool.start; @@ -192,30 +201,30 @@ void Audio_TemporaryPoolClear(TemporaryPool* temporary) { temporary->entries[1].id = -1; } -void func_800DE4A0(SoundAllocPool* pool) { - pool->unused = 0; +void AudioHeap_ResetPool(AudioAllocPool* pool) { + pool->count = 0; pool->cur = pool->start; } -void func_800DE4B0(s32 poolIdx) { - SoundMultiPool* loadedPool; - SoundAllocPool* persistentPool; - PersistentPool* persistent; +void AudioHeap_PopCache(s32 tableType) { + AudioCache* loadedPool; + AudioAllocPool* persistentPool; + AudioPersistentCache* persistent; void* entryPtr; u8* table; - switch (poolIdx) { - case 0: - loadedPool = &gAudioContext.seqLoadedPool; + switch (tableType) { + case SEQUENCE_TABLE: + loadedPool = &gAudioContext.seqCache; table = gAudioContext.seqLoadStatus; break; - case 1: - loadedPool = &gAudioContext.bankLoadedPool; - table = gAudioContext.bankLoadStatus; + case FONT_TABLE: + loadedPool = &gAudioContext.fontCache; + table = gAudioContext.fontLoadStatus; break; - case 2: - loadedPool = &gAudioContext.unusedLoadedPool; - table = gAudioContext.audioTableLoadStatus; + case SAMPLE_TABLE: + loadedPool = &gAudioContext.sampleBankCache; + table = gAudioContext.sampleFontLoadStatus; break; } @@ -228,71 +237,71 @@ void func_800DE4B0(s32 poolIdx) { entryPtr = persistent->entries[persistent->numEntries - 1].ptr; persistentPool->cur = entryPtr; - persistentPool->unused--; + persistentPool->count--; - if (poolIdx == 2) { - func_800E0E6C(persistent->entries[persistent->numEntries - 1].id); + if (tableType == SAMPLE_TABLE) { + AudioHeap_DiscardSampleBank(persistent->entries[persistent->numEntries - 1].id); } - if (poolIdx == 1) { - Audio_DiscardBank(persistent->entries[persistent->numEntries - 1].id); + if (tableType == FONT_TABLE) { + AudioHeap_DiscardFont(persistent->entries[persistent->numEntries - 1].id); } table[persistent->entries[persistent->numEntries - 1].id] = 0; persistent->numEntries--; } -void Audio_InitMainPools(s32 sizeForAudioInitPool) { - Audio_SoundAllocPoolInit(&gAudioContext.audioInitPool, gAudioContext.audioHeap, sizeForAudioInitPool); - Audio_SoundAllocPoolInit(&gAudioContext.audioSessionPool, gAudioContext.audioHeap + sizeForAudioInitPool, - gAudioContext.audioHeapSize - sizeForAudioInitPool); - gAudioContext.unkPool.start = NULL; +void AudioHeap_InitMainPools(s32 initPoolSize) { + AudioHeap_AllocPoolInit(&gAudioContext.audioInitPool, gAudioContext.audioHeap, initPoolSize); + AudioHeap_AllocPoolInit(&gAudioContext.audioSessionPool, gAudioContext.audioHeap + initPoolSize, + gAudioContext.audioHeapSize - initPoolSize); + gAudioContext.externalPool.start = NULL; } -void Audio_SessionPoolsInit(AudioPoolSplit4* split) { +void AudioHeap_SessionPoolsInit(AudioPoolSplit4* split) { gAudioContext.audioSessionPool.cur = gAudioContext.audioSessionPool.start; - Audio_SoundAllocPoolInit(&gAudioContext.notesAndBuffersPool, - Audio_Alloc(&gAudioContext.audioSessionPool, split->wantSeq), split->wantSeq); - Audio_SoundAllocPoolInit(&gAudioContext.seqAndBankPool, - Audio_Alloc(&gAudioContext.audioSessionPool, split->wantCustom), split->wantCustom); + AudioHeap_AllocPoolInit(&gAudioContext.notesAndBuffersPool, + AudioHeap_Alloc(&gAudioContext.audioSessionPool, split->wantSeq), split->wantSeq); + AudioHeap_AllocPoolInit(&gAudioContext.cachePool, + AudioHeap_Alloc(&gAudioContext.audioSessionPool, split->wantCustom), split->wantCustom); } -void Audio_SeqAndBankPoolInit(AudioPoolSplit2* split) { - gAudioContext.seqAndBankPool.cur = gAudioContext.seqAndBankPool.start; - Audio_SoundAllocPoolInit(&gAudioContext.persistentCommonPool, - Audio_Alloc(&gAudioContext.seqAndBankPool, split->wantPersistent), split->wantPersistent); - Audio_SoundAllocPoolInit(&gAudioContext.temporaryCommonPool, - Audio_Alloc(&gAudioContext.seqAndBankPool, split->wantTemporary), split->wantTemporary); +void AudioHeap_CachePoolInit(AudioPoolSplit2* split) { + gAudioContext.cachePool.cur = gAudioContext.cachePool.start; + AudioHeap_AllocPoolInit(&gAudioContext.persistentCommonPool, + AudioHeap_Alloc(&gAudioContext.cachePool, split->wantPersistent), split->wantPersistent); + AudioHeap_AllocPoolInit(&gAudioContext.temporaryCommonPool, + AudioHeap_Alloc(&gAudioContext.cachePool, split->wantTemporary), split->wantTemporary); } -void Audio_PersistentPoolsInit(AudioPoolSplit3* split) { +void AudioHeap_PersistentCachesInit(AudioPoolSplit3* split) { gAudioContext.persistentCommonPool.cur = gAudioContext.persistentCommonPool.start; - Audio_SoundAllocPoolInit(&gAudioContext.seqLoadedPool.persistent.pool, - Audio_Alloc(&gAudioContext.persistentCommonPool, split->wantSeq), split->wantSeq); - Audio_SoundAllocPoolInit(&gAudioContext.bankLoadedPool.persistent.pool, - Audio_Alloc(&gAudioContext.persistentCommonPool, split->wantBank), split->wantBank); - Audio_SoundAllocPoolInit(&gAudioContext.unusedLoadedPool.persistent.pool, - Audio_Alloc(&gAudioContext.persistentCommonPool, split->wantUnused), split->wantUnused); - Audio_PersistentPoolClear(&gAudioContext.seqLoadedPool.persistent); - Audio_PersistentPoolClear(&gAudioContext.bankLoadedPool.persistent); - Audio_PersistentPoolClear(&gAudioContext.unusedLoadedPool.persistent); + AudioHeap_AllocPoolInit(&gAudioContext.seqCache.persistent.pool, + AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->wantSeq), split->wantSeq); + AudioHeap_AllocPoolInit(&gAudioContext.fontCache.persistent.pool, + AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->wantFont), split->wantFont); + AudioHeap_AllocPoolInit(&gAudioContext.sampleBankCache.persistent.pool, + AudioHeap_Alloc(&gAudioContext.persistentCommonPool, split->wantSample), split->wantSample); + AudioHeap_PersistentCacheClear(&gAudioContext.seqCache.persistent); + AudioHeap_PersistentCacheClear(&gAudioContext.fontCache.persistent); + AudioHeap_PersistentCacheClear(&gAudioContext.sampleBankCache.persistent); } -void Audio_TemporaryPoolsInit(AudioPoolSplit3* split) { +void AudioHeap_TemporaryCachesInit(AudioPoolSplit3* split) { gAudioContext.temporaryCommonPool.cur = gAudioContext.temporaryCommonPool.start; - Audio_SoundAllocPoolInit(&gAudioContext.seqLoadedPool.temporary.pool, - Audio_Alloc(&gAudioContext.temporaryCommonPool, split->wantSeq), split->wantSeq); - Audio_SoundAllocPoolInit(&gAudioContext.bankLoadedPool.temporary.pool, - Audio_Alloc(&gAudioContext.temporaryCommonPool, split->wantBank), split->wantBank); - Audio_SoundAllocPoolInit(&gAudioContext.unusedLoadedPool.temporary.pool, - Audio_Alloc(&gAudioContext.temporaryCommonPool, split->wantUnused), split->wantUnused); - Audio_TemporaryPoolClear(&gAudioContext.seqLoadedPool.temporary); - Audio_TemporaryPoolClear(&gAudioContext.bankLoadedPool.temporary); - Audio_TemporaryPoolClear(&gAudioContext.unusedLoadedPool.temporary); + AudioHeap_AllocPoolInit(&gAudioContext.seqCache.temporary.pool, + AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->wantSeq), split->wantSeq); + AudioHeap_AllocPoolInit(&gAudioContext.fontCache.temporary.pool, + AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->wantFont), split->wantFont); + AudioHeap_AllocPoolInit(&gAudioContext.sampleBankCache.temporary.pool, + AudioHeap_Alloc(&gAudioContext.temporaryCommonPool, split->wantSample), split->wantSample); + AudioHeap_TemporaryCacheClear(&gAudioContext.seqCache.temporary); + AudioHeap_TemporaryCacheClear(&gAudioContext.fontCache.temporary); + AudioHeap_TemporaryCacheClear(&gAudioContext.sampleBankCache.temporary); } -void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { - SoundMultiPool* loadedPool; - TemporaryPool* tp; - SoundAllocPool* pool; +void* AudioHeap_AllocCached(s32 tableType, s32 size, s32 cache, s32 id) { + AudioCache* loadedPool; + AudioTemporaryCache* tp; + AudioAllocPool* pool; void* mem; void* ret; u8 firstVal; @@ -301,22 +310,22 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { u8* table; s32 side; - switch (poolIdx) { - case 0: - loadedPool = &gAudioContext.seqLoadedPool; + switch (tableType) { + case SEQUENCE_TABLE: + loadedPool = &gAudioContext.seqCache; table = gAudioContext.seqLoadStatus; break; - case 1: - loadedPool = &gAudioContext.bankLoadedPool; - table = gAudioContext.bankLoadStatus; + case FONT_TABLE: + loadedPool = &gAudioContext.fontCache; + table = gAudioContext.fontLoadStatus; break; - case 2: - loadedPool = &gAudioContext.unusedLoadedPool; - table = gAudioContext.audioTableLoadStatus; + case SAMPLE_TABLE: + loadedPool = &gAudioContext.sampleBankCache; + table = gAudioContext.sampleFontLoadStatus; break; } - if (arg2 == 0) { + if (cache == CACHE_TEMPORARY) { tp = &loadedPool->temporary; pool = &tp->pool; @@ -327,31 +336,31 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { firstVal = (tp->entries[0].id == -1) ? 0 : table[tp->entries[0].id]; secondVal = (tp->entries[1].id == -1) ? 0 : table[tp->entries[1].id]; - if (poolIdx == 1) { + if (tableType == FONT_TABLE) { if (firstVal == 4) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].playbackState.bankId == tp->entries[0].id && - gAudioContext.notes[i].noteSubEu.bitField0.s.enabled != 0) { + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.notes[i].playbackState.fontId == tp->entries[0].id && + gAudioContext.notes[i].noteSubEu.bitField0.enabled != 0) { break; } } - if (i == gAudioContext.maxSimultaneousNotes) { - Audio_SetBankLoadStatus(tp->entries[0].id, 3); + if (i == gAudioContext.numNotes) { + AudioLoad_SetFontLoadStatus(tp->entries[0].id, 3); firstVal = 3; } } if (secondVal == 4) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].playbackState.bankId == tp->entries[1].id && - gAudioContext.notes[i].noteSubEu.bitField0.s.enabled != 0) { + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.notes[i].playbackState.fontId == tp->entries[1].id && + gAudioContext.notes[i].noteSubEu.bitField0.enabled != 0) { break; } } - if (i == gAudioContext.maxSimultaneousNotes) { - Audio_SetBankLoadStatus(tp->entries[1].id, 3); + if (i == gAudioContext.numNotes) { + AudioLoad_SetFontLoadStatus(tp->entries[1].id, 3); secondVal = 3; } } @@ -369,7 +378,7 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { tp->nextSide = 1; } else { // Check if there is a side which isn't in active use, if so, evict that one. - if (poolIdx == 0) { + if (tableType == SEQUENCE_TABLE) { if (firstVal == 2) { for (i = 0; i < gAudioContext.audioBufferParameters.numSequencePlayers; i++) { if (gAudioContext.seqPlayers[i].enabled != 0 && @@ -397,28 +406,28 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { goto done; } } - } else if (poolIdx == 1) { + } else if (tableType == FONT_TABLE) { if (firstVal == 2) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].playbackState.bankId == tp->entries[0].id && - gAudioContext.notes[i].noteSubEu.bitField0.s.enabled != 0) { + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.notes[i].playbackState.fontId == tp->entries[0].id && + gAudioContext.notes[i].noteSubEu.bitField0.enabled != 0) { break; } } - if (i == gAudioContext.maxSimultaneousNotes) { + if (i == gAudioContext.numNotes) { tp->nextSide = 0; goto done; } } if (secondVal == 2) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].playbackState.bankId == tp->entries[1].id && - gAudioContext.notes[i].noteSubEu.bitField0.s.enabled != 0) { + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.notes[i].playbackState.fontId == tp->entries[1].id && + gAudioContext.notes[i].noteSubEu.bitField0.enabled != 0) { break; } } - if (i == gAudioContext.maxSimultaneousNotes) { + if (i == gAudioContext.numNotes) { tp->nextSide = 1; goto done; } @@ -454,12 +463,12 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { side = tp->nextSide; if (tp->entries[side].id != -1) { - if (poolIdx == 2) { - func_800E0E6C(tp->entries[side].id); + if (tableType == SAMPLE_TABLE) { + AudioHeap_DiscardSampleBank(tp->entries[side].id); } table[tp->entries[side].id] = 0; - if (poolIdx == 1) { - Audio_DiscardBank(tp->entries[side].id); + if (tableType == FONT_TABLE) { + AudioHeap_DiscardFont(tp->entries[side].id); } } @@ -471,17 +480,17 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { pool->cur = pool->start + size; if (tp->entries[1].id != -1 && tp->entries[1].ptr < pool->cur) { - if (poolIdx == 2) { - func_800E0E6C(tp->entries[1].id); + if (tableType == SAMPLE_TABLE) { + AudioHeap_DiscardSampleBank(tp->entries[1].id); } table[tp->entries[1].id] = 0; - switch (poolIdx) { - case 0: - Audio_DiscardSequence((s32)tp->entries[1].id); + switch (tableType) { + case SEQUENCE_TABLE: + AudioHeap_DiscardSequence((s32)tp->entries[1].id); break; - case 1: - Audio_DiscardBank((s32)tp->entries[1].id); + case FONT_TABLE: + AudioHeap_DiscardFont((s32)tp->entries[1].id); break; } @@ -497,17 +506,17 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { tp->entries[1].id = id; tp->entries[1].size = size; if (tp->entries[0].id != -1 && tp->entries[1].ptr < pool->cur) { - if (poolIdx == 2) { - func_800E0E6C(tp->entries[0].id); + if (tableType == SAMPLE_TABLE) { + AudioHeap_DiscardSampleBank(tp->entries[0].id); } table[tp->entries[0].id] = 0; - switch (poolIdx) { - case 0: - Audio_DiscardSequence(tp->entries[0].id); + switch (tableType) { + case SEQUENCE_TABLE: + AudioHeap_DiscardSequence(tp->entries[0].id); break; - case 1: - Audio_DiscardBank(tp->entries[0].id); + case FONT_TABLE: + AudioHeap_DiscardFont(tp->entries[0].id); break; } @@ -525,16 +534,16 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { return ret; } - mem = Audio_Alloc(&loadedPool->persistent.pool, size); + mem = AudioHeap_Alloc(&loadedPool->persistent.pool, size); loadedPool->persistent.entries[loadedPool->persistent.numEntries].ptr = mem; if (mem == NULL) { - switch (arg2) { - case 2: - return Audio_AllocBankOrSeq(poolIdx, size, 0, id); + switch (cache) { + case CACHE_EITHER: + return AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, id); - case 0: - case 1: + case CACHE_TEMPORARY: + case CACHE_PERSISTENT: return NULL; } } @@ -544,43 +553,44 @@ void* Audio_AllocBankOrSeq(s32 poolIdx, s32 size, s32 arg2, s32 id) { return loadedPool->persistent.entries[loadedPool->persistent.numEntries++].ptr; } -void* func_800DF074(s32 poolIdx, s32 arg1, s32 id) { +void* AudioHeap_SearchCaches(s32 tableType, s32 cache, s32 id) { void* ret; - ret = func_800E04E8(poolIdx, id); + // Always search the permanent cache in addition to the regular ones. + ret = AudioHeap_SearchPermanentCache(tableType, id); if (ret != NULL) { return ret; } - if (arg1 == 3) { + if (cache == CACHE_PERMANENT) { return NULL; } - return func_800DF0CC(poolIdx, arg1, id); + return AudioHeap_SearchRegularCaches(tableType, cache, id); } -void* func_800DF0CC(s32 poolIdx, s32 arg1, s32 bankId) { +void* AudioHeap_SearchRegularCaches(s32 tableType, s32 cache, s32 id) { u32 i; - SoundMultiPool* loadedPool; - TemporaryPool* temporary; - PersistentPool* persistent; + AudioCache* loadedPool; + AudioTemporaryCache* temporary; + AudioPersistentCache* persistent; - switch (poolIdx) { - case 0: - loadedPool = &gAudioContext.seqLoadedPool; + switch (tableType) { + case SEQUENCE_TABLE: + loadedPool = &gAudioContext.seqCache; break; - case 1: - loadedPool = &gAudioContext.bankLoadedPool; + case FONT_TABLE: + loadedPool = &gAudioContext.fontCache; break; - case 2: - loadedPool = &gAudioContext.unusedLoadedPool; + case SAMPLE_TABLE: + loadedPool = &gAudioContext.sampleBankCache; break; } temporary = &loadedPool->temporary; - if (arg1 == 0) { - if (temporary->entries[0].id == bankId) { + if (cache == CACHE_TEMPORARY) { + if (temporary->entries[0].id == id) { temporary->nextSide = 1; return temporary->entries[0].ptr; - } else if (temporary->entries[1].id == bankId) { + } else if (temporary->entries[1].id == id) { temporary->nextSide = 0; return temporary->entries[1].ptr; } else { @@ -590,38 +600,46 @@ void* func_800DF0CC(s32 poolIdx, s32 arg1, s32 bankId) { persistent = &loadedPool->persistent; for (i = 0; i < persistent->numEntries; i++) { - if (persistent->entries[i].id == bankId) { + if (persistent->entries[i].id == id) { return persistent->entries[i].ptr; } } - if (arg1 == 2) { - return func_800DF074(poolIdx, 0, bankId); + if (cache == CACHE_EITHER) { + return AudioHeap_SearchCaches(tableType, CACHE_TEMPORARY, id); } return NULL; } -void func_800DF1D8(f32 arg0, f32 arg1, u16* arg2) { +void func_800DF1D8(f32 p, f32 q, u16* out) { + // With the bug below fixed, this mysterious unused function computes two recurrences + // out[0..7] = a_i, out[8..15] = b_i, where + // a_{-2} = b_{-1} = 262159 = 2^18 + 15 + // a_{-1} = b_{-2} = 0 + // a_i = q * a_{i-1} + p * a_{i-2} + // b_i = q * b_{i-1} + p * b_{i-2} + // These grow exponentially if p < -1 or p + |q| > 1. s32 i; f32 tmp[16]; - tmp[0] = (f32)(arg1 * 262159.0f); - tmp[8] = (f32)(arg0 * 262159.0f); - tmp[1] = (f32)((arg1 * arg0) * 262159.0f); - tmp[9] = (f32)(((arg0 * arg0) + arg1) * 262159.0f); + tmp[0] = (f32)(q * 262159.0f); + tmp[8] = (f32)(p * 262159.0f); + tmp[1] = (f32)((q * p) * 262159.0f); + tmp[9] = (f32)(((p * p) + q) * 262159.0f); for (i = 2; i < 8; i++) { - //! @bug value was probably meant to be stored to tmp[i] and tmp[8 + i] - arg2[i] = arg1 * tmp[i - 2] + arg0 * tmp[i - 1]; - arg2[8 + i] = arg1 * tmp[6 + i] + arg0 * tmp[7 + i]; + //! @bug value should be stored to tmp[i] and tmp[8 + i], otherwise we read + //! garbage in later loop iterations. + out[i] = q * tmp[i - 2] + p * tmp[i - 1]; + out[8 + i] = q * tmp[6 + i] + p * tmp[7 + i]; } for (i = 0; i < 16; i++) { - arg2[i] = tmp[i]; + out[i] = tmp[i]; } } -void func_800DF5AC(s16* filter) { +void AudioHeap_ClearFilter(s16* filter) { s32 i; for (i = 0; i < 8; i++) { @@ -629,46 +647,47 @@ void func_800DF5AC(s16* filter) { } } -void func_800DF5DC(s16* filter, s32 arg1) { +void AudioHeap_LoadLowPassFilter(s16* filter, s32 cutoff) { s32 i; - s16* ptr = &D_80130228[8 * arg1]; + s16* ptr = &sLowPassFilterData[8 * cutoff]; for (i = 0; i < 8; i++) { filter[i] = ptr[i]; } } -void func_800DF630(s16* filter, s32 arg1) { +void AudioHeap_LoadHighPassFilter(s16* filter, s32 cutoff) { s32 i; - s16* ptr = &D_80130328[8 * (arg1 - 1)]; + s16* ptr = &sHighPassFilterData[8 * (cutoff - 1)]; for (i = 0; i < 8; i++) { filter[i] = ptr[i]; } } -void func_800DF688(s16* filter, s32 arg1, s32 arg2) { +void AudioHeap_LoadFilter(s16* filter, s32 lowPassCutoff, s32 highPassCutoff) { s32 i; - if (arg1 == 0 && arg2 == 0) { - func_800DF5DC(filter, 0); - } else if (arg2 == 0) { - func_800DF5DC(filter, arg1); - } else if (arg1 == 0) { - func_800DF630(filter, arg2); + if (lowPassCutoff == 0 && highPassCutoff == 0) { + // Identity filter + AudioHeap_LoadLowPassFilter(filter, 0); + } else if (highPassCutoff == 0) { + AudioHeap_LoadLowPassFilter(filter, lowPassCutoff); + } else if (lowPassCutoff == 0) { + AudioHeap_LoadHighPassFilter(filter, highPassCutoff); } else { - s16* ptr1 = &D_80130228[8 * arg1]; - s16* ptr2 = &D_80130328[8 * (arg2 - 1)]; + s16* ptr1 = &sLowPassFilterData[8 * lowPassCutoff]; + s16* ptr2 = &sHighPassFilterData[8 * (highPassCutoff - 1)]; for (i = 0; i < 8; i++) { filter[i] = (ptr1[i] + ptr2[i]) / 2; } } } -void func_800DF7BC(SynthesisReverb* reverb) { +void AudioHeap_UpdateReverb(SynthesisReverb* reverb) { } -void func_800DF7C4(void) { +void AudioHeap_UpdateReverbs(void) { s32 count; s32 i; s32 j; @@ -681,24 +700,24 @@ void func_800DF7C4(void) { for (i = 0; i < gAudioContext.numSynthesisReverbs; i++) { for (j = 0; j < count; j++) { - func_800DF7BC(&gAudioContext.synthesisReverbs[i]); + AudioHeap_UpdateReverb(&gAudioContext.synthesisReverbs[i]); } } } -void func_800DF888(void) { +void AudioHeap_ClearAiBuffers(void) { s32 ind; s32 i; ind = gAudioContext.curAIBufIdx; gAudioContext.aiBufLengths[ind] = gAudioContext.audioBufferParameters.minAiBufferLength; - for (i = 0; i < 0x580; i++) { + for (i = 0; i < AIBUF_LEN; i++) { gAudioContext.aiBuffers[ind][i] = 0; } } -s32 Audio_ResetStep(void) { +s32 AudioHeap_ResetStep(void) { s32 i; s32 j; s32 sp24; @@ -712,7 +731,7 @@ s32 Audio_ResetStep(void) { switch (gAudioContext.resetStatus) { case 5: for (i = 0; i < gAudioContext.audioBufferParameters.numSequencePlayers; i++) { - Audio_SequencePlayerDisableAsFinished(&gAudioContext.seqPlayers[i]); + AudioSeq_SequencePlayerDisableAsFinished(&gAudioContext.seqPlayers[i]); } gAudioContext.audioResetFadeOutFramesLeft = 2 / sp24; gAudioContext.resetStatus--; @@ -721,10 +740,10 @@ s32 Audio_ResetStep(void) { case 4: if (gAudioContext.audioResetFadeOutFramesLeft != 0) { gAudioContext.audioResetFadeOutFramesLeft--; - func_800DF7C4(); + AudioHeap_UpdateReverbs(); } else { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].noteSubEu.bitField0.s.enabled && + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.notes[i].noteSubEu.bitField0.enabled && gAudioContext.notes[i].playbackState.adsr.action.s.state != ADSR_STATE_DISABLED) { gAudioContext.notes[i].playbackState.adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv; @@ -739,7 +758,7 @@ s32 Audio_ResetStep(void) { case 3: if (gAudioContext.audioResetFadeOutFramesLeft != 0) { gAudioContext.audioResetFadeOutFramesLeft--; - func_800DF7C4(); + AudioHeap_UpdateReverbs(); } else { gAudioContext.audioResetFadeOutFramesLeft = 2 / sp24; gAudioContext.resetStatus--; @@ -747,22 +766,22 @@ s32 Audio_ResetStep(void) { break; case 2: - func_800DF888(); + AudioHeap_ClearAiBuffers(); if (gAudioContext.audioResetFadeOutFramesLeft != 0) { gAudioContext.audioResetFadeOutFramesLeft--; } else { gAudioContext.resetStatus--; - func_800E0CBC(); - func_800E1148(); + AudioHeap_DiscardSampleCaches(); + AudioHeap_DiscardSampleBanks(); } break; case 1: - Audio_InitHeap(); + AudioHeap_Init(); gAudioContext.resetStatus = 0; for (i = 0; i < 3; i++) { gAudioContext.aiBufLengths[i] = gAudioContext.audioBufferParameters.maxAiBufferLength; - for (j = 0; j < 0x580; j++) { + for (j = 0; j < AIBUF_LEN; j++) { gAudioContext.aiBuffers[i][j] = 0; } } @@ -776,7 +795,7 @@ s32 Audio_ResetStep(void) { return 1; } -void Audio_InitHeap(void) { +void AudioHeap_Init(void) { s32 pad1[4]; s16* mem; s32 persistentMem; @@ -790,7 +809,7 @@ void Audio_InitHeap(void) { AudioSpec* spec; spec = &gAudioSpecs[gAudioContext.audioResetSpecIdToLoad]; - gAudioContext.sampleDmaReqCnt = 0; + gAudioContext.sampleDmaCount = 0; gAudioContext.audioBufferParameters.frequency = spec->frequency; gAudioContext.audioBufferParameters.aiFrequency = osAiSetFrequency(gAudioContext.audioBufferParameters.frequency); gAudioContext.audioBufferParameters.samplesPerFrameTarget = @@ -811,10 +830,10 @@ void Audio_InitHeap(void) { (1.0f / 256.0f) / gAudioContext.audioBufferParameters.updatesPerFrame; gAudioContext.audioBufferParameters.unk_24 = gAudioContext.audioBufferParameters.updatesPerFrame * 0.25f; gAudioContext.audioBufferParameters.updatesPerFrameInv = 1.0f / gAudioContext.audioBufferParameters.updatesPerFrame; - gAudioContext.unk_2874 = spec->unk_10; - gAudioContext.unk_2878 = spec->unk_12; + gAudioContext.sampleDmaBufSize1 = spec->sampleDmaBufSize1; + gAudioContext.sampleDmaBufSize2 = spec->sampleDmaBufSize2; - gAudioContext.maxSimultaneousNotes = spec->maxSimultaneousNotes; + gAudioContext.numNotes = spec->numNotes; gAudioContext.audioBufferParameters.numSequencePlayers = spec->numSequencePlayers; if (gAudioContext.audioBufferParameters.numSequencePlayers > 4) { gAudioContext.audioBufferParameters.numSequencePlayers = 4; @@ -838,49 +857,48 @@ void Audio_InitHeap(void) { gAudioContext.audioBufferParameters.maxAiBufferLength -= 0x10; } - gAudioContext.maxAudioCmds = - gAudioContext.maxSimultaneousNotes * 0x10 * gAudioContext.audioBufferParameters.updatesPerFrame + - spec->numReverbs * 0x18 + 0x140; + gAudioContext.maxAudioCmds = gAudioContext.numNotes * 0x10 * gAudioContext.audioBufferParameters.updatesPerFrame + + spec->numReverbs * 0x18 + 0x140; - persistentMem = spec->persistentSeqMem + spec->persistentBankMem + spec->persistentUnusedMem + 0x10; - temporaryMem = spec->temporarySeqMem + spec->temporaryBankMem + spec->temporaryUnusedMem + 0x10; + persistentMem = spec->persistentSeqMem + spec->persistentFontMem + spec->persistentSampleMem + 0x10; + temporaryMem = spec->temporarySeqMem + spec->temporaryFontMem + spec->temporarySampleMem + 0x10; totalMem = persistentMem + temporaryMem; wantMisc = gAudioContext.audioSessionPool.size - totalMem - 0x100; - if (gAudioContext.unkPool.start != NULL) { - gAudioContext.unkPool.cur = gAudioContext.unkPool.start; + if (gAudioContext.externalPool.start != NULL) { + gAudioContext.externalPool.cur = gAudioContext.externalPool.start; } gAudioContext.sessionPoolSplit.wantSeq = wantMisc; gAudioContext.sessionPoolSplit.wantCustom = totalMem; - Audio_SessionPoolsInit(&gAudioContext.sessionPoolSplit); - gAudioContext.seqAndBankPoolSplit.wantPersistent = persistentMem; - gAudioContext.seqAndBankPoolSplit.wantTemporary = temporaryMem; - Audio_SeqAndBankPoolInit(&gAudioContext.seqAndBankPoolSplit); + AudioHeap_SessionPoolsInit(&gAudioContext.sessionPoolSplit); + gAudioContext.cachePoolSplit.wantPersistent = persistentMem; + gAudioContext.cachePoolSplit.wantTemporary = temporaryMem; + AudioHeap_CachePoolInit(&gAudioContext.cachePoolSplit); gAudioContext.persistentCommonPoolSplit.wantSeq = spec->persistentSeqMem; - gAudioContext.persistentCommonPoolSplit.wantBank = spec->persistentBankMem; - gAudioContext.persistentCommonPoolSplit.wantUnused = spec->persistentUnusedMem; - Audio_PersistentPoolsInit(&gAudioContext.persistentCommonPoolSplit); + gAudioContext.persistentCommonPoolSplit.wantFont = spec->persistentFontMem; + gAudioContext.persistentCommonPoolSplit.wantSample = spec->persistentSampleMem; + AudioHeap_PersistentCachesInit(&gAudioContext.persistentCommonPoolSplit); gAudioContext.temporaryCommonPoolSplit.wantSeq = spec->temporarySeqMem; - gAudioContext.temporaryCommonPoolSplit.wantBank = spec->temporaryBankMem; - gAudioContext.temporaryCommonPoolSplit.wantUnused = spec->temporaryUnusedMem; - Audio_TemporaryPoolsInit(&gAudioContext.temporaryCommonPoolSplit); + gAudioContext.temporaryCommonPoolSplit.wantFont = spec->temporaryFontMem; + gAudioContext.temporaryCommonPoolSplit.wantSample = spec->temporarySampleMem; + AudioHeap_TemporaryCachesInit(&gAudioContext.temporaryCommonPoolSplit); - Audio_ResetLoadStatus(); + AudioHeap_ResetLoadStatus(); gAudioContext.notes = - Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, gAudioContext.maxSimultaneousNotes * sizeof(Note)); + AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, gAudioContext.numNotes * sizeof(Note)); Audio_NoteInitAll(); Audio_InitNoteFreeList(); - gAudioContext.noteSubsEu = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, - gAudioContext.audioBufferParameters.updatesPerFrame * - gAudioContext.maxSimultaneousNotes * sizeof(NoteSubEu)); + gAudioContext.noteSubsEu = + AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, gAudioContext.audioBufferParameters.updatesPerFrame * + gAudioContext.numNotes * sizeof(NoteSubEu)); for (i = 0; i != 2; i++) { - gAudioContext.abiCmdBufs[i] = - Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, gAudioContext.maxAudioCmds * sizeof(u64)); + gAudioContext.abiCmdBufs[i] = AudioHeap_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, + gAudioContext.maxAudioCmds * sizeof(u64)); } - gAudioContext.unk_3520 = Audio_Alloc(&gAudioContext.notesAndBuffersPool, 0x100 * sizeof(f32)); + gAudioContext.unk_3520 = AudioHeap_Alloc(&gAudioContext.notesAndBuffersPool, 0x100 * sizeof(f32)); func_800DDE3C(); for (i = 0; i < 4; i++) { gAudioContext.synthesisReverbs[i].useReverb = 0; @@ -903,8 +921,10 @@ void Audio_InitHeap(void) { reverb->unk_05 = settings->unk_10; reverb->unk_08 = settings->unk_12; reverb->useReverb = 8; - reverb->leftRingBuf = func_800DE258(&gAudioContext.notesAndBuffersPool, reverb->windowSize * sizeof(s16)); - reverb->rightRingBuf = func_800DE258(&gAudioContext.notesAndBuffersPool, reverb->windowSize * sizeof(s16)); + reverb->leftRingBuf = + AudioHeap_AllocZeroedAttemptExternal(&gAudioContext.notesAndBuffersPool, reverb->windowSize * sizeof(s16)); + reverb->rightRingBuf = + AudioHeap_AllocZeroedAttemptExternal(&gAudioContext.notesAndBuffersPool, reverb->windowSize * sizeof(s16)); reverb->nextRingBufPos = 0; reverb->unk_20 = 0; reverb->curFrame = 0; @@ -914,8 +934,8 @@ void Audio_InitHeap(void) { reverb->sound.sample = &reverb->sample; reverb->sample.loop = &reverb->loop; reverb->sound.tuning = 1.0f; - reverb->sample.codec = 4; - reverb->sample.medium = 0; + reverb->sample.codec = CODEC_REVERB; + reverb->sample.medium = MEDIUM_RAM; reverb->sample.size = reverb->windowSize * 2; reverb->sample.sampleAddr = (u8*)reverb->leftRingBuf; reverb->loop.start = 0; @@ -924,156 +944,160 @@ void Audio_InitHeap(void) { if (reverb->downsampleRate != 1) { reverb->unk_0E = 0x8000 / reverb->downsampleRate; - reverb->unk_30 = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); - reverb->unk_34 = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); - reverb->unk_38 = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); - reverb->unk_3C = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); + reverb->unk_30 = AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); + reverb->unk_34 = AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); + reverb->unk_38 = AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); + reverb->unk_3C = AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, 0x20); for (j = 0; j < gAudioContext.audioBufferParameters.updatesPerFrame; j++) { - mem = func_800DE258(&gAudioContext.notesAndBuffersPool, 0x340); + mem = AudioHeap_AllocZeroedAttemptExternal(&gAudioContext.notesAndBuffersPool, 0x340); reverb->items[0][j].toDownsampleLeft = mem; reverb->items[0][j].toDownsampleRight = mem + 0x1A0 / sizeof(s16); - mem = func_800DE258(&gAudioContext.notesAndBuffersPool, 0x340); + mem = AudioHeap_AllocZeroedAttemptExternal(&gAudioContext.notesAndBuffersPool, 0x340); reverb->items[1][j].toDownsampleLeft = mem; reverb->items[1][j].toDownsampleRight = mem + 0x1A0 / sizeof(s16); } } - if (settings->unk_14 != 0) { - reverb->filterLeftState = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40); - reverb->filterLeft = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16)); - func_800DF5DC(reverb->filterLeft, settings->unk_14); + if (settings->lowPassFilterCutoffLeft != 0) { + reverb->filterLeftState = AudioHeap_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40); + reverb->filterLeft = AudioHeap_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16)); + AudioHeap_LoadLowPassFilter(reverb->filterLeft, settings->lowPassFilterCutoffLeft); } else { reverb->filterLeft = NULL; } - if (settings->unk_16 != 0) { - reverb->filterRightState = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40); - reverb->filterRight = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16)); - func_800DF5DC(reverb->filterRight, settings->unk_16); + if (settings->lowPassFilterCutoffRight != 0) { + reverb->filterRightState = AudioHeap_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40); + reverb->filterRight = AudioHeap_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16)); + AudioHeap_LoadLowPassFilter(reverb->filterRight, settings->lowPassFilterCutoffRight); } else { reverb->filterRight = NULL; } } - Audio_InitSequencePlayers(); + AudioSeq_InitSequencePlayers(); for (j = 0; j < gAudioContext.audioBufferParameters.numSequencePlayers; j++) { - func_800EC734(j); - Audio_ResetSequencePlayer(&gAudioContext.seqPlayers[j]); + AudioSeq_InitSequencePlayerChannels(j); + AudioSeq_ResetSequencePlayer(&gAudioContext.seqPlayers[j]); } - func_800E0634(spec->unk_30, spec->unk_34); - func_800E1618(gAudioContext.maxSimultaneousNotes); - gAudioContext.unk_176C = 0; - Audio_SyncLoadsInit(); - func_800E4FB0(); - Audio_AsyncLoadReqInit(); + AudioHeap_InitSampleCaches(spec->persistentSampleCacheMem, spec->temporarySampleCacheMem); + AudioLoad_InitSampleDmaBuffers(gAudioContext.numNotes); + gAudioContext.preloadSampleStackTop = 0; + AudioLoad_InitSlowLoads(); + AudioLoad_InitScriptLoads(); + AudioLoad_InitAsyncLoads(); gAudioContext.unk_4 = 0x1000; - func_800E4D94(); + AudioLoad_LoadPermanentSamples(); intMask = osSetIntMask(1); osWritebackDCacheAll(); osSetIntMask(intMask); } -void* func_800E04E8(s32 poolIdx, s32 id) { +void* AudioHeap_SearchPermanentCache(s32 tableType, s32 id) { s32 i; - for (i = 0; i < gAudioContext.unk_2D50.unused; i++) { - if (gAudioContext.unk_2D60[i].poolIndex == poolIdx && gAudioContext.unk_2D60[i].id == id) { - return gAudioContext.unk_2D60[i].ptr; + for (i = 0; i < gAudioContext.permanentPool.count; i++) { + if (gAudioContext.permanentCache[i].tableType == tableType && gAudioContext.permanentCache[i].id == id) { + return gAudioContext.permanentCache[i].ptr; } } return NULL; } -void* func_800E0540(s32 poolIdx, s32 id, u32 size) { +void* AudioHeap_AllocPermanent(s32 tableType, s32 id, u32 size) { void* ret; - s32 sp18; + s32 index; - sp18 = gAudioContext.unk_2D50.unused; + index = gAudioContext.permanentPool.count; - ret = Audio_Alloc(&gAudioContext.unk_2D50, size); - gAudioContext.unk_2D60[sp18].ptr = ret; + ret = AudioHeap_Alloc(&gAudioContext.permanentPool, size); + gAudioContext.permanentCache[index].ptr = ret; if (ret == NULL) { return NULL; } - gAudioContext.unk_2D60[sp18].poolIndex = poolIdx; - gAudioContext.unk_2D60[sp18].id = id; - gAudioContext.unk_2D60[sp18].size = size; + gAudioContext.permanentCache[index].tableType = tableType; + gAudioContext.permanentCache[index].id = id; + gAudioContext.permanentCache[index].size = size; //! @bug UB: missing return. "ret" is in v0 at this point, but doing an // explicit return uses an additional register. // return ret; } -void* func_800E05C4(u32 size, s32 arg1, void* arg2, s8 arg3, s32 arg4) { - UnkHeapEntry* entry; +void* AudioHeap_AllocSampleCache(u32 size, s32 fontId, void* sampleAddr, s8 medium, s32 cache) { + SampleCacheEntry* entry; - if (arg4 == 0) { - entry = func_800E06CC(size); + if (cache == CACHE_TEMPORARY) { + entry = AudioHeap_AllocTemporarySampleCacheEntry(size); } else { - entry = func_800E0BF8(size); + entry = AudioHeap_AllocPersistentSampleCacheEntry(size); } if (entry != NULL) { - entry->unk_02 = arg1; - entry->unk_0C = arg2; - entry->unk_01 = arg3; - return entry->unk_08; + //! @bug Should use sampleBankId, not fontId + entry->sampleBankId = fontId; + entry->sampleAddr = sampleAddr; + entry->origMedium = medium; + return entry->allocatedAddr; } return NULL; } -void func_800E0634(u32 arg0, u32 arg1) { +void AudioHeap_InitSampleCaches(u32 persistentSize, u32 temporarySize) { void* mem; - mem = func_800DE2B0(&gAudioContext.notesAndBuffersPool, arg0); + mem = AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, persistentSize); if (mem == NULL) { - gAudioContext.unk_2EE0.pool.size = 0; + gAudioContext.persistentSampleCache.pool.size = 0; } else { - Audio_SoundAllocPoolInit(&gAudioContext.unk_2EE0.pool, mem, arg0); + AudioHeap_AllocPoolInit(&gAudioContext.persistentSampleCache.pool, mem, persistentSize); } - mem = func_800DE2B0(&gAudioContext.notesAndBuffersPool, arg1); + mem = AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, temporarySize); if (mem == NULL) { - gAudioContext.unk_3174.pool.size = 0; + gAudioContext.temporarySampleCache.pool.size = 0; } else { - Audio_SoundAllocPoolInit(&gAudioContext.unk_3174.pool, mem, arg1); + AudioHeap_AllocPoolInit(&gAudioContext.temporarySampleCache.pool, mem, temporarySize); } - gAudioContext.unk_2EE0.size = 0; - gAudioContext.unk_3174.size = 0; + gAudioContext.persistentSampleCache.size = 0; + gAudioContext.temporarySampleCache.size = 0; } -UnkHeapEntry* func_800E06CC(u32 size) { +SampleCacheEntry* AudioHeap_AllocTemporarySampleCacheEntry(u32 size) { u8* allocAfter; u8* allocBefore; void* mem; s32 index; s32 i; - UnkHeapEntry* ret; - AudioStruct0D68* item; - UnkPool* unkPool; + SampleCacheEntry* ret; + AudioPreloadReq* preload; + AudioSampleCache* pool; u8* start; u8* end; - unkPool = &gAudioContext.unk_3174; - allocBefore = unkPool->pool.cur; - mem = Audio_Alloc(&unkPool->pool, size); + pool = &gAudioContext.temporarySampleCache; + allocBefore = pool->pool.cur; + mem = AudioHeap_Alloc(&pool->pool, size); if (mem == NULL) { - u8* old = unkPool->pool.cur; - unkPool->pool.cur = unkPool->pool.start; - mem = Audio_Alloc(&unkPool->pool, size); + // Reset the pool and try again. We still keep pointers to within the + // pool, so we have to be careful to discard existing overlapping + // allocations further down. + u8* old = pool->pool.cur; + pool->pool.cur = pool->pool.start; + mem = AudioHeap_Alloc(&pool->pool, size); if (mem == NULL) { - unkPool->pool.cur = old; + pool->pool.cur = old; return NULL; } - allocBefore = unkPool->pool.start; + allocBefore = pool->pool.start; } - allocAfter = unkPool->pool.cur; + allocAfter = pool->pool.cur; index = -1; - for (i = 0; i < gAudioContext.unk_176C; i++) { - item = &gAudioContext.unk_0D68[i]; - if (item->isFree == false) { - start = item->ramAddr; - end = item->ramAddr + item->sample->size - 1; + for (i = 0; i < gAudioContext.preloadSampleStackTop; i++) { + preload = &gAudioContext.preloadSampleStack[i]; + if (preload->isFree == false) { + start = preload->ramAddr; + end = preload->ramAddr + preload->sample->size - 1; if (end < allocBefore && start < allocBefore) { continue; @@ -1082,18 +1106,18 @@ UnkHeapEntry* func_800E06CC(u32 size) { continue; } - // Overlap - item->isFree = true; + // Overlap, skip this preload. + preload->isFree = true; } } - for (i = 0; i < unkPool->size; i++) { - if (unkPool->entries[i].unk_00 == 0) { + for (i = 0; i < pool->size; i++) { + if (pool->entries[i].inUse == false) { continue; } - start = unkPool->entries[i].unk_08; - end = start + unkPool->entries[i].size - 1; + start = pool->entries[i].allocatedAddr; + end = start + pool->entries[i].size - 1; if (end < allocBefore && start < allocBefore) { continue; @@ -1102,273 +1126,279 @@ UnkHeapEntry* func_800E06CC(u32 size) { continue; } - // Overlap. Discard existing entry? - func_800E0AD8(&unkPool->entries[i]); + // Overlap, discard existing entry. + AudioHeap_DiscardSampleCacheEntry(&pool->entries[i]); if (index == -1) { index = i; } } if (index == -1) { - index = unkPool->size++; + index = pool->size++; } - ret = &unkPool->entries[index]; - ret->unk_00 = 1; - ret->unk_08 = mem; + ret = &pool->entries[index]; + ret->inUse = true; + ret->allocatedAddr = mem; ret->size = size; return ret; } -void func_800E0964(UnkHeapEntry* entry, s32 bankId) { +void AudioHeap_UnapplySampleCacheForFont(SampleCacheEntry* entry, s32 fontId) { Drum* drum; Instrument* inst; - AudioBankSound* sfx; + SoundFontSound* sfx; s32 instId; s32 drumId; s32 sfxId; - for (instId = 0; instId < gAudioContext.ctlEntries[bankId].numInstruments; instId++) { - inst = Audio_GetInstrumentInner(bankId, instId); + for (instId = 0; instId < gAudioContext.soundFonts[fontId].numInstruments; instId++) { + inst = Audio_GetInstrumentInner(fontId, instId); if (inst != NULL) { if (inst->normalRangeLo != 0) { - func_800E0BB4(entry, inst->lowNotesSound.sample); + AudioHeap_UnapplySampleCache(entry, inst->lowNotesSound.sample); } if (inst->normalRangeHi != 0x7F) { - func_800E0BB4(entry, inst->highNotesSound.sample); + AudioHeap_UnapplySampleCache(entry, inst->highNotesSound.sample); } - func_800E0BB4(entry, inst->normalNotesSound.sample); + AudioHeap_UnapplySampleCache(entry, inst->normalNotesSound.sample); } } - for (drumId = 0; drumId < gAudioContext.ctlEntries[bankId].numDrums; drumId++) { - drum = Audio_GetDrum(bankId, drumId); + for (drumId = 0; drumId < gAudioContext.soundFonts[fontId].numDrums; drumId++) { + drum = Audio_GetDrum(fontId, drumId); if (drum != NULL) { - func_800E0BB4(entry, drum->sound.sample); + AudioHeap_UnapplySampleCache(entry, drum->sound.sample); } } - for (sfxId = 0; sfxId < gAudioContext.ctlEntries[bankId].numSfx; sfxId++) { - sfx = Audio_GetSfx(bankId, sfxId); + for (sfxId = 0; sfxId < gAudioContext.soundFonts[fontId].numSfx; sfxId++) { + sfx = Audio_GetSfx(fontId, sfxId); if (sfx != NULL) { - func_800E0BB4(entry, sfx->sample); + AudioHeap_UnapplySampleCache(entry, sfx->sample); } } } -void func_800E0AD8(UnkHeapEntry* entry) { - s32 numBanks; - s32 unk2; - s32 unk3; - s32 bankId; +void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) { + s32 numFonts; + s32 sampleBankId1; + s32 sampleBankId2; + s32 fontId; - numBanks = gAudioContext.audioBankTable->header.entryCnt; - for (bankId = 0; bankId < numBanks; bankId++) { - unk2 = gAudioContext.ctlEntries[bankId].unk_02; - unk3 = gAudioContext.ctlEntries[bankId].unk_03; - if (((unk2 != 0xFF) && (entry->unk_02 == unk2)) || ((unk3 != 0xFF) && (entry->unk_02 == unk3)) || - entry->unk_02 == 0) { - if (func_800DF074(1, 2, bankId) != NULL) { - if (Audio_IsBankLoadComplete(bankId) != 0) { - func_800E0964(entry, bankId); + numFonts = gAudioContext.soundFontTable->numEntries; + for (fontId = 0; fontId < numFonts; fontId++) { + sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + if (((sampleBankId1 != 0xFF) && (entry->sampleBankId == sampleBankId1)) || + ((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || entry->sampleBankId == 0) { + if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, fontId) != NULL) { + if (AudioLoad_IsFontLoadComplete(fontId) != 0) { + AudioHeap_UnapplySampleCacheForFont(entry, fontId); } } } } } -void func_800E0BB4(UnkHeapEntry* entry, AudioBankSample* sample) { +void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample) { if (sample != NULL) { - if (sample->sampleAddr == entry->unk_08) { - sample->sampleAddr = entry->unk_0C; - sample->medium = entry->unk_01; + if (sample->sampleAddr == entry->allocatedAddr) { + sample->sampleAddr = entry->sampleAddr; + sample->medium = entry->origMedium; } } } -UnkHeapEntry* func_800E0BF8(u32 size) { - UnkPool* pool; - UnkHeapEntry* entry; +SampleCacheEntry* AudioHeap_AllocPersistentSampleCacheEntry(u32 size) { + AudioSampleCache* pool; + SampleCacheEntry* entry; void* mem; - pool = &gAudioContext.unk_2EE0; - mem = Audio_Alloc(&pool->pool, size); + pool = &gAudioContext.persistentSampleCache; + mem = AudioHeap_Alloc(&pool->pool, size); if (mem == NULL) { return NULL; } entry = &pool->entries[pool->size]; - entry->unk_00 = 1; - entry->unk_08 = mem; + entry->inUse = true; + entry->allocatedAddr = mem; entry->size = size; pool->size++; return entry; } -void func_800E0C80(UnkHeapEntry* entry, s32 arg1, s32 arg2, s32 bankId) { - if ((entry->unk_02 == arg1) || (entry->unk_02 == arg2) || (entry->unk_02 == 0)) { - func_800E0964(entry, bankId); +void AudioHeap_DiscardSampleCacheForFont(SampleCacheEntry* entry, s32 sampleBankId1, s32 sampleBankId2, s32 fontId) { + if ((entry->sampleBankId == sampleBankId1) || (entry->sampleBankId == sampleBankId2) || + (entry->sampleBankId == 0)) { + AudioHeap_UnapplySampleCacheForFont(entry, fontId); } } -void func_800E0CBC(void) { - s32 numBanks; - s32 unk2; - s32 unk3; - s32 bankId; +void AudioHeap_DiscardSampleCaches(void) { + s32 numFonts; + s32 sampleBankId1; + s32 sampleBankId2; + s32 fontId; s32 j; - numBanks = gAudioContext.audioBankTable->header.entryCnt; - for (bankId = 0; bankId < numBanks; bankId++) { - unk2 = gAudioContext.ctlEntries[bankId].unk_02; - unk3 = gAudioContext.ctlEntries[bankId].unk_03; - if ((unk2 == 0xFF) && (unk3 == 0xFF)) { + numFonts = gAudioContext.soundFontTable->numEntries; + for (fontId = 0; fontId < numFonts; fontId++) { + sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + if ((sampleBankId1 == 0xFF) && (sampleBankId2 == 0xFF)) { continue; } - if (func_800DF074(1, 3, bankId) == NULL || !Audio_IsBankLoadComplete(bankId)) { + if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_PERMANENT, fontId) == NULL || + !AudioLoad_IsFontLoadComplete(fontId)) { continue; } - for (j = 0; j < gAudioContext.unk_2EE0.size; j++) { - func_800E0C80(&gAudioContext.unk_2EE0.entries[j], unk2, unk3, bankId); + for (j = 0; j < gAudioContext.persistentSampleCache.size; j++) { + AudioHeap_DiscardSampleCacheForFont(&gAudioContext.persistentSampleCache.entries[j], sampleBankId1, + sampleBankId2, fontId); } - for (j = 0; j < gAudioContext.unk_3174.size; j++) { - func_800E0C80(&gAudioContext.unk_3174.entries[j], unk2, unk3, bankId); + for (j = 0; j < gAudioContext.temporarySampleCache.size; j++) { + AudioHeap_DiscardSampleCacheForFont(&gAudioContext.temporarySampleCache.entries[j], sampleBankId1, + sampleBankId2, fontId); } } } typedef struct { - u8* unk_0; - u8* unk_4; - u32 unk_8; - u8 unk_C; -} Struct_800E0E0C; + u32 oldAddr; + u32 newAddr; + u32 size; + u8 newMedium; +} StorageChange; -void func_800E0E0C(Struct_800E0E0C* arg0, AudioBankSample* sample) { +void AudioHeap_ChangeStorage(StorageChange* change, SoundFontSample* sample) { if (sample != NULL) { - u8* start = arg0->unk_0; - u8* end = arg0->unk_0 + arg0->unk_8; - u8* sampleAddr = sample->sampleAddr; - if (start <= sampleAddr && sampleAddr < end) { - sample->sampleAddr = sampleAddr - start + arg0->unk_4; - sample->medium = arg0->unk_C & 0xFF; + u32 start = change->oldAddr; + u32 end = change->oldAddr + change->size; + if (start <= (u32)sample->sampleAddr && (u32)sample->sampleAddr < end) { + sample->sampleAddr = sample->sampleAddr - start + change->newAddr; + sample->medium = change->newMedium; } } } -void func_800E0E6C(s32 id) { - func_800E0EB4(0, id); +void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 id); + +void AudioHeap_DiscardSampleBank(s32 sampleBankId) { + AudioHeap_ApplySampleBankCacheInternal(false, sampleBankId); } -void func_800E0E90(s32 id) { - func_800E0EB4(1, id); +void AudioHeap_ApplySampleBankCache(s32 sampleBankId) { + AudioHeap_ApplySampleBankCacheInternal(true, sampleBankId); } -void func_800E0EB4(s32 arg0, s32 id) { - AudioTable* audioTable; - AudioTableEntry* thing; - s32 numBanks; +void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 sampleBankId) { + AudioTable* sampleBankTable; + AudioTableEntry* entry; + s32 numFonts; s32 instId; s32 drumId; s32 sfxId; - Struct_800E0E0C sp78; - s32 unk2; - s32 unk3; - s32 bankId; + StorageChange change; + s32 sampleBankId1; + s32 sampleBankId2; + s32 fontId; Drum* drum; Instrument* inst; - AudioBankSound* sfx; - u8** fakematch; + SoundFontSound* sfx; + u32* fakematch; s32 pad[4]; - audioTable = gAudioContext.audioTable; - numBanks = gAudioContext.audioBankTable->header.entryCnt; - sp78.unk_0 = func_800DF074(2, 2, id); - if (sp78.unk_0 == NULL) { + sampleBankTable = gAudioContext.sampleBankTable; + numFonts = gAudioContext.soundFontTable->numEntries; + change.oldAddr = AudioHeap_SearchCaches(SAMPLE_TABLE, CACHE_EITHER, sampleBankId); + if (change.oldAddr == 0) { return; } - thing = &audioTable->entries[id]; - sp78.unk_8 = thing->size; - sp78.unk_C = thing->unk_08; + entry = &sampleBankTable->entries[sampleBankId]; + change.size = entry->size; + change.newMedium = entry->medium; - if ((sp78.unk_C == 2) || (sp78.unk_C == 3)) { - sp78.unk_4 = thing->romAddr; + if ((change.newMedium == MEDIUM_CART) || (change.newMedium == MEDIUM_DISK_DRIVE)) { + change.newAddr = entry->romAddr; } else { - sp78.unk_4 = NULL; + change.newAddr = 0; } - fakematch = &sp78.unk_0; - if ((arg0 != 0) && (arg0 == 1)) { - u8* temp = sp78.unk_4; - sp78.unk_4 = *fakematch; - sp78.unk_0 = temp; - sp78.unk_C = 0; + fakematch = &change.oldAddr; + if ((apply != false) && (apply == true)) { + u32 temp = change.newAddr; + change.newAddr = *fakematch; // = change.oldAddr + change.oldAddr = temp; + change.newMedium = MEDIUM_RAM; } - for (bankId = 0; bankId < numBanks; bankId++) { - unk2 = gAudioContext.ctlEntries[bankId].unk_02; - unk3 = gAudioContext.ctlEntries[bankId].unk_03; - if ((unk2 != 0xFF) || (unk3 != 0xFF)) { - if (!Audio_IsBankLoadComplete(bankId) || func_800DF074(1, 2, bankId) == NULL) { + for (fontId = 0; fontId < numFonts; fontId++) { + sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + if ((sampleBankId1 != 0xFF) || (sampleBankId2 != 0xFF)) { + if (!AudioLoad_IsFontLoadComplete(fontId) || + AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, fontId) == NULL) { continue; } - if (unk2 == id) { - } else if (unk3 == id) { + if (sampleBankId1 == sampleBankId) { + } else if (sampleBankId2 == sampleBankId) { } else { continue; } - for (instId = 0; instId < gAudioContext.ctlEntries[bankId].numInstruments; instId++) { - inst = Audio_GetInstrumentInner(bankId, instId); + for (instId = 0; instId < gAudioContext.soundFonts[fontId].numInstruments; instId++) { + inst = Audio_GetInstrumentInner(fontId, instId); if (inst != NULL) { if (inst->normalRangeLo != 0) { - func_800E0E0C(&sp78, inst->lowNotesSound.sample); + AudioHeap_ChangeStorage(&change, inst->lowNotesSound.sample); } if (inst->normalRangeHi != 0x7F) { - func_800E0E0C(&sp78, inst->highNotesSound.sample); + AudioHeap_ChangeStorage(&change, inst->highNotesSound.sample); } - func_800E0E0C(&sp78, inst->normalNotesSound.sample); + AudioHeap_ChangeStorage(&change, inst->normalNotesSound.sample); } } - for (drumId = 0; drumId < gAudioContext.ctlEntries[bankId].numDrums; drumId++) { - drum = Audio_GetDrum(bankId, drumId); + for (drumId = 0; drumId < gAudioContext.soundFonts[fontId].numDrums; drumId++) { + drum = Audio_GetDrum(fontId, drumId); if (drum != NULL) { - func_800E0E0C(&sp78, drum->sound.sample); + AudioHeap_ChangeStorage(&change, drum->sound.sample); } } - for (sfxId = 0; sfxId < gAudioContext.ctlEntries[bankId].numSfx; sfxId++) { - sfx = Audio_GetSfx(bankId, sfxId); + for (sfxId = 0; sfxId < gAudioContext.soundFonts[fontId].numSfx; sfxId++) { + sfx = Audio_GetSfx(fontId, sfxId); if (sfx != NULL) { - func_800E0E0C(&sp78, sfx->sample); + AudioHeap_ChangeStorage(&change, sfx->sample); } } } } } -void func_800E1148(void) { - SoundMultiPool* pool; - PersistentPool* persistent; - TemporaryPool* temporary; +void AudioHeap_DiscardSampleBanks(void) { + AudioCache* pool; + AudioPersistentCache* persistent; + AudioTemporaryCache* temporary; u32 i; - pool = &gAudioContext.unusedLoadedPool; + pool = &gAudioContext.sampleBankCache; temporary = &pool->temporary; if (temporary->entries[0].id != -1) { - func_800E0E6C(temporary->entries[0].id); + AudioHeap_DiscardSampleBank(temporary->entries[0].id); } if (temporary->entries[1].id != -1) { - func_800E0E6C(temporary->entries[1].id); + AudioHeap_DiscardSampleBank(temporary->entries[1].id); } persistent = &pool->persistent; for (i = 0; i < persistent->numEntries; i++) { - func_800E0E6C(persistent->entries[i].id); + AudioHeap_DiscardSampleBank(persistent->entries[i].id); } } diff --git a/src/code/audio_rodata.c b/src/code/audio_init_params.c similarity index 69% rename from src/code/audio_rodata.c rename to src/code/audio_init_params.c index 469c5fc357..f7528deed0 100644 --- a/src/code/audio_rodata.c +++ b/src/code/audio_init_params.c @@ -1,7 +1,7 @@ #include "global.h" const s16 D_8014A6C0[] = { - 0x1C00, - 0x0030, + 0x1C00, // unused + 0x0030, // gTatumsPerBeat }; const AudioContextInitSizes D_8014A6C4 = { 0x37F00, 0xE0E0, 0xBCE0 }; diff --git a/src/code/audio_load.c b/src/code/audio_load.c index 1146c3a1ca..291ee56709 100644 --- a/src/code/audio_load.c +++ b/src/code/audio_load.c @@ -1,95 +1,121 @@ #include "ultra64.h" #include "global.h" -typedef enum { LOAD_STATUS_WAITING, LOAD_STATUS_START, LOAD_STATUS_LOADING, LOAD_STATUS_DONE } SyncLoadStatus; +#define MK_ASYNC_MSG(retData, tableType, id, status) (((retData) << 24) | ((tableType) << 16) | ((id) << 8) | (status)) +#define ASYNC_TBLTYPE(v) ((u8)(v >> 16)) +#define ASYNC_ID(v) ((u8)(v >> 8)) +#define ASYNC_STATUS(v) ((u8)(v >> 0)) -// opaque type for unpatched audio bank data (should maybe get rid of this?) -typedef void AudioBankData; +typedef enum { + /* 0 */ LOAD_STATUS_WAITING, + /* 1 */ LOAD_STATUS_START, + /* 2 */ LOAD_STATUS_LOADING, + /* 3 */ LOAD_STATUS_DONE +} SlowLoadStatus; + +typedef struct { + /* 0x00 */ s32 sampleBankId1; + /* 0x04 */ s32 sampleBankId2; + /* 0x08 */ s32 baseAddr1; + /* 0x0C */ s32 baseAddr2; + /* 0x10 */ u32 medium1; + /* 0x14 */ u32 medium2; +} RelocInfo; // size = 0x18 + +// opaque type for unpatched sound font data (should maybe get rid of this?) +typedef void SoundFontData; /* forward declarations */ -s32 func_800E217C(s32 playerIndex, s32, s32); -AudioBankData* func_800E2454(u32 bankId); -AudioBankSample* Audio_GetBankSample(s32 bankId, s32 sfxId); -void Audio_ProcessAsyncLoads(s32 arg0); -void Audio_HandleAsyncMsg(AsyncLoadReq* arg0, s32 arg1); -void Audio_UpdateAsyncReq(AsyncLoadReq* arg0, s32 arg1); -void func_800E4198(s32, AudioBankData*, RelocInfo*, s32); -void Audio_SampleReloc(AudioBankSound* sound, u32, RelocInfo*); -void func_800E202C(s32 arg0); -u32 func_800E2338(u32 arg0, u32* arg1, s32 arg2); -void* func_800E2558(u32 tableType, u32 tableIdx, s32* didAllocate); -u32 Audio_GetTableIndex(s32 tableType, u32 tableIdx); -void* func_800E27A4(s32 tableType, s32 id); -void* Audio_GetLoadTable(s32 tableType); -void Audio_DMAFastCopy(u32 devAddr, u8* addr, u32 size, s32 handleType); -void Audio_NoopCopy(u32 devAddr, u8* addr, u32 size, s32 handleType); -s32 Audio_DMA(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size, OSMesgQueue* reqQueue, - s32 handleType, const char* dmaFuncType); -void* Audio_AsyncLoadInner(s32 tableType, s32 arg1, s32 arg2, s32 arg3, OSMesgQueue* retQueue); -AsyncLoadReq* func_800E3A44(s32 arg0, u32 devAddr, void* ramAddr, s32 size, s32 arg4, s32 nChunks, - OSMesgQueue* retQueue, s32 retMsg); -AsyncLoadReq* Audio_InitAsyncReq(u32 devAddr, void* ramAddr, u32 size, s32 arg3, s32 nChunks, OSMesgQueue* retQueue, - s32 retMsg); -void func_800E3FB4(AsyncLoadReq* req, u32 size); -void func_800E4044(u32 devAddr, void* ramAddr, u32 size, s16 arg3); -u8* func_800E22C4(s32 seqId); -s32 func_800E4590(s32 resetStatus); -void func_800E3874(AudioSyncLoad* arg0, s32 size); -void Audio_ProcessSyncLoads(s32 resetStatus); -void func_800E38F8(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 skipTicks); +SoundFontData* AudioLoad_SyncLoadFont(u32 fontId); +SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId); +void AudioLoad_ProcessAsyncLoads(s32 resetStatus); +void AudioLoad_ProcessAsyncLoadUnkMedium(AudioAsyncLoad* asyncLoad, s32 resetStatus); +void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus); +void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo, s32 temporary); +void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo); +void AudioLoad_DiscardFont(s32 fontId); +u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad); +void* AudioLoad_SyncLoad(u32 tableType, u32 tableId, s32* didAllocate); +u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 tableId); +void* AudioLoad_SearchCaches(s32 tableType, s32 id); +AudioTable* AudioLoad_GetLoadTable(s32 tableType); +void AudioLoad_SyncDma(u32 devAddr, u8* addr, u32 size, s32 medium); +void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* addr, u32 size, s32 unkMediumParam); +s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size, + OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType); +void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue); +AudioAsyncLoad* AudioLoad_StartAsyncLoadUnkMedium(s32 unkMediumParam, u32 devAddr, void* ramAddr, s32 size, s32 medium, + s32 nChunks, OSMesgQueue* retQueue, s32 retMsg); +AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, void* ramAddr, u32 size, s32 medium, s32 nChunks, + OSMesgQueue* retQueue, s32 retMsg); +void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size); +void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, void* ramAddr, u32 size, s16 arg3); +u8* AudioLoad_SyncLoadSeq(s32 seqId); +s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus); +void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size); +void AudioLoad_ProcessSlowLoads(s32 resetStatus); +void AudioLoad_DmaSlowCopyUnkMedium(s32 devAddr, u8* ramAddr, s32 size, s32 arg3); + +OSMesgQueue sScriptLoadQueue; +OSMesg sScriptLoadMesgBuf[0x10]; +s8* sScriptLoadDonePointers[0x10]; +s32 sAudioLoadPad1[2]; // file padding -OSMesgQueue D_8016B6E0; -OSMesg D_8016B6F8[0x10]; -s8* D_8016B738[0x12]; s32 D_8016B780; -s32 sAudioLoadPad[4]; +s32 sAudioLoadPad2[4]; // double file padding? -void func_800E11F0(void) { +DmaHandler sDmaHandler = osEPiStartDma; +void* sUnusedHandler = NULL; + +s32 gAudioContextInitalized = false; + +void AudioLoad_DecreaseSampleDmaTtls(void) { u32 i; for (i = 0; i < gAudioContext.sampleDmaListSize1; i++) { - SampleDmaReq* req = &gAudioContext.sampleDmaReqs[i]; + SampleDma* dma = &gAudioContext.sampleDmas[i]; - if (req->ttl != 0) { - req->ttl--; - if (req->ttl == 0) { - req->reuseIndex = gAudioContext.sampleDmaReuseQueue1WrPos; + if (dma->ttl != 0) { + dma->ttl--; + if (dma->ttl == 0) { + dma->reuseIndex = gAudioContext.sampleDmaReuseQueue1WrPos; gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1WrPos] = i; gAudioContext.sampleDmaReuseQueue1WrPos++; } } } - for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaReqCnt; i++) { - SampleDmaReq* req = &gAudioContext.sampleDmaReqs[i]; + for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaCount; i++) { + SampleDma* dma = &gAudioContext.sampleDmas[i]; - if (req->ttl != 0) { - req->ttl--; - if (req->ttl == 0) { - req->reuseIndex = gAudioContext.sampleDmaReuseQueue2WrPos; + if (dma->ttl != 0) { + dma->ttl--; + if (dma->ttl == 0) { + dma->reuseIndex = gAudioContext.sampleDmaReuseQueue2WrPos; gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2WrPos] = i; gAudioContext.sampleDmaReuseQueue2WrPos++; } } } - gAudioContext.unk_2628 = 0; + gAudioContext.unused2628 = 0; } -void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 medium) { - s32 sp60; - SampleDmaReq* dma; +void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 medium) { + s32 pad1; + SampleDma* dma; s32 hasDma = false; u32 dmaDevAddr; - u32 pad; + u32 pad2; u32 dmaIndex; u32 transfer; s32 bufferPos; u32 i; if (arg2 != 0 || *dmaIndexRef >= gAudioContext.sampleDmaListSize1) { - for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaReqCnt; i++) { - dma = &gAudioContext.sampleDmaReqs[i]; + for (i = gAudioContext.sampleDmaListSize1; i < gAudioContext.sampleDmaCount; i++) { + dma = &gAudioContext.sampleDmas[i]; bufferPos = devAddr - dma->devAddr; if (0 <= bufferPos && (u32)bufferPos <= dma->size - size) { // We already have a DMA request for this memory range. @@ -101,7 +127,7 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 gAudioContext.sampleDmaReuseQueue2[dma->reuseIndex] = gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos]; gAudioContext - .sampleDmaReqs[gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos]] + .sampleDmas[gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos]] .reuseIndex = dma->reuseIndex; } gAudioContext.sampleDmaReuseQueue2RdPos++; @@ -120,12 +146,12 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 // Allocate a DMA from reuse queue 2, unless full. dmaIndex = gAudioContext.sampleDmaReuseQueue2[gAudioContext.sampleDmaReuseQueue2RdPos]; gAudioContext.sampleDmaReuseQueue2RdPos++; - dma = gAudioContext.sampleDmaReqs + dmaIndex; + dma = gAudioContext.sampleDmas + dmaIndex; hasDma = true; } } else { search_short_lived: - dma = gAudioContext.sampleDmaReqs + *dmaIndexRef; + dma = gAudioContext.sampleDmas + *dmaIndexRef; i = 0; again: bufferPos = devAddr - dma->devAddr; @@ -138,7 +164,7 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 gAudioContext.sampleDmaReuseQueue1[dma->reuseIndex] = gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos]; gAudioContext - .sampleDmaReqs[gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos]] + .sampleDmas[gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos]] .reuseIndex = dma->reuseIndex; } gAudioContext.sampleDmaReuseQueue1RdPos++; @@ -146,7 +172,7 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 dma->ttl = 2; return dma->ramAddr + (devAddr - dma->devAddr); } - dma = gAudioContext.sampleDmaReqs + i++; + dma = gAudioContext.sampleDmas + i++; if (i <= gAudioContext.sampleDmaListSize1) { goto again; } @@ -158,7 +184,7 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 } // Allocate a DMA from reuse queue 1. dmaIndex = gAudioContext.sampleDmaReuseQueue1[gAudioContext.sampleDmaReuseQueue1RdPos++]; - dma = gAudioContext.sampleDmaReqs + dmaIndex; + dma = gAudioContext.sampleDmas + dmaIndex; hasDma = true; } @@ -167,504 +193,516 @@ void* Audio_DmaSampleData(u32 devAddr, u32 size, s32 arg2, u8* dmaIndexRef, s32 dma->ttl = 3; dma->devAddr = dmaDevAddr; dma->sizeUnused = transfer; - Audio_DMA(&gAudioContext.currAudioFrameDmaIoMesgBufs[gAudioContext.curAudioFrameDmaCount++], OS_MESG_PRI_NORMAL, - OS_READ, dmaDevAddr, dma->ramAddr, transfer, &gAudioContext.currAudioFrameDmaQueue, medium, "SUPERDMA"); + AudioLoad_Dma(&gAudioContext.currAudioFrameDmaIoMesgBuf[gAudioContext.curAudioFrameDmaCount++], OS_MESG_PRI_NORMAL, + OS_READ, dmaDevAddr, dma->ramAddr, transfer, &gAudioContext.currAudioFrameDmaQueue, medium, + "SUPERDMA"); *dmaIndexRef = dmaIndex; return (devAddr - dmaDevAddr) + dma->ramAddr; } -void func_800E1618(s32 arg0) { - SampleDmaReq* temp_s0; +void AudioLoad_InitSampleDmaBuffers(s32 arg0) { + SampleDma* dma; s32 i; s32 t2; s32 j; - gAudioContext.unk_288C = gAudioContext.unk_2874; - gAudioContext.sampleDmaReqs = - Audio_Alloc(&gAudioContext.notesAndBuffersPool, 4 * gAudioContext.maxSimultaneousNotes * sizeof(SampleDmaReq) * - gAudioContext.audioBufferParameters.specUnk4); - t2 = 3 * gAudioContext.maxSimultaneousNotes * gAudioContext.audioBufferParameters.specUnk4; + gAudioContext.sampleDmaBufSize = gAudioContext.sampleDmaBufSize1; + gAudioContext.sampleDmas = + AudioHeap_Alloc(&gAudioContext.notesAndBuffersPool, + 4 * gAudioContext.numNotes * sizeof(SampleDma) * gAudioContext.audioBufferParameters.specUnk4); + t2 = 3 * gAudioContext.numNotes * gAudioContext.audioBufferParameters.specUnk4; for (i = 0; i < t2; i++) { - temp_s0 = &gAudioContext.sampleDmaReqs[gAudioContext.sampleDmaReqCnt]; - temp_s0->ramAddr = func_800DE2B0(&gAudioContext.notesAndBuffersPool, gAudioContext.unk_288C); - if (temp_s0->ramAddr == NULL) { + dma = &gAudioContext.sampleDmas[gAudioContext.sampleDmaCount]; + dma->ramAddr = AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, gAudioContext.sampleDmaBufSize); + if (dma->ramAddr == NULL) { break; } else { - func_800DE238(temp_s0->ramAddr, gAudioContext.unk_288C); - temp_s0->size = gAudioContext.unk_288C; - temp_s0->devAddr = 0; - temp_s0->sizeUnused = 0; - temp_s0->unused = 0; - temp_s0->ttl = 0; - gAudioContext.sampleDmaReqCnt++; + AudioHeap_WritebackDCache(dma->ramAddr, gAudioContext.sampleDmaBufSize); + dma->size = gAudioContext.sampleDmaBufSize; + dma->devAddr = 0; + dma->sizeUnused = 0; + dma->unused = 0; + dma->ttl = 0; + gAudioContext.sampleDmaCount++; } } - for (i = 0; (u32)i < gAudioContext.sampleDmaReqCnt; i++) { + for (i = 0; (u32)i < gAudioContext.sampleDmaCount; i++) { gAudioContext.sampleDmaReuseQueue1[i] = i; - gAudioContext.sampleDmaReqs[i].reuseIndex = i; + gAudioContext.sampleDmas[i].reuseIndex = i; } - for (i = gAudioContext.sampleDmaReqCnt; i < 0x100; i++) { + for (i = gAudioContext.sampleDmaCount; i < 0x100; i++) { gAudioContext.sampleDmaReuseQueue1[i] = 0; } gAudioContext.sampleDmaReuseQueue1RdPos = 0; - gAudioContext.sampleDmaReuseQueue1WrPos = gAudioContext.sampleDmaReqCnt; - gAudioContext.sampleDmaListSize1 = gAudioContext.sampleDmaReqCnt; - gAudioContext.unk_288C = gAudioContext.unk_2878; + gAudioContext.sampleDmaReuseQueue1WrPos = gAudioContext.sampleDmaCount; + gAudioContext.sampleDmaListSize1 = gAudioContext.sampleDmaCount; + gAudioContext.sampleDmaBufSize = gAudioContext.sampleDmaBufSize2; - for (j = 0; j < gAudioContext.maxSimultaneousNotes; j++) { - temp_s0 = &gAudioContext.sampleDmaReqs[gAudioContext.sampleDmaReqCnt]; - temp_s0->ramAddr = func_800DE2B0(&gAudioContext.notesAndBuffersPool, gAudioContext.unk_288C); - if (temp_s0->ramAddr == NULL) { + for (j = 0; j < gAudioContext.numNotes; j++) { + dma = &gAudioContext.sampleDmas[gAudioContext.sampleDmaCount]; + dma->ramAddr = AudioHeap_AllocAttemptExternal(&gAudioContext.notesAndBuffersPool, gAudioContext.sampleDmaBufSize); + if (dma->ramAddr == NULL) { break; } else { - func_800DE238(temp_s0->ramAddr, gAudioContext.unk_288C); - temp_s0->size = gAudioContext.unk_288C; - temp_s0->devAddr = 0U; - temp_s0->sizeUnused = 0; - temp_s0->unused = 0; - temp_s0->ttl = 0; - gAudioContext.sampleDmaReqCnt++; + AudioHeap_WritebackDCache(dma->ramAddr, gAudioContext.sampleDmaBufSize); + dma->size = gAudioContext.sampleDmaBufSize; + dma->devAddr = 0U; + dma->sizeUnused = 0; + dma->unused = 0; + dma->ttl = 0; + gAudioContext.sampleDmaCount++; } } - for (i = gAudioContext.sampleDmaListSize1; (u32)i < gAudioContext.sampleDmaReqCnt; i++) { + for (i = gAudioContext.sampleDmaListSize1; (u32)i < gAudioContext.sampleDmaCount; i++) { gAudioContext.sampleDmaReuseQueue2[i - gAudioContext.sampleDmaListSize1] = i; - gAudioContext.sampleDmaReqs[i].reuseIndex = i - gAudioContext.sampleDmaListSize1; + gAudioContext.sampleDmas[i].reuseIndex = i - gAudioContext.sampleDmaListSize1; } - for (i = gAudioContext.sampleDmaReqCnt; i < 0x100; i++) { + for (i = gAudioContext.sampleDmaCount; i < 0x100; i++) { gAudioContext.sampleDmaReuseQueue2[i] = gAudioContext.sampleDmaListSize1; } gAudioContext.sampleDmaReuseQueue2RdPos = 0; - gAudioContext.sampleDmaReuseQueue2WrPos = gAudioContext.sampleDmaReqCnt - gAudioContext.sampleDmaListSize1; + gAudioContext.sampleDmaReuseQueue2WrPos = gAudioContext.sampleDmaCount - gAudioContext.sampleDmaListSize1; } -s32 Audio_IsBankLoadComplete(s32 bankId) { - if (bankId == 0xFF) { +s32 AudioLoad_IsFontLoadComplete(s32 fontId) { + if (fontId == 0xFF) { return true; - } else if (gAudioContext.bankLoadStatus[bankId] >= 2) { + } else if (gAudioContext.fontLoadStatus[fontId] >= 2) { return true; - } else if (gAudioContext.bankLoadStatus[Audio_GetTableIndex(BANK_TABLE, bankId)] >= 2) { + } else if (gAudioContext.fontLoadStatus[AudioLoad_GetRealTableIndex(FONT_TABLE, fontId)] >= 2) { return true; } else { return false; } } -s32 Audio_IsSeqLoadComplete(s32 seqId) { +s32 AudioLoad_IsSeqLoadComplete(s32 seqId) { if (seqId == 0xFF) { return true; } else if (gAudioContext.seqLoadStatus[seqId] >= 2) { return true; - } else if (gAudioContext.seqLoadStatus[Audio_GetTableIndex(SEQUENCE_TABLE, seqId)] >= 2) { + } else if (gAudioContext.seqLoadStatus[AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId)] >= 2) { return true; } else { return false; } } -s32 Audio_IsAudTabLoadComplete(s32 tabId) { - if (tabId == 0xFF) { +s32 AudioLoad_IsSampleLoadComplete(s32 sampleBankId) { + if (sampleBankId == 0xFF) { return true; - } else if (gAudioContext.audioTableLoadStatus[tabId] >= 2) { + } else if (gAudioContext.sampleFontLoadStatus[sampleBankId] >= 2) { return true; - } else if (gAudioContext.audioTableLoadStatus[Audio_GetTableIndex(AUDIO_TABLE, tabId)] >= 2) { + } else if (gAudioContext.sampleFontLoadStatus[AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankId)] >= 2) { return true; } else { return false; } } -void Audio_SetBankLoadStatus(s32 bankId, s32 status) { - if ((bankId != 0xFF) && (gAudioContext.bankLoadStatus[bankId] != 5)) { - gAudioContext.bankLoadStatus[bankId] = status; +void AudioLoad_SetFontLoadStatus(s32 fontId, s32 status) { + if ((fontId != 0xFF) && (gAudioContext.fontLoadStatus[fontId] != 5)) { + gAudioContext.fontLoadStatus[fontId] = status; } } -void Audio_SetSeqLoadStatus(s32 seqId, s32 status) { +void AudioLoad_SetSeqLoadStatus(s32 seqId, s32 status) { if ((seqId != 0xFF) && (gAudioContext.seqLoadStatus[seqId] != 5)) { gAudioContext.seqLoadStatus[seqId] = status; } } -void func_800E1A78(s32 arg0, s32 arg1) { - if (arg0 != 0xFF) { - if (gAudioContext.audioTableLoadStatus[arg0] != 5) { - gAudioContext.audioTableLoadStatus[arg0] = arg1; +void AudioLoad_SetSampleFontLoadStatusAndApplyCaches(s32 sampleBankId, s32 status) { + if (sampleBankId != 0xFF) { + if (gAudioContext.sampleFontLoadStatus[sampleBankId] != 5) { + gAudioContext.sampleFontLoadStatus[sampleBankId] = status; } - if ((gAudioContext.audioTableLoadStatus[arg0] == 5) || (gAudioContext.audioTableLoadStatus[arg0] == 2)) { - func_800E0E90(arg0); + if ((gAudioContext.sampleFontLoadStatus[sampleBankId] == 5) || + (gAudioContext.sampleFontLoadStatus[sampleBankId] == 2)) { + AudioHeap_ApplySampleBankCache(sampleBankId); } } } -void Audio_SetAudtabLoadStatus(s32 tabId, s32 status) { - if ((tabId != 0xFF) && (gAudioContext.audioTableLoadStatus[tabId] != 5)) { - gAudioContext.audioTableLoadStatus[tabId] = status; +void AudioLoad_SetSampleFontLoadStatus(s32 sampleBankId, s32 status) { + if ((sampleBankId != 0xFF) && (gAudioContext.sampleFontLoadStatus[sampleBankId] != 5)) { + gAudioContext.sampleFontLoadStatus[sampleBankId] = status; } } -void Audio_InitAudioTable(AudioTable* table, u32 romAddr, u16 arg2) { +void AudioLoad_InitTable(AudioTable* table, u32 romAddr, u16 unkMediumParam) { s32 i; - table->header.unk_02 = arg2; - table->header.romAddr = romAddr; + table->unkMediumParam = unkMediumParam; + table->romAddr = romAddr; - for (i = 0; i < table->header.entryCnt; i++) { - if ((table->entries[i].size != 0) && (table->entries[i].unk_08 == 2)) { + for (i = 0; i < table->numEntries; i++) { + if ((table->entries[i].size != 0) && (table->entries[i].medium == MEDIUM_CART)) { table->entries[i].romAddr += romAddr; } } } -AudioBankData* func_800E1B68(s32 arg0, u32* arg1) { +SoundFontData* AudioLoad_SyncLoadSeqFonts(s32 seqId, u32* outDefaultFontId) { char pad[0x8]; - s32 phi_s0; - AudioBankData* sp28; - s32 phi_s1; - s32 phi_s2; + s32 index; + SoundFontData* font; + s32 numFonts; + s32 fontId; s32 i; - if (arg0 >= gAudioContext.seqTabEntCnt) { - return 0; + if (seqId >= gAudioContext.numSequences) { + return NULL; } - phi_s2 = 0xFF; - phi_s0 = gAudioContext.unk_283C[arg0]; // ofset into unk_283C for cnt? - phi_s1 = *(phi_s0 + gAudioContext.unk_283Cb); - phi_s0++; + fontId = 0xFF; + index = ((u16*)gAudioContext.sequenceFontTable)[seqId]; + numFonts = gAudioContext.sequenceFontTable[index++]; - while (phi_s1 > 0) { - phi_s2 = gAudioContext.unk_283Cb[phi_s0++]; - sp28 = func_800E2454(phi_s2); - phi_s1--; + while (numFonts > 0) { + fontId = gAudioContext.sequenceFontTable[index++]; + font = AudioLoad_SyncLoadFont(fontId); + numFonts--; } - *arg1 = phi_s2; - return sp28; + *outDefaultFontId = fontId; + return font; } -void func_800E1C18(s32 channelIdx, s32 arg1) { +void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1) { s32 pad; - u32 sp18; + u32 defaultFontId; - if (channelIdx < gAudioContext.seqTabEntCnt) { + if (seqId < gAudioContext.numSequences) { if (arg1 & 2) { - func_800E1B68(channelIdx, &sp18); + AudioLoad_SyncLoadSeqFonts(seqId, &defaultFontId); } if (arg1 & 1) { - func_800E22C4(channelIdx); + AudioLoad_SyncLoadSeq(seqId); } } } -s32 func_800E1C78(AudioBankSample* sample, s32 arg1) { +s32 AudioLoad_SyncLoadSample(SoundFontSample* sample, s32 fontId) { void* sampleAddr; - if (sample->unk_bits25 == 1) { - if (sample->medium != 0) { - sampleAddr = func_800E05C4(sample->size, arg1, (void*)sample->sampleAddr, sample->medium, 1); + if (sample->unk_bit25 == 1) { + if (sample->medium != MEDIUM_RAM) { + sampleAddr = AudioHeap_AllocSampleCache(sample->size, fontId, (void*)sample->sampleAddr, sample->medium, + CACHE_PERSISTENT); if (sampleAddr == NULL) { return -1; } - if (sample->medium == 1) { - Audio_NoopCopy(sample->sampleAddr, sampleAddr, sample->size, gAudioContext.audioTable->header.unk_02); + if (sample->medium == MEDIUM_UNK) { + AudioLoad_SyncDmaUnkMedium(sample->sampleAddr, sampleAddr, sample->size, + gAudioContext.sampleBankTable->unkMediumParam); } else { - Audio_DMAFastCopy(sample->sampleAddr, sampleAddr, sample->size, sample->medium); + AudioLoad_SyncDma(sample->sampleAddr, sampleAddr, sample->size, sample->medium); } - sample->medium = 0; + sample->medium = MEDIUM_RAM; sample->sampleAddr = sampleAddr; } } } -s32 func_800E1D64(s32 arg0, s32 arg1, s32 arg2) { - if (arg1 < 0x7F) { - Instrument* instrument = Audio_GetInstrumentInner(arg0, arg1); +s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) { + if (instId < 0x7F) { + Instrument* instrument = Audio_GetInstrumentInner(fontId, instId); if (instrument == NULL) { return -1; } if (instrument->normalRangeLo != 0) { - func_800E1C78(instrument->lowNotesSound.sample, arg0); + AudioLoad_SyncLoadSample(instrument->lowNotesSound.sample, fontId); } - func_800E1C78(instrument->normalNotesSound.sample, arg0); + AudioLoad_SyncLoadSample(instrument->normalNotesSound.sample, fontId); if (instrument->normalRangeHi != 0x7F) { - return func_800E1C78(instrument->highNotesSound.sample, arg0); + return AudioLoad_SyncLoadSample(instrument->highNotesSound.sample, fontId); } - } else if (arg1 == 0x7F) { - Drum* drum = Audio_GetDrum(arg0, arg2); + } else if (instId == 0x7F) { + Drum* drum = Audio_GetDrum(fontId, drumId); if (drum == NULL) { return -1; } - func_800E1C78(drum->sound.sample, arg0); + AudioLoad_SyncLoadSample(drum->sound.sample, fontId); return 0; } } -void Audio_AsyncLoad(s32 tableType, s32 arg1, s32 arg2, s32 arg3, OSMesgQueue* queue) { - if (Audio_AsyncLoadInner(tableType, arg1, arg2, arg3, queue) == NULL) { - osSendMesg(queue, -1, OS_MESG_NOBLOCK); +void AudioLoad_AsyncLoad(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) { + if (AudioLoad_AsyncLoadInner(tableType, id, nChunks, retData, retQueue) == NULL) { + osSendMesg(retQueue, 0xFFFFFFFF, OS_MESG_NOBLOCK); } } -void Audio_AudioSeqAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* queue) { - Audio_AsyncLoad(SEQUENCE_TABLE, arg0, 0, arg2, queue); +void AudioLoad_AsyncLoadSeq(s32 seqId, s32 arg1, s32 retData, OSMesgQueue* retQueue) { + AudioLoad_AsyncLoad(SEQUENCE_TABLE, seqId, 0, retData, retQueue); } -void Audio_AudioTableAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* queue) { - Audio_AsyncLoad(AUDIO_TABLE, arg0, 0, arg2, queue); +void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 arg1, s32 retData, OSMesgQueue* retQueue) { + AudioLoad_AsyncLoad(SAMPLE_TABLE, sampleBankId, 0, retData, retQueue); } -void Audio_AudioBankAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* queue) { - Audio_AsyncLoad(BANK_TABLE, arg0, 0, arg2, queue); +void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* retQueue) { + AudioLoad_AsyncLoad(FONT_TABLE, fontId, 0, retData, retQueue); } -u8* func_800E1F38(s32 arg0, u32* arg1) { - s32 temp_v1; +u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) { + s32 index; - temp_v1 = gAudioContext.unk_283C[arg0]; + index = ((u16*)gAudioContext.sequenceFontTable)[seqId]; - *arg1 = *(temp_v1 + gAudioContext.unk_283Cb); - temp_v1++; - if (*arg1 == 0) { + *outNumFonts = gAudioContext.sequenceFontTable[index++]; + if (*outNumFonts == 0) { return NULL; } - return &gAudioContext.unk_283Cb[temp_v1]; + return &gAudioContext.sequenceFontTable[index]; } -void func_800E1F7C(s32 arg0) { - s32 temp_s0; - s32 phi_s1; - s32 phi_s2; +void AudioLoad_DiscardSeqFonts(s32 seqId) { + s32 fontId; + s32 index; + s32 numFonts; - phi_s1 = gAudioContext.unk_283C[arg0]; - phi_s2 = *(phi_s1 + gAudioContext.unk_283Cb); - phi_s1++; + index = ((u16*)gAudioContext.sequenceFontTable)[seqId]; + numFonts = gAudioContext.sequenceFontTable[index++]; - while (phi_s2 > 0) { - phi_s2--; - temp_s0 = Audio_GetTableIndex(BANK_TABLE, gAudioContext.unk_283Cb[phi_s1++]); - if (func_800E04E8(BANK_TABLE, temp_s0) == NULL) { - func_800E202C(temp_s0); - Audio_SetBankLoadStatus(temp_s0, 0); + while (numFonts > 0) { + numFonts--; + fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.sequenceFontTable[index++]); + if (AudioHeap_SearchPermanentCache(FONT_TABLE, fontId) == NULL) { + AudioLoad_DiscardFont(fontId); + AudioLoad_SetFontLoadStatus(fontId, 0); } } } -void func_800E202C(s32 arg0) { +void AudioLoad_DiscardFont(s32 fontId) { u32 i; - SoundMultiPool* pool = &gAudioContext.bankLoadedPool; - PersistentPool* persistent; + AudioCache* pool = &gAudioContext.fontCache; + AudioPersistentCache* persistent; - if (arg0 == pool->temporary.entries[0].id) { + if (fontId == pool->temporary.entries[0].id) { pool->temporary.entries[0].id = -1; - } else if (arg0 == pool->temporary.entries[1].id) { + } else if (fontId == pool->temporary.entries[1].id) { pool->temporary.entries[1].id = -1; } persistent = &pool->persistent; for (i = 0; i < persistent->numEntries; i++) { - if (arg0 == persistent->entries[i].id) { + if (fontId == persistent->entries[i].id) { persistent->entries[i].id = -1; } } - Audio_DiscardBank(arg0); + AudioHeap_DiscardFont(fontId); } -s32 func_800E20D4(s32 playerIndex, s32 seqId, s32 arg2) { - if (gAudioContext.resetTimer != 0) { - return 0; - } else { - gAudioContext.seqPlayers[playerIndex].unk_DC = 0; - return func_800E217C(playerIndex, seqId, arg2); - } -} - -s32 func_800E2124(s32 playerIndex, s32 seqId, s32 arg2) { +s32 AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2) { if (gAudioContext.resetTimer != 0) { return 0; } - gAudioContext.seqPlayers[playerIndex].unk_DC = arg2; - return func_800E217C(playerIndex, seqId, 0); + gAudioContext.seqPlayers[playerIdx].skipTicks = 0; + AudioLoad_SyncInitSeqPlayerInternal(playerIdx, seqId, arg2); + // Intentionally missing return. Returning the result of the above function + // call matches but is UB because it too is missing a return, and using the + // result of a non-void function that has failed to return a value is UB. + // The callers of this function do not use the return value, so it's fine. } -// InitSeqPlayer -s32 func_800E217C(s32 playerIndex, s32 seqId, s32 arg2) { - SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIndex]; +s32 AudioLoad_SyncInitSeqPlayerSkipTicks(s32 playerIdx, s32 seqId, s32 skipTicks) { + if (gAudioContext.resetTimer != 0) { + return 0; + } + + gAudioContext.seqPlayers[playerIdx].skipTicks = skipTicks; + AudioLoad_SyncInitSeqPlayerInternal(playerIdx, seqId, 0); + // Missing return, see above. +} + +s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) { + SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIdx]; u8* seqData; - s32 phi_s0; - s32 phi_s1; - s32 phi_s2; + s32 index; + s32 numFonts; + s32 fontId; - if (seqId >= gAudioContext.seqTabEntCnt) { + if (seqId >= gAudioContext.numSequences) { return 0; } - Audio_SequencePlayerDisable(seqPlayer); + AudioSeq_SequencePlayerDisable(seqPlayer); - phi_s2 = 0xFF; - phi_s0 = gAudioContext.unk_283C[seqId]; - phi_s1 = gAudioContext.unk_283Cb[phi_s0++]; + fontId = 0xFF; + index = ((u16*)gAudioContext.sequenceFontTable)[seqId]; + numFonts = gAudioContext.sequenceFontTable[index++]; - while (phi_s1 > 0) { - phi_s2 = gAudioContext.unk_283Cb[phi_s0++]; - func_800E2454(phi_s2); - phi_s1--; + while (numFonts > 0) { + fontId = gAudioContext.sequenceFontTable[index++]; + AudioLoad_SyncLoadFont(fontId); + numFonts--; } - seqData = func_800E22C4(seqId); + seqData = AudioLoad_SyncLoadSeq(seqId); if (seqData == NULL) { return 0; } - Audio_ResetSequencePlayer(seqPlayer); + AudioSeq_ResetSequencePlayer(seqPlayer); seqPlayer->seqId = seqId; - seqPlayer->defaultBank = Audio_GetTableIndex(BANK_TABLE, phi_s2); + seqPlayer->defaultFont = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId); seqPlayer->seqData = seqData; seqPlayer->enabled = 1; seqPlayer->scriptState.pc = seqData; seqPlayer->scriptState.depth = 0; seqPlayer->delay = 0; seqPlayer->finished = 0; - seqPlayer->playerIndex = playerIndex; - Audio_ProcessSequence(seqPlayer); + seqPlayer->playerIdx = playerIdx; + AudioSeq_SkipForwardSequence(seqPlayer); + //! @bug missing return (but the return value is not used so it's not UB) } -// LoadSequence -u8* func_800E22C4(s32 seqId) { +u8* AudioLoad_SyncLoadSeq(s32 seqId) { s32 pad; - s32 sp20; + s32 didAllocate; - if (gAudioContext.seqLoadStatus[Audio_GetTableIndex(SEQUENCE_TABLE, seqId)] == 1) { + if (gAudioContext.seqLoadStatus[AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId)] == 1) { return NULL; } - return func_800E2558(SEQUENCE_TABLE, seqId, &sp20); + return AudioLoad_SyncLoad(SEQUENCE_TABLE, seqId, &didAllocate); } -u32 func_800E2318(u32 arg0, u32* arg1) { - return func_800E2338(arg0, arg1, 1); +u32 AudioLoad_GetSampleBank(u32 sampleBankId, u32* outMedium) { + return AudioLoad_TrySyncLoadSampleBank(sampleBankId, outMedium, true); } -u32 func_800E2338(u32 arg0, u32* arg1, s32 arg2) { - void* temp_v0; - AudioTable* audioTable; - u32 temp_s0 = Audio_GetTableIndex(AUDIO_TABLE, arg0); - s8 tmp; +u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad) { + void* ret; + AudioTable* sampleBankTable; + u32 realTableId = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankId); + s8 cachePolicy; - audioTable = Audio_GetLoadTable(AUDIO_TABLE); - if (temp_v0 = func_800E27A4(AUDIO_TABLE, temp_s0), temp_v0 != NULL) { - if (gAudioContext.audioTableLoadStatus[temp_s0] != 1) { - Audio_SetAudtabLoadStatus(temp_s0, 2); + sampleBankTable = AudioLoad_GetLoadTable(SAMPLE_TABLE); + ret = AudioLoad_SearchCaches(SAMPLE_TABLE, realTableId); + if (ret != NULL) { + if (gAudioContext.sampleFontLoadStatus[realTableId] != 1) { + AudioLoad_SetSampleFontLoadStatus(realTableId, 2); } - *arg1 = 0; - return temp_v0; - } else if (tmp = audioTable->entries[arg0].unk_09, tmp == 4 || arg2 == 1) { - *arg1 = audioTable->entries[arg0].unk_08; - return audioTable->entries[temp_s0].romAddr; - } else if (temp_v0 = func_800E2558(AUDIO_TABLE, arg0, &arg2), temp_v0 != NULL) { - *arg1 = 0; - return temp_v0; - } else { - *arg1 = audioTable->entries[arg0].unk_08; - return audioTable->entries[temp_s0].romAddr; + *outMedium = MEDIUM_RAM; + return ret; } + + cachePolicy = sampleBankTable->entries[sampleBankId].cachePolicy; + if (cachePolicy == 4 || noLoad == true) { + *outMedium = sampleBankTable->entries[sampleBankId].medium; + return sampleBankTable->entries[realTableId].romAddr; + } + + ret = AudioLoad_SyncLoad(SAMPLE_TABLE, sampleBankId, &noLoad); + if (ret != NULL) { + *outMedium = MEDIUM_RAM; + return ret; + } + + *outMedium = sampleBankTable->entries[sampleBankId].medium; + return sampleBankTable->entries[realTableId].romAddr; } -AudioBankData* func_800E2454(u32 bankId) { - AudioBankData* temp_ret; - s32 unk02; - s32 unk03; - s32 sp38; +SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) { + SoundFontData* ret; + s32 sampleBankId1; + s32 sampleBankId2; + s32 didAllocate; RelocInfo relocInfo; - s32 idx = Audio_GetTableIndex(BANK_TABLE, bankId); + s32 realFontId = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId); - if (gAudioContext.bankLoadStatus[idx] == 1) { + if (gAudioContext.fontLoadStatus[realFontId] == 1) { return NULL; } - unk02 = gAudioContext.ctlEntries[idx].unk_02; - unk03 = gAudioContext.ctlEntries[idx].unk_03; + sampleBankId1 = gAudioContext.soundFonts[realFontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[realFontId].sampleBankId2; - relocInfo.index1 = unk02; - relocInfo.index2 = unk03; - if (relocInfo.index1 != 0xFF) { - relocInfo.baseAddr1 = func_800E2338(relocInfo.index1, &relocInfo.medium1, 0); + relocInfo.sampleBankId1 = sampleBankId1; + relocInfo.sampleBankId2 = sampleBankId2; + if (sampleBankId1 != 0xFF) { + relocInfo.baseAddr1 = AudioLoad_TrySyncLoadSampleBank(sampleBankId1, &relocInfo.medium1, false); } else { relocInfo.baseAddr1 = 0; } - if (unk03 != 0xFF) { - relocInfo.baseAddr2 = func_800E2338(unk03, &relocInfo.medium2, 0); + if (sampleBankId2 != 0xFF) { + relocInfo.baseAddr2 = AudioLoad_TrySyncLoadSampleBank(sampleBankId2, &relocInfo.medium2, false); } else { relocInfo.baseAddr2 = 0; } - temp_ret = func_800E2558(BANK_TABLE, bankId, &sp38); - if (temp_ret == NULL) { + ret = AudioLoad_SyncLoad(FONT_TABLE, fontId, &didAllocate); + if (ret == NULL) { return NULL; } - if (sp38 == 1) { - func_800E4198(idx, temp_ret, &relocInfo, 0); + if (didAllocate == true) { + AudioLoad_RelocateFontAndPreloadSamples(realFontId, ret, &relocInfo, false); } - return temp_ret; + return ret; } -void* func_800E2558(u32 tableType, u32 tableIdx, s32* didAllocate) { +void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { u32 size; AudioTable* table; s32 pad; - u32 sp40; + u32 medium; s32 status; u32 romAddr; - s32 sp24; + s32 cachePolicy; void* ret; - u32 id; + u32 realId; - id = Audio_GetTableIndex(tableType, tableIdx); - ret = func_800E27A4(tableType, id); + realId = AudioLoad_GetRealTableIndex(tableType, id); + ret = AudioLoad_SearchCaches(tableType, realId); if (ret != NULL) { *didAllocate = false; status = 2; } else { - table = Audio_GetLoadTable(tableType); - size = table->entries[id].size; + table = AudioLoad_GetLoadTable(tableType); + size = table->entries[realId].size; size = ALIGN16(size); - sp40 = table->entries[tableIdx].unk_08; - sp24 = table->entries[tableIdx].unk_09; - romAddr = table->entries[id].romAddr; - switch (sp24) { + medium = table->entries[id].medium; + cachePolicy = table->entries[id].cachePolicy; + romAddr = table->entries[realId].romAddr; + switch (cachePolicy) { case 0: - ret = func_800E0540(tableType, id, size); + ret = AudioHeap_AllocPermanent(tableType, realId, size); if (ret == NULL) { return ret; } break; case 1: - ret = Audio_AllocBankOrSeq(tableType, size, 1, id); + ret = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId); if (ret == NULL) { return ret; } break; case 2: - ret = Audio_AllocBankOrSeq(tableType, size, 0, id); + ret = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId); if (ret == NULL) { return ret; } break; case 3: case 4: - ret = Audio_AllocBankOrSeq(tableType, size, 2, id); + ret = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId); if (ret == NULL) { return ret; } @@ -672,24 +710,24 @@ void* func_800E2558(u32 tableType, u32 tableIdx, s32* didAllocate) { } *didAllocate = true; - if (sp40 == 1) { - Audio_NoopCopy(romAddr, ret, size, (s16)table->header.unk_02); + if (medium == MEDIUM_UNK) { + AudioLoad_SyncDmaUnkMedium(romAddr, ret, size, (s16)table->unkMediumParam); } else { - Audio_DMAFastCopy(romAddr, ret, size, sp40); + AudioLoad_SyncDma(romAddr, ret, size, medium); } - status = sp24 == 0 ? 5 : 2; + status = cachePolicy == 0 ? 5 : 2; } switch (tableType) { case SEQUENCE_TABLE: - Audio_SetSeqLoadStatus(id, status); + AudioLoad_SetSeqLoadStatus(realId, status); break; - case BANK_TABLE: - Audio_SetBankLoadStatus(id, status); + case FONT_TABLE: + AudioLoad_SetFontLoadStatus(realId, status); break; - case AUDIO_TABLE: - func_800E1A78(id, status); + case SAMPLE_TABLE: + AudioLoad_SetSampleFontLoadStatusAndApplyCaches(realId, status); break; default: break; @@ -698,25 +736,25 @@ void* func_800E2558(u32 tableType, u32 tableIdx, s32* didAllocate) { return ret; } -u32 Audio_GetTableIndex(s32 tableType, u32 tableIdx) { - AudioTable* table = Audio_GetLoadTable(tableType); +u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id) { + AudioTable* table = AudioLoad_GetLoadTable(tableType); - if (table->entries[tableIdx].size == 0) { - tableIdx = table->entries[tableIdx].romAddr; + if (table->entries[id].size == 0) { + id = table->entries[id].romAddr; } - return tableIdx; + return id; } -void* func_800E27A4(s32 tableType, s32 id) { +void* AudioLoad_SearchCaches(s32 tableType, s32 id) { void* ret; - ret = func_800E04E8(tableType, id); + ret = AudioHeap_SearchPermanentCache(tableType, id); if (ret != NULL) { return ret; } - ret = func_800DF074(tableType, 2, id); + ret = AudioHeap_SearchCaches(tableType, CACHE_EITHER, id); if (ret != NULL) { return ret; } @@ -724,53 +762,53 @@ void* func_800E27A4(s32 tableType, s32 id) { return NULL; } -void* Audio_GetLoadTable(s32 tableType) { - void* ret; +AudioTable* AudioLoad_GetLoadTable(s32 tableType) { + AudioTable* ret; switch (tableType) { case SEQUENCE_TABLE: ret = gAudioContext.sequenceTable; break; - case BANK_TABLE: - ret = gAudioContext.audioBankTable; + case FONT_TABLE: + ret = gAudioContext.soundFontTable; break; default: ret = NULL; break; - case AUDIO_TABLE: - ret = gAudioContext.audioTable; + case SAMPLE_TABLE: + ret = gAudioContext.sampleBankTable; break; } return ret; } -#define BASE_OFFSET(x, off) (void*)((u32)(x) + (u32)(off)) - -void func_800E283C(s32 bankId, AudioBankData* mem, RelocInfo* relocInfo) { +void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo) { u32 reloc; u32 reloc2; Instrument* inst; Drum* drum; - AudioBankSound* sfx; + SoundFontSound* sfx; s32 i; - s32 numDrums = gAudioContext.ctlEntries[bankId].numDrums; - s32 numInstruments = gAudioContext.ctlEntries[bankId].numInstruments; - s32 numSfx = gAudioContext.ctlEntries[bankId].numSfx; + s32 numDrums = gAudioContext.soundFonts[fontId].numDrums; + s32 numInstruments = gAudioContext.soundFonts[fontId].numInstruments; + s32 numSfx = gAudioContext.soundFonts[fontId].numSfx; void** ptrs = (void**)mem; +#define BASE_OFFSET(x) (void*)((u32)(x) + (u32)(mem)) + reloc2 = ptrs[0]; if (1) {} if ((reloc2 != 0) && (numDrums != 0)) { - ptrs[0] = BASE_OFFSET(reloc2, mem); + ptrs[0] = BASE_OFFSET(reloc2); for (i = 0; i < numDrums; i++) { reloc = ((Drum**)ptrs[0])[i]; if (reloc != 0) { - reloc = BASE_OFFSET(reloc, mem); + reloc = BASE_OFFSET(reloc); ((Drum**)ptrs[0])[i] = drum = reloc; if (!drum->loaded) { - Audio_SampleReloc(&drum->sound, mem, relocInfo); + AudioLoad_RelocateSample(&drum->sound, mem, relocInfo); reloc = drum->envelope; - drum->envelope = BASE_OFFSET(reloc, mem); + drum->envelope = BASE_OFFSET(reloc); drum->loaded = 1; } } @@ -780,13 +818,13 @@ void func_800E283C(s32 bankId, AudioBankData* mem, RelocInfo* relocInfo) { reloc2 = ptrs[1]; if (1) {} if ((reloc2 != 0) && (numSfx != 0)) { - ptrs[1] = BASE_OFFSET(reloc2, mem); + ptrs[1] = BASE_OFFSET(reloc2); for (i = 0; i < numSfx; i++) { - reloc = (AudioBankSound*)ptrs[1] + i; + reloc = (SoundFontSound*)ptrs[1] + i; if (reloc != 0) { sfx = reloc; if (sfx->sample != NULL) { - Audio_SampleReloc(sfx, mem, relocInfo); + AudioLoad_RelocateSample(sfx, mem, relocInfo); } } } @@ -798,34 +836,34 @@ void func_800E283C(s32 bankId, AudioBankData* mem, RelocInfo* relocInfo) { for (i = 2; i <= 2 + numInstruments - 1; i++) { if (ptrs[i] != NULL) { - ptrs[i] = BASE_OFFSET(ptrs[i], mem); + ptrs[i] = BASE_OFFSET(ptrs[i]); inst = ptrs[i]; if (!inst->loaded) { if (inst->normalRangeLo != 0) { - Audio_SampleReloc(&inst->lowNotesSound, mem, relocInfo); + AudioLoad_RelocateSample(&inst->lowNotesSound, mem, relocInfo); } - Audio_SampleReloc(&inst->normalNotesSound, mem, relocInfo); + AudioLoad_RelocateSample(&inst->normalNotesSound, mem, relocInfo); if (inst->normalRangeHi != 0x7F) { - Audio_SampleReloc(&inst->highNotesSound, mem, relocInfo); + AudioLoad_RelocateSample(&inst->highNotesSound, mem, relocInfo); } reloc = inst->envelope; - inst->envelope = BASE_OFFSET(reloc, mem); + inst->envelope = BASE_OFFSET(reloc); inst->loaded = 1; } } } - gAudioContext.ctlEntries[bankId].drums = ptrs[0]; - gAudioContext.ctlEntries[bankId].soundEffects = ptrs[1]; - gAudioContext.ctlEntries[bankId].instruments = (Instrument**)(ptrs + 2); -} - #undef BASE_OFFSET -void Audio_DMAFastCopy(u32 devAddr, u8* addr, u32 size, s32 handleType) { - OSMesgQueue* msgQueue = &gAudioContext.unk_25E8; - OSIoMesg* ioMesg = &gAudioContext.unk_2604; + gAudioContext.soundFonts[fontId].drums = ptrs[0]; + gAudioContext.soundFonts[fontId].soundEffects = ptrs[1]; + gAudioContext.soundFonts[fontId].instruments = (Instrument**)(ptrs + 2); +} + +void AudioLoad_SyncDma(u32 devAddr, u8* addr, u32 size, s32 medium) { + OSMesgQueue* msgQueue = &gAudioContext.syncDmaQueue; + OSIoMesg* ioMesg = &gAudioContext.syncDmaIoMesg; size = ALIGN16(size); Audio_osInvalDCache(addr, size); @@ -834,7 +872,7 @@ void Audio_DMAFastCopy(u32 devAddr, u8* addr, u32 size, s32 handleType) { if (size < 0x400) { break; } - Audio_DMA(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, 0x400, msgQueue, handleType, "FastCopy"); + AudioLoad_Dma(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, 0x400, msgQueue, medium, "FastCopy"); osRecvMesg(msgQueue, NULL, OS_MESG_BLOCK); size -= 0x400; devAddr += 0x400; @@ -842,30 +880,30 @@ void Audio_DMAFastCopy(u32 devAddr, u8* addr, u32 size, s32 handleType) { } if (size != 0) { - Audio_DMA(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, size, msgQueue, handleType, "FastCopy"); + AudioLoad_Dma(ioMesg, OS_MESG_PRI_HIGH, OS_READ, devAddr, addr, size, msgQueue, medium, "FastCopy"); osRecvMesg(msgQueue, NULL, OS_MESG_BLOCK); } } -void Audio_NoopCopy(u32 devAddr, u8* addr, u32 size, s32 handleType) { +void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* addr, u32 size, s32 unkMediumParam) { } -s32 (*sDmaHandler)(OSPiHandle* handle, OSIoMesg* mb, s32 direction) = osEPiStartDma; - -s32 Audio_DMA(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size, OSMesgQueue* reqQueue, - s32 handleType, const char* dmaFuncType) { +s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size, + OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType) { OSPiHandle* handle; if (gAudioContext.resetTimer > 0x10) { return -1; } - switch (handleType) { - case 2: + switch (medium) { + case MEDIUM_CART: handle = gAudioContext.cartHandle; break; - case 3: - handle = gAudioContext.unk_1E1C; + case MEDIUM_DISK_DRIVE: + // driveHandle is uninitialized and corresponds to stubbed-out disk drive support. + // SM64 Shindou called osDriveRomInit here. + handle = gAudioContext.driveHandle; break; default: return 0; @@ -885,145 +923,141 @@ s32 Audio_DMA(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ra return 0; } -void func_800E2CB8(void) { +void AudioLoad_Unused1(void) { } -void func_800E2CC0(u32 tableType, u32 bankId) { - s32 sp1C; +void AudioLoad_SyncLoadSimple(u32 tableType, u32 fontId) { + s32 didAllocate; - func_800E2558(tableType, bankId, &sp1C); + AudioLoad_SyncLoad(tableType, fontId, &didAllocate); } -void* Audio_AsyncLoadInner(s32 tableType, s32 arg1, s32 arg2, s32 arg3, OSMesgQueue* retQueue) { +void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) { u32 size; AudioTable* sp50; - void* sp4C; - s32 sp48; - s8 temp_a1; + void* ret; + s32 medium; + s8 cachePolicy; u32 devAddr; - s32 sp3C; + s32 status; u32 temp_v0; - u32 sp34; + u32 realId; - sp34 = Audio_GetTableIndex(tableType, arg1); + realId = AudioLoad_GetRealTableIndex(tableType, id); switch (tableType) { case SEQUENCE_TABLE: - if (gAudioContext.seqLoadStatus[sp34] == 1) { + if (gAudioContext.seqLoadStatus[realId] == 1) { return NULL; } break; - case BANK_TABLE: - if (gAudioContext.bankLoadStatus[sp34] == 1) { + case FONT_TABLE: + if (gAudioContext.fontLoadStatus[realId] == 1) { return NULL; } break; - case AUDIO_TABLE: - if (gAudioContext.audioTableLoadStatus[sp34] == 1) { + case SAMPLE_TABLE: + if (gAudioContext.sampleFontLoadStatus[realId] == 1) { return NULL; } break; } - sp4C = func_800E27A4(tableType, sp34); - if (sp4C != NULL) { - sp3C = 2; - osSendMesg(retQueue, arg3 << 0x18, 0); + ret = AudioLoad_SearchCaches(tableType, realId); + if (ret != NULL) { + status = 2; + osSendMesg(retQueue, MK_ASYNC_MSG(retData, 0, 0, 0), OS_MESG_NOBLOCK); } else { - sp50 = Audio_GetLoadTable(tableType); - size = sp50->entries[sp34].size; + sp50 = AudioLoad_GetLoadTable(tableType); + size = sp50->entries[realId].size; size = ALIGN16(size); - sp48 = sp50->entries[arg1].unk_08; - temp_a1 = sp50->entries[arg1].unk_09; - devAddr = sp50->entries[sp34].romAddr; - sp3C = 2; - switch (temp_a1) { + medium = sp50->entries[id].medium; + cachePolicy = sp50->entries[id].cachePolicy; + devAddr = sp50->entries[realId].romAddr; + status = 2; + switch (cachePolicy) { case 0: - sp4C = func_800E0540(tableType, sp34, size); - if (sp4C == NULL) { - return sp4C; + ret = AudioHeap_AllocPermanent(tableType, realId, size); + if (ret == NULL) { + return ret; } - sp3C = 5; + status = 5; break; case 1: - sp4C = Audio_AllocBankOrSeq(tableType, size, 1, sp34); - if (sp4C == NULL) { - return sp4C; + ret = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId); + if (ret == NULL) { + return ret; } break; case 2: - sp4C = Audio_AllocBankOrSeq(tableType, size, 0, sp34); - if (sp4C == NULL) { - return sp4C; + ret = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId); + if (ret == NULL) { + return ret; } break; case 3: case 4: - sp4C = Audio_AllocBankOrSeq(tableType, size, 2, sp34); - if (sp4C == NULL) { - return sp4C; + ret = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId); + if (ret == NULL) { + return ret; } break; } - if (sp48 == 1) { - func_800E3A44((s16)sp50->header.unk_02, devAddr, sp4C, size, sp48, arg2, retQueue, - (arg3 << 0x18) | (tableType << 0x10) | (arg1 << 8) | sp3C); + if (medium == MEDIUM_UNK) { + AudioLoad_StartAsyncLoadUnkMedium((s16)sp50->unkMediumParam, devAddr, ret, size, medium, nChunks, retQueue, + MK_ASYNC_MSG(retData, tableType, id, status)); } else { - Audio_InitAsyncReq(devAddr, sp4C, size, sp48, arg2, retQueue, MK_ASYNC_MSG(arg3, tableType, sp34, sp3C)); + AudioLoad_StartAsyncLoad(devAddr, ret, size, medium, nChunks, retQueue, + MK_ASYNC_MSG(retData, tableType, realId, status)); } - sp3C = 1; + status = 1; } switch (tableType) { - case 0: - Audio_SetSeqLoadStatus(sp34, sp3C); + case SEQUENCE_TABLE: + AudioLoad_SetSeqLoadStatus(realId, status); break; - case 1: - Audio_SetBankLoadStatus(sp34, sp3C); + case FONT_TABLE: + AudioLoad_SetFontLoadStatus(realId, status); break; - case 2: - func_800E1A78(sp34, sp3C); + case SAMPLE_TABLE: + AudioLoad_SetSampleFontLoadStatusAndApplyCaches(realId, status); break; default: break; } - return sp4C; + return ret; } -void Audio_ProcessLoads(s32 resetStatus) { - Audio_ProcessSyncLoads(resetStatus); - func_800E4590(resetStatus); - Audio_ProcessAsyncLoads(resetStatus); +void AudioLoad_ProcessLoads(s32 resetStatus) { + AudioLoad_ProcessSlowLoads(resetStatus); + AudioLoad_ProcessSamplePreloads(resetStatus); + AudioLoad_ProcessAsyncLoads(resetStatus); } -// SetDmaCallback -void func_800E301C(void* callback) { +void AudioLoad_SetDmaHandler(DmaHandler callback) { sDmaHandler = callback; } -u32 D_801304D4 = 0; -void func_800E3028(u32 arg0) { - D_801304D4 = arg0; +void AudioLoad_SetUnusedHandler(void* callback) { + sUnusedHandler = callback; } -// InitCtlTable -void func_800E3034(s32 arg0) { - CtlEntry* ctlEnt = &gAudioContext.ctlEntries[arg0]; - AudioBankTableEntry* tableEnt = &gAudioContext.audioBankTable->entries[arg0]; +void AudioLoad_InitSoundFontMeta(s32 fontId) { + SoundFont* font = &gAudioContext.soundFonts[fontId]; + AudioTableEntry* entry = &gAudioContext.soundFontTable->entries[fontId]; - ctlEnt->unk_02 = (tableEnt->unk_0A >> 8) & 0xFF; - ctlEnt->unk_03 = (tableEnt->unk_0A) & 0xFF; - ctlEnt->numInstruments = (tableEnt->unk_0C >> 8) & 0xFF; - ctlEnt->numDrums = tableEnt->unk_0C & 0xFF; - ctlEnt->numSfx = tableEnt->unk_0E; + font->sampleBankId1 = (entry->shortData1 >> 8) & 0xFF; + font->sampleBankId2 = (entry->shortData1) & 0xFF; + font->numInstruments = (entry->shortData2 >> 8) & 0xFF; + font->numDrums = entry->shortData2 & 0xFF; + font->numSfx = entry->shortData3; } -s32 gAudioContextInitalized = 0; - -void Audio_ContextInit(void* heap, u32 heapSize) { +void AudioLoad_Init(void* heap, u32 heapSize) { char pad[0x48]; - s32 sp24; + s32 numFonts; void* temp_v0_3; s32 i; u64* heapP; @@ -1069,17 +1103,19 @@ void Audio_ContextInit(void* heap, u32 heapSize) { gAudioContext.currTask = NULL; gAudioContext.rspTask[0].task.t.data_size = 0; gAudioContext.rspTask[1].task.t.data_size = 0; - osCreateMesgQueue(&gAudioContext.unk_25E8, &gAudioContext.unk_2600, 1); - osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBufs, 0x40); - osCreateMesgQueue(&gAudioContext.unk_1E20, gAudioContext.unk_1E38, 0x10); - osCreateMesgQueue(&gAudioContext.unk_1E78, gAudioContext.unk_1E90, 0x10); + osCreateMesgQueue(&gAudioContext.syncDmaQueue, &gAudioContext.syncDmaMesg, 1); + osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf, 0x40); + osCreateMesgQueue(&gAudioContext.externalLoadQueue, gAudioContext.externalLoadMesgBuf, + ARRAY_COUNT(gAudioContext.externalLoadMesgBuf)); + osCreateMesgQueue(&gAudioContext.preloadSampleQueue, gAudioContext.preloadSampleMesgBuf, + ARRAY_COUNT(gAudioContext.externalLoadMesgBuf)); gAudioContext.curAudioFrameDmaCount = 0; - gAudioContext.sampleDmaReqCnt = 0; + gAudioContext.sampleDmaCount = 0; gAudioContext.cartHandle = osCartRomInit(); if (heap == NULL) { gAudioContext.audioHeap = gAudioHeap; - gAudioContext.audioHeapSize = D_8014A6C4.heap; + gAudioContext.audioHeapSize = D_8014A6C4.heapSize; } else { void** hp = &heap; gAudioContext.audioHeap = *hp; @@ -1090,73 +1126,74 @@ void Audio_ContextInit(void* heap, u32 heapSize) { ((u64*)gAudioContext.audioHeap)[i] = 0; } - Audio_InitMainPools(D_8014A6C4.mainPool); + AudioHeap_InitMainPools(D_8014A6C4.initPoolSize); for (i = 0; i < 3; i++) { - gAudioContext.aiBuffers[i] = Audio_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN); + gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN * sizeof(s16)); } - gAudioContext.sequenceTable = &gSequenceTable; - gAudioContext.audioBankTable = &gAudioBankTable; - gAudioContext.audioTable = &gAudioTable; - gAudioContext.unk_283C = &D_80155340; - gAudioContext.seqTabEntCnt = gAudioContext.sequenceTable->header.entryCnt; + gAudioContext.sequenceTable = (AudioTable*)gSequenceTable; + gAudioContext.soundFontTable = (AudioTable*)gSoundFontTable; + gAudioContext.sampleBankTable = (AudioTable*)gSampleBankTable; + gAudioContext.sequenceFontTable = gSequenceFontTable; + gAudioContext.numSequences = gAudioContext.sequenceTable->numEntries; gAudioContext.audioResetSpecIdToLoad = 0; gAudioContext.resetStatus = 1; - Audio_ResetStep(); - Audio_InitAudioTable(gAudioContext.sequenceTable, _AudioseqSegmentRomStart, 0); - Audio_InitAudioTable(gAudioContext.audioBankTable, _AudiobankSegmentRomStart, 0); - Audio_InitAudioTable(gAudioContext.audioTable, _AudiotableSegmentRomStart, 0); - sp24 = gAudioContext.audioBankTable->header.entryCnt; - gAudioContext.ctlEntries = Audio_Alloc(&gAudioContext.audioInitPool, sp24 * sizeof(CtlEntry)); + AudioHeap_ResetStep(); + AudioLoad_InitTable(gAudioContext.sequenceTable, _AudioseqSegmentRomStart, 0); + AudioLoad_InitTable(gAudioContext.soundFontTable, _AudiobankSegmentRomStart, 0); + AudioLoad_InitTable(gAudioContext.sampleBankTable, _AudiotableSegmentRomStart, 0); + numFonts = gAudioContext.soundFontTable->numEntries; + gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont)); - for (i = 0; i < sp24; i++) { - func_800E3034(i); + for (i = 0; i < numFonts; i++) { + AudioLoad_InitSoundFontMeta(i); } - if (temp_v0_3 = Audio_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.initPool), temp_v0_3 == NULL) { - - *((u32*)&D_8014A6C4.initPool) = 0; + if (temp_v0_3 = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), temp_v0_3 == NULL) { + // cast away const from D_8014A6C4 + *((u32*)&D_8014A6C4.permanentPoolSize) = 0; } - Audio_SoundAllocPoolInit(&gAudioContext.unk_2D50, temp_v0_3, D_8014A6C4.initPool); - gAudioContextInitalized = 1; - osSendMesg(gAudioContext.taskStartQueueP, (void*)gAudioContext.totalTaskCnt, 0); + AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, temp_v0_3, D_8014A6C4.permanentPoolSize); + gAudioContextInitalized = true; + osSendMesg(gAudioContext.taskStartQueueP, (void*)gAudioContext.totalTaskCnt, OS_MESG_NOBLOCK); } -void Audio_SyncLoadsInit(void) { - gAudioContext.syncLoads[0].status = 0; - gAudioContext.syncLoads[1].status = 0; +void AudioLoad_InitSlowLoads(void) { + gAudioContext.slowLoads[0].status = 0; + gAudioContext.slowLoads[1].status = 0; } -s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, s8* isDone) { - AudioBankSample* sample; - AudioSyncLoad* syncLoad; +s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) { + SoundFontSample* sample; + AudioSlowLoad* slowLoad; - sample = Audio_GetBankSample(arg0, arg1); + sample = AudioLoad_GetFontSample(fontId, instId); if (sample == NULL) { *isDone = 0; return -1; } - if (sample->medium == 0) { + if (sample->medium == MEDIUM_RAM) { *isDone = 2; return 0; } - syncLoad = &gAudioContext.syncLoads[gAudioContext.syncLoadPos]; - if (syncLoad->status == LOAD_STATUS_DONE) { - syncLoad->status = LOAD_STATUS_WAITING; + slowLoad = &gAudioContext.slowLoads[gAudioContext.slowLoadPos]; + if (slowLoad->status == LOAD_STATUS_DONE) { + slowLoad->status = LOAD_STATUS_WAITING; } - syncLoad->sample = *sample; - syncLoad->isDone = isDone; - syncLoad->ramAddr = func_800E05C4(sample->size, arg0, sample->sampleAddr, sample->medium, 0); + slowLoad->sample = *sample; + slowLoad->isDone = isDone; + slowLoad->curRamAddr = + AudioHeap_AllocSampleCache(sample->size, fontId, sample->sampleAddr, sample->medium, CACHE_TEMPORARY); - if (syncLoad->ramAddr == NULL) { - if (sample->medium == 1 || sample->codec == 2) { + if (slowLoad->curRamAddr == NULL) { + if (sample->medium == MEDIUM_UNK || sample->codec == CODEC_S16_INMEMORY) { *isDone = 0; return -1; } else { @@ -1165,376 +1202,391 @@ s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, s8* isDone) { } } - syncLoad->status = LOAD_STATUS_START; - syncLoad->size = ALIGN16(sample->size); - syncLoad->unk_10 = syncLoad->ramAddr; - syncLoad->devAddr = sample->sampleAddr; - syncLoad->unk_00 = sample->medium; - syncLoad->unk_01 = arg0; - syncLoad->unk_02 = arg1; - if (syncLoad->unk_00 == 1) { - syncLoad->unk_04 = gAudioContext.audioTable->header.unk_02; + slowLoad->status = LOAD_STATUS_START; + slowLoad->bytesRemaining = ALIGN16(sample->size); + slowLoad->ramAddr = slowLoad->curRamAddr; + slowLoad->curDevAddr = sample->sampleAddr; + slowLoad->medium = sample->medium; + slowLoad->seqOrFontId = fontId; + slowLoad->instId = instId; + if (slowLoad->medium == MEDIUM_UNK) { + slowLoad->unkMediumParam = gAudioContext.sampleBankTable->unkMediumParam; } - gAudioContext.syncLoadPos ^= 1; + gAudioContext.slowLoadPos ^= 1; return 0; } -AudioBankSample* Audio_GetBankSample(s32 bankId, s32 sfxId) { - AudioBankSample* ret; +SoundFontSample* AudioLoad_GetFontSample(s32 fontId, s32 instId) { + SoundFontSample* ret; - if (sfxId < 0x80) { - Instrument* instrument = Audio_GetInstrumentInner(bankId, sfxId); + if (instId < 0x80) { + Instrument* instrument = Audio_GetInstrumentInner(fontId, instId); if (instrument == NULL) { return NULL; } ret = instrument->normalNotesSound.sample; - } else if (sfxId < 0x100) { - Drum* drum = Audio_GetDrum(bankId, sfxId - 0x80); + } else if (instId < 0x100) { + Drum* drum = Audio_GetDrum(fontId, instId - 0x80); if (drum == NULL) { return NULL; } ret = drum->sound.sample; } else { - AudioBankSound* bankSound = Audio_GetSfx(bankId, sfxId - 0x100); - if (bankSound == NULL) { + SoundFontSound* sound = Audio_GetSfx(fontId, instId - 0x100); + if (sound == NULL) { return NULL; } - ret = bankSound->sample; + ret = sound->sample; } return ret; } -void func_800E3670(void) { +void AudioLoad_Unused2(void) { } -void func_800E3678(AudioSyncLoad* syncLoad) { - AudioBankSample* sample; +void AudioLoad_FinishSlowLoad(AudioSlowLoad* slowLoad) { + SoundFontSample* sample; - if (syncLoad->sample.sampleAddr == NULL) { + if (slowLoad->sample.sampleAddr == NULL) { return; } - sample = Audio_GetBankSample(syncLoad->unk_01, syncLoad->unk_02); + sample = AudioLoad_GetFontSample(slowLoad->seqOrFontId, slowLoad->instId); if (sample == NULL) { return; } - syncLoad->sample = *sample; - sample->sampleAddr = syncLoad->unk_10; - sample->medium = 0; + slowLoad->sample = *sample; + sample->sampleAddr = slowLoad->ramAddr; + sample->medium = MEDIUM_RAM; } -void Audio_ProcessSyncLoads(s32 resetStatus) { - AudioSyncLoad* syncLoad; +void AudioLoad_ProcessSlowLoads(s32 resetStatus) { + AudioSlowLoad* slowLoad; s32 i; - for (i = 0; i < ARRAY_COUNT(gAudioContext.syncLoads); i++) { - syncLoad = &gAudioContext.syncLoads[i]; - switch (gAudioContext.syncLoads[i].status) { + for (i = 0; i < ARRAY_COUNT(gAudioContext.slowLoads); i++) { + slowLoad = &gAudioContext.slowLoads[i]; + switch (gAudioContext.slowLoads[i].status) { case LOAD_STATUS_LOADING: - if (syncLoad->unk_00 != 1) { - osRecvMesg(&syncLoad->msgqueue, NULL, OS_MESG_BLOCK); + if (slowLoad->medium != MEDIUM_UNK) { + osRecvMesg(&slowLoad->msgqueue, NULL, OS_MESG_BLOCK); } if (resetStatus != 0) { - syncLoad->status = LOAD_STATUS_DONE; + slowLoad->status = LOAD_STATUS_DONE; continue; } case LOAD_STATUS_START: - syncLoad->status = LOAD_STATUS_LOADING; - if (syncLoad->size == 0) { - func_800E3678(syncLoad); - syncLoad->status = LOAD_STATUS_DONE; - *syncLoad->isDone = 1; - } else if (syncLoad->size < 0x400) { - if (syncLoad->unk_00 == 1) { - u32 size = syncLoad->size; - func_800E38F8(syncLoad->devAddr, syncLoad->ramAddr, size, syncLoad->unk_04); + slowLoad->status = LOAD_STATUS_LOADING; + if (slowLoad->bytesRemaining == 0) { + AudioLoad_FinishSlowLoad(slowLoad); + slowLoad->status = LOAD_STATUS_DONE; + *slowLoad->isDone = 1; + } else if (slowLoad->bytesRemaining < 0x400) { + if (slowLoad->medium == MEDIUM_UNK) { + u32 size = slowLoad->bytesRemaining; + AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, size, + slowLoad->unkMediumParam); } else { - func_800E3874(syncLoad, syncLoad->size); + AudioLoad_DmaSlowCopy(slowLoad, slowLoad->bytesRemaining); } - syncLoad->size = 0; + slowLoad->bytesRemaining = 0; } else { - if (syncLoad->unk_00 == 1) { - func_800E38F8(syncLoad->devAddr, syncLoad->ramAddr, 0x400, syncLoad->unk_04); + if (slowLoad->medium == MEDIUM_UNK) { + AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, 0x400, + slowLoad->unkMediumParam); } else { - func_800E3874(syncLoad, 0x400); + AudioLoad_DmaSlowCopy(slowLoad, 0x400); } - syncLoad->size -= 0x400; - syncLoad->ramAddr += 0x400; - syncLoad->devAddr += 0x400; + slowLoad->bytesRemaining -= 0x400; + slowLoad->curRamAddr += 0x400; + slowLoad->curDevAddr += 0x400; } break; } } } -void func_800E3874(AudioSyncLoad* arg0, s32 size) { - Audio_osInvalDCache(arg0->ramAddr, size); - osCreateMesgQueue(&arg0->msgqueue, &arg0->msg, 1); - Audio_DMA(&arg0->ioMesg, 0U, 0, arg0->devAddr, arg0->ramAddr, size, &arg0->msgqueue, arg0->unk_00, "SLOWCOPY"); +void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size) { + Audio_osInvalDCache(slowLoad->curRamAddr, size); + osCreateMesgQueue(&slowLoad->msgqueue, &slowLoad->msg, 1); + AudioLoad_Dma(&slowLoad->ioMesg, 0U, 0, slowLoad->curDevAddr, slowLoad->curRamAddr, size, &slowLoad->msgqueue, + slowLoad->medium, "SLOWCOPY"); } -void func_800E38F8(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { +void AudioLoad_DmaSlowCopyUnkMedium(s32 devAddr, u8* ramAddr, s32 size, s32 arg3) { } -s32 Audio_SyncLoadSeq(s32 seqIdx, u8* ramAddr, s8* isDone) { - AudioSyncLoad* syncLoad; - SequenceTable* seqTable; +s32 AudioLoad_SlowLoadSeq(s32 seqId, u8* ramAddr, s8* isDone) { + AudioSlowLoad* slowLoad; + AudioTable* seqTable; u32 size; - if (seqIdx >= gAudioContext.seqTabEntCnt) { + if (seqId >= gAudioContext.numSequences) { *isDone = 0; return -1; } - seqIdx = Audio_GetTableIndex(SEQUENCE_TABLE, seqIdx); - seqTable = Audio_GetLoadTable(SEQUENCE_TABLE); - syncLoad = &gAudioContext.syncLoads[gAudioContext.syncLoadPos]; - if (syncLoad->status == LOAD_STATUS_DONE) { - syncLoad->status = LOAD_STATUS_WAITING; + seqId = AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId); + seqTable = AudioLoad_GetLoadTable(SEQUENCE_TABLE); + slowLoad = &gAudioContext.slowLoads[gAudioContext.slowLoadPos]; + if (slowLoad->status == LOAD_STATUS_DONE) { + slowLoad->status = LOAD_STATUS_WAITING; } - syncLoad->sample.sampleAddr = NULL; - syncLoad->isDone = isDone; - size = seqTable->entries[seqIdx].size; + slowLoad->sample.sampleAddr = NULL; + slowLoad->isDone = isDone; + size = seqTable->entries[seqId].size; size = ALIGN16(size); - syncLoad->ramAddr = ramAddr; - syncLoad->status = LOAD_STATUS_START; - syncLoad->size = size; - syncLoad->unk_10 = ramAddr; - syncLoad->devAddr = seqTable->entries[seqIdx].romAddr; - syncLoad->unk_00 = seqTable->entries[seqIdx].unk_08; - syncLoad->unk_01 = seqIdx; + slowLoad->curRamAddr = ramAddr; + slowLoad->status = LOAD_STATUS_START; + slowLoad->bytesRemaining = size; + slowLoad->ramAddr = ramAddr; + slowLoad->curDevAddr = seqTable->entries[seqId].romAddr; + slowLoad->medium = seqTable->entries[seqId].medium; + slowLoad->seqOrFontId = seqId; - if (syncLoad->unk_00 == 1) { - syncLoad->unk_04 = seqTable->header.unk_02; + if (slowLoad->medium == MEDIUM_UNK) { + slowLoad->unkMediumParam = seqTable->unkMediumParam; } - gAudioContext.syncLoadPos ^= 1; + gAudioContext.slowLoadPos ^= 1; return 0; } -void Audio_AsyncLoadReqInit(void) { +void AudioLoad_InitAsyncLoads(void) { s32 i; - for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncReqs); i++) { - gAudioContext.asyncReqs[i].status = 0; + for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) { + gAudioContext.asyncLoads[i].status = 0; } } -AsyncLoadReq* func_800E3A44(s32 arg0, u32 devAddr, void* ramAddr, s32 size, s32 arg4, s32 nChunks, - OSMesgQueue* retQueue, s32 retMsg) { - AsyncLoadReq* loadReq; +AudioAsyncLoad* AudioLoad_StartAsyncLoadUnkMedium(s32 unkMediumParam, u32 devAddr, void* ramAddr, s32 size, s32 medium, + s32 nChunks, OSMesgQueue* retQueue, s32 retMsg) { + AudioAsyncLoad* asyncLoad; - loadReq = Audio_InitAsyncReq(devAddr, ramAddr, size, arg4, nChunks, retQueue, retMsg); + asyncLoad = AudioLoad_StartAsyncLoad(devAddr, ramAddr, size, medium, nChunks, retQueue, retMsg); - if (loadReq == NULL) { + if (asyncLoad == NULL) { return NULL; } - osSendMesg(&gAudioContext.asyncLoadQueue, loadReq, 0); - loadReq->unk_18 = arg0; - return loadReq; + osSendMesg(&gAudioContext.asyncLoadUnkMediumQueue, asyncLoad, OS_MESG_NOBLOCK); + asyncLoad->unkMediumParam = unkMediumParam; + return asyncLoad; } -AsyncLoadReq* Audio_InitAsyncReq(u32 devAddr, void* ramAddr, u32 size, s32 arg3, s32 nChunks, OSMesgQueue* retQueue, - s32 retMsg) { - AsyncLoadReq* loadReq; +AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, void* ramAddr, u32 size, s32 medium, s32 nChunks, + OSMesgQueue* retQueue, s32 retMsg) { + AudioAsyncLoad* asyncLoad; s32 i; - for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncReqs); i++) { - if (gAudioContext.asyncReqs[i].status == 0) { - loadReq = &gAudioContext.asyncReqs[i]; + for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) { + if (gAudioContext.asyncLoads[i].status == 0) { + asyncLoad = &gAudioContext.asyncLoads[i]; break; } } - // no more available async reqs - if (i == ARRAY_COUNT(gAudioContext.asyncReqs)) { + // no more available async loads + if (i == ARRAY_COUNT(gAudioContext.asyncLoads)) { return NULL; } - loadReq->status = LOAD_STATUS_START; - loadReq->devAddr = devAddr; - loadReq->unk_04 = ramAddr; - loadReq->ramAddr = ramAddr; - loadReq->bytesRemaining = size; + asyncLoad->status = LOAD_STATUS_START; + asyncLoad->curDevAddr = devAddr; + asyncLoad->ramAddr = ramAddr; + asyncLoad->curRamAddr = ramAddr; + asyncLoad->bytesRemaining = size; if (nChunks == 0) { - loadReq->chunkSize = 0x1000; + asyncLoad->chunkSize = 0x1000; } else if (nChunks == 1) { - loadReq->chunkSize = size; + asyncLoad->chunkSize = size; } else { - loadReq->chunkSize = (((s32)size / nChunks) + 0xFF) & ~0xFF; - if (loadReq->chunkSize < 0x100) { - loadReq->chunkSize = 0x100; + asyncLoad->chunkSize = (((s32)size / nChunks) + 0xFF) & ~0xFF; + if (asyncLoad->chunkSize < 0x100) { + asyncLoad->chunkSize = 0x100; } } - loadReq->retQueue = retQueue; - loadReq->unk_01 = 3; - loadReq->unk_02 = arg3; - loadReq->retMsg = retMsg; - osCreateMesgQueue(&loadReq->msgQueue, &loadReq->msg, 1); - return loadReq; + asyncLoad->retQueue = retQueue; + asyncLoad->delay = 3; + asyncLoad->medium = medium; + asyncLoad->retMsg = retMsg; + osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1); + return asyncLoad; } -void Audio_ProcessAsyncLoads(s32 resetStatus) { - AsyncLoadReq* loadReq; +void AudioLoad_ProcessAsyncLoads(s32 resetStatus) { + AudioAsyncLoad* asyncLoad; s32 i; if (gAudioContext.resetTimer == 1) { return; } - if (gAudioContext.curAsyncReq == NULL) { + if (gAudioContext.curUnkMediumLoad == NULL) { if (resetStatus != 0) { + // Clear and ignore queue if resetting. do { - } while (osRecvMesg(&gAudioContext.asyncLoadQueue, (OSMesg*)&loadReq, OS_MESG_NOBLOCK) != -1); - } else if (osRecvMesg(&gAudioContext.asyncLoadQueue, (OSMesg*)&loadReq, OS_MESG_NOBLOCK) == -1) { - gAudioContext.curAsyncReq = NULL; + } while (osRecvMesg(&gAudioContext.asyncLoadUnkMediumQueue, (OSMesg*)&asyncLoad, OS_MESG_NOBLOCK) != -1); + } else if (osRecvMesg(&gAudioContext.asyncLoadUnkMediumQueue, (OSMesg*)&asyncLoad, OS_MESG_NOBLOCK) == -1) { + gAudioContext.curUnkMediumLoad = NULL; } else { - gAudioContext.curAsyncReq = loadReq; + gAudioContext.curUnkMediumLoad = asyncLoad; } } - if (gAudioContext.curAsyncReq != NULL) { - Audio_HandleAsyncMsg(gAudioContext.curAsyncReq, resetStatus); + if (gAudioContext.curUnkMediumLoad != NULL) { + AudioLoad_ProcessAsyncLoadUnkMedium(gAudioContext.curUnkMediumLoad, resetStatus); } - for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncReqs); i++) { - if (gAudioContext.asyncReqs[i].status == 1) { - loadReq = &gAudioContext.asyncReqs[i]; - if (loadReq->unk_02 != 1) { - Audio_UpdateAsyncReq(loadReq, resetStatus); + for (i = 0; i < ARRAY_COUNT(gAudioContext.asyncLoads); i++) { + if (gAudioContext.asyncLoads[i].status == 1) { + asyncLoad = &gAudioContext.asyncLoads[i]; + if (asyncLoad->medium != MEDIUM_UNK) { + AudioLoad_ProcessAsyncLoad(asyncLoad, resetStatus); } } } } -void Audio_HandleAsyncMsg(AsyncLoadReq* arg0, s32 arg1) { +void AudioLoad_ProcessAsyncLoadUnkMedium(AudioAsyncLoad* asyncLoad, s32 resetStatus) { } -void Audio_AsyncReqDone(AsyncLoadReq* loadReq) { - u32 retMsg = loadReq->retMsg; - u32 b2; +void AudioLoad_FinishAsyncLoad(AudioAsyncLoad* asyncLoad) { + u32 retMsg = asyncLoad->retMsg; + u32 fontId; u32 pad; - u32 t1; OSMesg doneMsg; - u32 t2; - RelocInfo sp30; + u32 sampleBankId1; + u32 sampleBankId2; + RelocInfo relocInfo; if (1) {} switch (ASYNC_TBLTYPE(retMsg)) { case SEQUENCE_TABLE: - Audio_SetSeqLoadStatus(ASYNC_B2(retMsg), ASYNC_B3(retMsg)); + AudioLoad_SetSeqLoadStatus(ASYNC_ID(retMsg), ASYNC_STATUS(retMsg)); break; - case AUDIO_TABLE: - func_800E1A78(ASYNC_B2(retMsg), ASYNC_B3(retMsg)); + case SAMPLE_TABLE: + AudioLoad_SetSampleFontLoadStatusAndApplyCaches(ASYNC_ID(retMsg), ASYNC_STATUS(retMsg)); break; - case BANK_TABLE: - b2 = ASYNC_B2(retMsg); - t1 = gAudioContext.ctlEntries[b2].unk_02; - t2 = gAudioContext.ctlEntries[b2].unk_03; - sp30.index1 = t1; - sp30.index2 = t2; - sp30.baseAddr1 = t1 != 0xFF ? func_800E2318(t1, &sp30.medium1) : 0; - sp30.baseAddr2 = t2 != 0xFF ? func_800E2318(t2, &sp30.medium2) : 0; - Audio_SetBankLoadStatus(b2, ASYNC_B3(retMsg)); - func_800E4198(b2, loadReq->unk_04, &sp30, 1); + case FONT_TABLE: + fontId = ASYNC_ID(retMsg); + sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + relocInfo.sampleBankId1 = sampleBankId1; + relocInfo.sampleBankId2 = sampleBankId2; + relocInfo.baseAddr1 = + sampleBankId1 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId1, &relocInfo.medium1) : 0; + relocInfo.baseAddr2 = + sampleBankId2 != 0xFF ? AudioLoad_GetSampleBank(sampleBankId2, &relocInfo.medium2) : 0; + AudioLoad_SetFontLoadStatus(fontId, ASYNC_STATUS(retMsg)); + AudioLoad_RelocateFontAndPreloadSamples(fontId, asyncLoad->ramAddr, &relocInfo, true); break; } - doneMsg = loadReq->retMsg; + doneMsg = asyncLoad->retMsg; if (1) {} - loadReq->status = LOAD_STATUS_WAITING; - osSendMesg(loadReq->retQueue, doneMsg, OS_MESG_NOBLOCK); + asyncLoad->status = LOAD_STATUS_WAITING; + osSendMesg(asyncLoad->retQueue, doneMsg, OS_MESG_NOBLOCK); } -void Audio_UpdateAsyncReq(AsyncLoadReq* req, s32 resetStatus) { - AudioTable* audioTable = gAudioContext.audioTable; +void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus) { + AudioTable* sampleBankTable = gAudioContext.sampleBankTable; - if (req->unk_01 >= 2) { - req->unk_01--; + if (asyncLoad->delay >= 2) { + asyncLoad->delay--; return; } - if (req->unk_01 == 1) { - req->unk_01 = 0; + if (asyncLoad->delay == 1) { + asyncLoad->delay = 0; } else if (resetStatus != 0) { - osRecvMesg(&req->msgQueue, NULL, OS_MESG_BLOCK); - req->status = LOAD_STATUS_WAITING; + // Await the previous DMA response synchronously, then return. + osRecvMesg(&asyncLoad->msgQueue, NULL, OS_MESG_BLOCK); + asyncLoad->status = LOAD_STATUS_WAITING; return; - } else if (osRecvMesg(&req->msgQueue, NULL, OS_MESG_NOBLOCK) == -1) { + } else if (osRecvMesg(&asyncLoad->msgQueue, NULL, OS_MESG_NOBLOCK) == -1) { + // If the previous DMA step isn't done, return. return; } - if (req->bytesRemaining == 0) { - Audio_AsyncReqDone(req); + if (asyncLoad->bytesRemaining == 0) { + AudioLoad_FinishAsyncLoad(asyncLoad); return; } - if (req->bytesRemaining < req->chunkSize) { - if (req->unk_02 == 1) { - func_800E4044(req->devAddr, req->ramAddr, req->bytesRemaining, audioTable->header.unk_02); + if (asyncLoad->bytesRemaining < asyncLoad->chunkSize) { + if (asyncLoad->medium == MEDIUM_UNK) { + AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->bytesRemaining, + sampleBankTable->unkMediumParam); } else { - func_800E3FB4(req, req->bytesRemaining); + AudioLoad_AsyncDma(asyncLoad, asyncLoad->bytesRemaining); } - req->bytesRemaining = 0; + asyncLoad->bytesRemaining = 0; return; } - if (req->unk_02 == 1) { - func_800E4044(req->devAddr, req->ramAddr, req->chunkSize, audioTable->header.unk_02); + if (asyncLoad->medium == MEDIUM_UNK) { + AudioLoad_AsyncDmaUnkMedium(asyncLoad->curDevAddr, asyncLoad->curRamAddr, asyncLoad->chunkSize, + sampleBankTable->unkMediumParam); } else { - func_800E3FB4(req, req->chunkSize); + AudioLoad_AsyncDma(asyncLoad, asyncLoad->chunkSize); } - req->bytesRemaining -= req->chunkSize; - req->devAddr += req->chunkSize; - req->ramAddr = req->ramAddr + req->chunkSize; + asyncLoad->bytesRemaining -= asyncLoad->chunkSize; + asyncLoad->curDevAddr += asyncLoad->chunkSize; + asyncLoad->curRamAddr += asyncLoad->chunkSize; } -void func_800E3FB4(AsyncLoadReq* req, u32 size) { +void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size) { size = ALIGN16(size); - Audio_osInvalDCache(req->ramAddr, size); - osCreateMesgQueue(&req->msgQueue, &req->msg, 1); - Audio_DMA(&req->ioMesg, 0, 0, req->devAddr, req->ramAddr, size, &req->msgQueue, req->unk_02, "BGCOPY"); + Audio_osInvalDCache(asyncLoad->curRamAddr, size); + osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1); + AudioLoad_Dma(&asyncLoad->ioMesg, 0, 0, asyncLoad->curDevAddr, asyncLoad->curRamAddr, size, &asyncLoad->msgQueue, + asyncLoad->medium, "BGCOPY"); } -void func_800E4044(u32 devAddr, void* ramAddr, u32 size, s16 arg3) { +void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, void* ramAddr, u32 size, s16 arg3) { } #define RELOC(v, base) (reloc = (void*)((u32)(v) + (u32)(base))) -void Audio_SampleReloc(AudioBankSound* sound, u32 arg1, RelocInfo* arg2) { - AudioBankSample* sample; +void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo) { + SoundFontSample* sample; void* reloc; if ((u32)sound->sample <= 0x80000000) { - sample = sound->sample = RELOC(sound->sample, arg1); - if (sample->size != 0 && sample->unk_bits25 != 1) { - sample->loop = RELOC(sample->loop, arg1); - sample->book = RELOC(sample->book, arg1); + sample = sound->sample = RELOC(sound->sample, mem); + if (sample->size != 0 && sample->unk_bit25 != 1) { + sample->loop = RELOC(sample->loop, mem); + sample->book = RELOC(sample->book, mem); + + // Resolve the sample medium 2-bit bitfield into a real value based on relocInfo. switch (sample->medium) { case 0: - sample->sampleAddr = RELOC(sample->sampleAddr, arg2->baseAddr1); - sample->medium = arg2->medium1; + sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1); + sample->medium = relocInfo->medium1; break; case 1: - sample->sampleAddr = RELOC(sample->sampleAddr, arg2->baseAddr2); - sample->medium = arg2->medium2; + sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr2); + sample->medium = relocInfo->medium2; break; case 2: case 3: + // Invalid? This leaves sample->medium as MEDIUM_CART and MEDIUM_DISK_DRIVE + // respectively, and the sampleAddr unrelocated. break; } - sample->unk_bits25 = 1; - if (sample->unk_bits26 && (sample->medium != 0)) { - gAudioContext.unk_0B68[gAudioContext.unk_1768++] = sample; + sample->unk_bit25 = 1; + if (sample->unk_bit26 && (sample->medium != MEDIUM_RAM)) { + gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample; } } } @@ -1542,56 +1594,63 @@ void Audio_SampleReloc(AudioBankSound* sound, u32 arg1, RelocInfo* arg2) { #undef RELOC -void func_800E4198(s32 bankId, AudioBankData* mem, RelocInfo* relocInfo, s32 arg3) { - AudioStruct0D68* item; - AudioStruct0D68* item2; - AudioBankSample* sample; - s32 count; +void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo, s32 async) { + AudioPreloadReq* preload; + AudioPreloadReq* topPreload; + SoundFontSample* sample; + s32 size; s32 nChunks; u8* addr; - s32 sp4C; + s32 preloadInProgress; s32 i; - sp4C = false; - if (gAudioContext.unk_176C != 0) { - sp4C = true; + preloadInProgress = false; + if (gAudioContext.preloadSampleStackTop != 0) { + preloadInProgress = true; } else { D_8016B780 = 0; } - gAudioContext.unk_1768 = 0; - func_800E283C(bankId, mem, relocInfo); - count = 0; - for (i = 0; i < gAudioContext.unk_1768; i++) { - count += ALIGN16(gAudioContext.unk_0B68[i]->size); + gAudioContext.numUsedSamples = 0; + AudioLoad_RelocateFont(fontId, mem, relocInfo); + + size = 0; + for (i = 0; i < gAudioContext.numUsedSamples; i++) { + size += ALIGN16(gAudioContext.usedSamples[i]->size); } - if (count && count) {} + if (size && size) {} - for (i = 0; i < gAudioContext.unk_1768; i++) { - if (gAudioContext.unk_176C == 120) { + for (i = 0; i < gAudioContext.numUsedSamples; i++) { + if (gAudioContext.preloadSampleStackTop == 120) { break; } - sample = gAudioContext.unk_0B68[i]; + sample = gAudioContext.usedSamples[i]; addr = NULL; - switch (arg3) { - case 0: + switch (async) { + case false: if (sample->medium == relocInfo->medium1) { - addr = func_800E05C4(sample->size, relocInfo->index1, sample->sampleAddr, sample->medium, 1); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr, + sample->medium, CACHE_PERSISTENT); } else if (sample->medium == relocInfo->medium2) { - addr = func_800E05C4(sample->size, relocInfo->index2, sample->sampleAddr, sample->medium, 1); - } else if (sample->medium == 3) { - addr = func_800E05C4(sample->size, 0xFE, sample->sampleAddr, sample->medium, 1); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr, + sample->medium, CACHE_PERSISTENT); + } else if (sample->medium == MEDIUM_DISK_DRIVE) { + addr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium, + CACHE_PERSISTENT); } break; - case 1: + case true: if (sample->medium == relocInfo->medium1) { - addr = func_800E05C4(sample->size, relocInfo->index1, sample->sampleAddr, sample->medium, 0); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr, + sample->medium, CACHE_TEMPORARY); } else if (sample->medium == relocInfo->medium2) { - addr = func_800E05C4(sample->size, relocInfo->index2, sample->sampleAddr, sample->medium, 0); - } else if (sample->medium == 3) { - addr = func_800E05C4(sample->size, 0xFE, sample->sampleAddr, sample->medium, 0); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr, + sample->medium, CACHE_TEMPORARY); + } else if (sample->medium == MEDIUM_DISK_DRIVE) { + addr = AudioHeap_AllocSampleCache(sample->size, 0xFE, sample->sampleAddr, sample->medium, + CACHE_TEMPORARY); } break; } @@ -1599,93 +1658,98 @@ void func_800E4198(s32 bankId, AudioBankData* mem, RelocInfo* relocInfo, s32 arg continue; } - switch (arg3) { - case 0: - if (sample->medium == 1) { - Audio_NoopCopy((u32)sample->sampleAddr, addr, sample->size, - gAudioContext.audioTable->header.unk_02); + switch (async) { + case false: + if (sample->medium == MEDIUM_UNK) { + AudioLoad_SyncDmaUnkMedium((u32)sample->sampleAddr, addr, sample->size, + gAudioContext.sampleBankTable->unkMediumParam); sample->sampleAddr = addr; - sample->medium = 0; + sample->medium = MEDIUM_RAM; } else { - Audio_DMAFastCopy((u32)sample->sampleAddr, addr, sample->size, sample->medium); + AudioLoad_SyncDma((u32)sample->sampleAddr, addr, sample->size, sample->medium); sample->sampleAddr = addr; - sample->medium = 0; + sample->medium = MEDIUM_RAM; } - if (sample->medium == 3) {} + if (sample->medium == MEDIUM_DISK_DRIVE) {} break; - case 1: - item = &gAudioContext.unk_0D68[gAudioContext.unk_176C]; - item->sample = sample; - item->ramAddr = addr; - item->encodedInfo = (gAudioContext.unk_176C << 24) | 0xFFFFFF; - item->isFree = false; - item->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium; - gAudioContext.unk_176C++; + case true: + preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop]; + preload->sample = sample; + preload->ramAddr = addr; + preload->encodedInfo = (gAudioContext.preloadSampleStackTop << 24) | 0xFFFFFF; + preload->isFree = false; + preload->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium; + gAudioContext.preloadSampleStackTop++; break; } } + gAudioContext.numUsedSamples = 0; - gAudioContext.unk_1768 = 0; - if (gAudioContext.unk_176C != 0 && !sp4C) { - item2 = &gAudioContext.unk_0D68[gAudioContext.unk_176C - 1]; - sample = item2->sample; + if (gAudioContext.preloadSampleStackTop != 0 && !preloadInProgress) { + topPreload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1]; + sample = topPreload->sample; nChunks = (sample->size >> 12) + 1; - Audio_InitAsyncReq((u32)sample->sampleAddr, item2->ramAddr, sample->size, sample->medium, nChunks, - &gAudioContext.unk_1E78, item2->encodedInfo); + AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, topPreload->ramAddr, sample->size, sample->medium, nChunks, + &gAudioContext.preloadSampleQueue, topPreload->encodedInfo); } } -s32 func_800E4590(s32 resetStatus) { - AudioBankSample* sample; - AudioStruct0D68* item; - u32 sp4C; +s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus) { + SoundFontSample* sample; + AudioPreloadReq* preload; + u32 preloadIndex; u32 key; - u32 unk; + u32 nChunks; s32 pad; - if (gAudioContext.unk_176C > 0) { + if (gAudioContext.preloadSampleStackTop > 0) { if (resetStatus != 0) { - osRecvMesg(&gAudioContext.unk_1E78, (OSMesg*)&sp4C, OS_MESG_NOBLOCK); - gAudioContext.unk_176C = 0; + // Clear result queue and preload stack and return. + osRecvMesg(&gAudioContext.preloadSampleQueue, (OSMesg*)&preloadIndex, OS_MESG_NOBLOCK); + gAudioContext.preloadSampleStackTop = 0; return 0; } - if (osRecvMesg(&gAudioContext.unk_1E78, (OSMesg*)&sp4C, OS_MESG_NOBLOCK) == -1) { + if (osRecvMesg(&gAudioContext.preloadSampleQueue, (OSMesg*)&preloadIndex, OS_MESG_NOBLOCK) == -1) { + // Previous preload is not done yet. return 0; } - sp4C >>= 24; - item = &gAudioContext.unk_0D68[sp4C]; + preloadIndex >>= 24; + preload = &gAudioContext.preloadSampleStack[preloadIndex]; - if (item->isFree == false) { - sample = item->sample; + if (preload->isFree == false) { + sample = preload->sample; key = (u32)sample->sampleAddr + sample->size + sample->medium; - if (key == item->endAndMediumKey) { - sample->sampleAddr = item->ramAddr; - sample->medium = 0; + if (key == preload->endAndMediumKey) { + // Change storage for sample to the preloaded version. + sample->sampleAddr = preload->ramAddr; + sample->medium = MEDIUM_RAM; } - item->isFree = true; + preload->isFree = true; } + // Pop requests with isFree = true off the stack, as far as possible, + // and dispatch the next DMA. for (;;) { - if (gAudioContext.unk_176C <= 0) { + if (gAudioContext.preloadSampleStackTop <= 0) { break; } - item = &gAudioContext.unk_0D68[gAudioContext.unk_176C - 1]; - if (item->isFree == true) { - gAudioContext.unk_176C--; + preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1]; + if (preload->isFree == true) { + gAudioContext.preloadSampleStackTop--; continue; } - sample = item->sample; - unk = (sample->size >> 12) + 1; + sample = preload->sample; + nChunks = (sample->size >> 12) + 1; key = (u32)sample->sampleAddr + sample->size + sample->medium; - if (key != item->endAndMediumKey) { - item->isFree = true; - gAudioContext.unk_176C--; + if (key != preload->endAndMediumKey) { + preload->isFree = true; + gAudioContext.preloadSampleStackTop--; } else { - Audio_InitAsyncReq((u32)sample->sampleAddr, item->ramAddr, sample->size, sample->medium, unk, - &gAudioContext.unk_1E78, item->encodedInfo); + AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, preload->ramAddr, sample->size, sample->medium, + nChunks, &gAudioContext.preloadSampleQueue, preload->encodedInfo); break; } } @@ -1693,150 +1757,157 @@ s32 func_800E4590(s32 resetStatus) { return 1; } -s32 func_800E4744(AudioBankSample* sample, s32 sampleCnt, AudioBankSample** sampleList) { +s32 AudioLoad_AddToSampleSet(SoundFontSample* sample, s32 numSamples, SoundFontSample** sampleSet) { s32 i; - for (i = 0; i < sampleCnt; i++) { - if (sample->sampleAddr == sampleList[i]->sampleAddr) { + for (i = 0; i < numSamples; i++) { + if (sample->sampleAddr == sampleSet[i]->sampleAddr) { break; } } - if (i == sampleCnt) { - sampleList[sampleCnt] = sample; - sampleCnt++; + if (i == numSamples) { + sampleSet[numSamples] = sample; + numSamples++; } - return sampleCnt; + return numSamples; } -s32 func_800E478C(s32 bankId, AudioBankSample** sampleList) { +s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) { s32 i; - s32 drumCnt; - s32 instrumentCnt; - s32 sampleCnt = 0; + s32 numDrums; + s32 numInstruments; + s32 numSamples = 0; - drumCnt = gAudioContext.ctlEntries[bankId].numDrums; - instrumentCnt = gAudioContext.ctlEntries[bankId].numInstruments; + numDrums = gAudioContext.soundFonts[fontId].numDrums; + numInstruments = gAudioContext.soundFonts[fontId].numInstruments; - for (i = 0; i < drumCnt; i++) { - Drum* drum = Audio_GetDrum(bankId, i); + for (i = 0; i < numDrums; i++) { + Drum* drum = Audio_GetDrum(fontId, i); if (1) {} if (drum != NULL) { - sampleCnt = func_800E4744(drum->sound.sample, sampleCnt, sampleList); + numSamples = AudioLoad_AddToSampleSet(drum->sound.sample, numSamples, sampleSet); } } - for (i = 0; i < instrumentCnt; i++) { - Instrument* instrument = Audio_GetInstrumentInner(bankId, i); + for (i = 0; i < numInstruments; i++) { + Instrument* instrument = Audio_GetInstrumentInner(fontId, i); if (instrument != NULL) { if (instrument->normalRangeLo != 0) { - sampleCnt = func_800E4744(instrument->lowNotesSound.sample, sampleCnt, sampleList); + numSamples = AudioLoad_AddToSampleSet(instrument->lowNotesSound.sample, numSamples, sampleSet); } if (instrument->normalRangeHi != 0x7F) { - sampleCnt = func_800E4744(instrument->highNotesSound.sample, sampleCnt, sampleList); + numSamples = AudioLoad_AddToSampleSet(instrument->highNotesSound.sample, numSamples, sampleSet); } - sampleCnt = func_800E4744(instrument->normalNotesSound.sample, sampleCnt, sampleList); + numSamples = AudioLoad_AddToSampleSet(instrument->normalNotesSound.sample, numSamples, sampleSet); } } - return sampleCnt; + + // Should really also process sfx, but this method is never called, so whatever. + return numSamples; } -void func_800E48C0(AudioBankSound* sound) { - AudioBankSample* sample = sound->sample; +void AudioLoad_AddUsedSample(SoundFontSound* sound) { + SoundFontSample* sample = sound->sample; - if ((sample->size != 0) && (sample->unk_bits26) && (sample->medium)) { - gAudioContext.unk_0B68[gAudioContext.unk_1768++] = sample; + if ((sample->size != 0) && (sample->unk_bit26) && (sample->medium != MEDIUM_RAM)) { + gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample; } } -void func_800E4918(s32 bankId, s32 arg1, RelocInfo* relocInfo) { +void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, RelocInfo* relocInfo) { s32 numDrums; s32 numInstruments; s32 numSfx; Drum* drum; Instrument* instrument; - AudioBankSound* sound; - AudioStruct0D68* item; - AudioStruct0D68* item2; + SoundFontSound* sound; + AudioPreloadReq* preload; + AudioPreloadReq* topPreload; u8* addr; - s32 count; + s32 size; s32 i; - AudioBankSample* sample; - s32 sp44; + SoundFontSample* sample; + s32 preloadInProgress; s32 nChunks; - sp44 = false; - if (gAudioContext.unk_176C != 0) { - sp44 = true; + preloadInProgress = false; + if (gAudioContext.preloadSampleStackTop != 0) { + preloadInProgress = true; } - gAudioContext.unk_1768 = 0; - numDrums = gAudioContext.ctlEntries[bankId].numDrums; - numInstruments = gAudioContext.ctlEntries[bankId].numInstruments; - numSfx = gAudioContext.ctlEntries[bankId].numSfx; + gAudioContext.numUsedSamples = 0; + + numDrums = gAudioContext.soundFonts[fontId].numDrums; + numInstruments = gAudioContext.soundFonts[fontId].numInstruments; + numSfx = gAudioContext.soundFonts[fontId].numSfx; for (i = 0; i < numInstruments; i++) { - instrument = Audio_GetInstrumentInner(bankId, i); + instrument = Audio_GetInstrumentInner(fontId, i); if (instrument != NULL) { if (instrument->normalRangeLo != 0) { - func_800E48C0(&instrument->lowNotesSound); + AudioLoad_AddUsedSample(&instrument->lowNotesSound); } if (instrument->normalRangeHi != 0x7F) { - func_800E48C0(&instrument->highNotesSound); + AudioLoad_AddUsedSample(&instrument->highNotesSound); } - func_800E48C0(&instrument->normalNotesSound); + AudioLoad_AddUsedSample(&instrument->normalNotesSound); } } for (i = 0; i < numDrums; i++) { - drum = Audio_GetDrum(bankId, i); + drum = Audio_GetDrum(fontId, i); if (drum != NULL) { - func_800E48C0(&drum->sound); + AudioLoad_AddUsedSample(&drum->sound); } } for (i = 0; i < numSfx; i++) { - sound = Audio_GetSfx(bankId, i); + sound = Audio_GetSfx(fontId, i); if (sound != NULL) { - func_800E48C0(sound); + AudioLoad_AddUsedSample(sound); } } - if (gAudioContext.unk_1768 == 0) { + if (gAudioContext.numUsedSamples == 0) { return; } - count = 0; - for (i = 0; i < gAudioContext.unk_1768; i++) { - count += ALIGN16(gAudioContext.unk_0B68[i]->size); + size = 0; + for (i = 0; i < gAudioContext.numUsedSamples; i++) { + size += ALIGN16(gAudioContext.usedSamples[i]->size); } - if (count) {} + if (size) {} - for (i = 0; i < gAudioContext.unk_1768; i++) { - if (gAudioContext.unk_176C == 120) { + for (i = 0; i < gAudioContext.numUsedSamples; i++) { + if (gAudioContext.preloadSampleStackTop == 120) { break; } - sample = gAudioContext.unk_0B68[i]; - if (sample->medium == 0) { + sample = gAudioContext.usedSamples[i]; + if (sample->medium == MEDIUM_RAM) { continue; } - switch (arg1) { - case 0: + switch (async) { + case false: if (sample->medium == relocInfo->medium1) { - addr = func_800E05C4(sample->size, relocInfo->index1, sample->sampleAddr, sample->medium, 1); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr, + sample->medium, CACHE_PERSISTENT); } else if (sample->medium == relocInfo->medium2) { - addr = func_800E05C4(sample->size, relocInfo->index2, sample->sampleAddr, sample->medium, 1); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr, + sample->medium, CACHE_PERSISTENT); } break; - case 1: + case true: if (sample->medium == relocInfo->medium1) { - addr = func_800E05C4(sample->size, relocInfo->index1, sample->sampleAddr, sample->medium, 0); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId1, sample->sampleAddr, + sample->medium, CACHE_TEMPORARY); } else if (sample->medium == relocInfo->medium2) { - addr = func_800E05C4(sample->size, relocInfo->index2, sample->sampleAddr, sample->medium, 0); + addr = AudioHeap_AllocSampleCache(sample->size, relocInfo->sampleBankId2, sample->sampleAddr, + sample->medium, CACHE_TEMPORARY); } break; } @@ -1844,104 +1915,105 @@ void func_800E4918(s32 bankId, s32 arg1, RelocInfo* relocInfo) { continue; } - switch (arg1) { - case 0: - if (sample->medium == 1) { - Audio_NoopCopy((u32)sample->sampleAddr, addr, sample->size, - gAudioContext.audioTable->header.unk_02); + switch (async) { + case false: + if (sample->medium == MEDIUM_UNK) { + AudioLoad_SyncDmaUnkMedium((u32)sample->sampleAddr, addr, sample->size, + gAudioContext.sampleBankTable->unkMediumParam); sample->sampleAddr = addr; - sample->medium = 0; + sample->medium = MEDIUM_RAM; } else { - Audio_DMAFastCopy((u32)sample->sampleAddr, addr, sample->size, sample->medium); + AudioLoad_SyncDma((u32)sample->sampleAddr, addr, sample->size, sample->medium); sample->sampleAddr = addr; - sample->medium = 0; + sample->medium = MEDIUM_RAM; } break; - case 1: - item = &gAudioContext.unk_0D68[gAudioContext.unk_176C]; - item->sample = sample; - item->ramAddr = addr; - item->encodedInfo = (gAudioContext.unk_176C << 24) | 0xFFFFFF; - item->isFree = false; - item->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium; - gAudioContext.unk_176C++; + case true: + preload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop]; + preload->sample = sample; + preload->ramAddr = addr; + preload->encodedInfo = (gAudioContext.preloadSampleStackTop << 24) | 0xFFFFFF; + preload->isFree = false; + preload->endAndMediumKey = (u32)sample->sampleAddr + sample->size + sample->medium; + gAudioContext.preloadSampleStackTop++; break; } } + gAudioContext.numUsedSamples = 0; - gAudioContext.unk_1768 = 0; - if (gAudioContext.unk_176C != 0 && !sp44) { - item2 = &gAudioContext.unk_0D68[gAudioContext.unk_176C - 1]; - sample = item2->sample; + if (gAudioContext.preloadSampleStackTop != 0 && !preloadInProgress) { + topPreload = &gAudioContext.preloadSampleStack[gAudioContext.preloadSampleStackTop - 1]; + sample = topPreload->sample; nChunks = (sample->size >> 12) + 1; - Audio_InitAsyncReq((u32)sample->sampleAddr, item2->ramAddr, sample->size, sample->medium, nChunks, - &gAudioContext.unk_1E78, item2->encodedInfo); + AudioLoad_StartAsyncLoad((u32)sample->sampleAddr, topPreload->ramAddr, sample->size, sample->medium, nChunks, + &gAudioContext.preloadSampleQueue, topPreload->encodedInfo); } } -void func_800E4D94(void) { +void AudioLoad_LoadPermanentSamples(void) { s32 pad; - u32 temp_s2; - AudioTable* audioTable; + u32 fontId; + AudioTable* sampleBankTable; s32 pad2; s32 i; - audioTable = Audio_GetLoadTable(AUDIO_TABLE); - for (i = 0; i < gAudioContext.unk_2D50.unused; i++) { - RelocInfo sp4C; - if (gAudioContext.unk_2D60[i].poolIndex == 1) { - temp_s2 = Audio_GetTableIndex(BANK_TABLE, gAudioContext.unk_2D60[i].id); - sp4C.index1 = gAudioContext.ctlEntries[temp_s2].unk_02; - sp4C.index2 = gAudioContext.ctlEntries[temp_s2].unk_03; + sampleBankTable = AudioLoad_GetLoadTable(SAMPLE_TABLE); + for (i = 0; i < gAudioContext.permanentPool.count; i++) { + RelocInfo relocInfo; - if (sp4C.index1 != 0xFF) { - sp4C.index1 = Audio_GetTableIndex(AUDIO_TABLE, sp4C.index1); - sp4C.medium1 = audioTable->entries[sp4C.index1].unk_08; + if (gAudioContext.permanentCache[i].tableType == FONT_TABLE) { + fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.permanentCache[i].id); + relocInfo.sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + relocInfo.sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + + if (relocInfo.sampleBankId1 != 0xFF) { + relocInfo.sampleBankId1 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId1); + relocInfo.medium1 = sampleBankTable->entries[relocInfo.sampleBankId1].medium; } - if (sp4C.index2 != 0xFF) { - sp4C.index2 = Audio_GetTableIndex(AUDIO_TABLE, sp4C.index2); - sp4C.medium2 = audioTable->entries[sp4C.index2].unk_08; + if (relocInfo.sampleBankId2 != 0xFF) { + relocInfo.sampleBankId2 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId2); + relocInfo.medium2 = sampleBankTable->entries[relocInfo.sampleBankId2].medium; } - func_800E4918(temp_s2, 0, &sp4C); + AudioLoad_PreloadSamplesForFont(fontId, false, &relocInfo); } } } -void func_800E4ED4(void) { +void AudioLoad_Unused3(void) { } -void func_800E4EDC(void) { +void AudioLoad_Unused4(void) { } -void func_800E4EE4(void) { +void AudioLoad_Unused5(void) { } -void func_800E4EEC(s32 tableType, s32 arg1, s8* arg2) { - static u32 D_801304DC = 0; - D_8016B738[D_801304DC] = arg2; - Audio_AsyncLoad(tableType, arg1, 0, D_801304DC, &D_8016B6E0); - D_801304DC++; - if (D_801304DC == 0x10) { - D_801304DC = 0; +void AudioLoad_ScriptLoad(s32 tableType, s32 id, s8* isDone) { + static u32 sLoadIndex = 0; + sScriptLoadDonePointers[sLoadIndex] = isDone; + AudioLoad_AsyncLoad(tableType, id, 0, sLoadIndex, &sScriptLoadQueue); + sLoadIndex++; + if (sLoadIndex == 0x10) { + sLoadIndex = 0; } } -void func_800E4F58(void) { - u32 pad; +void AudioLoad_ProcessScriptLoads(void) { + u32 temp; u32 sp20; - s8* temp_v0; + s8* isDone; - if (osRecvMesg(&D_8016B6E0, (OSMesg*)&sp20, OS_MESG_NOBLOCK) != -1) { - pad = sp20 >> 24; - temp_v0 = D_8016B738[pad]; - if (temp_v0 != NULL) { - *temp_v0 = 0; + if (osRecvMesg(&sScriptLoadQueue, (OSMesg*)&sp20, OS_MESG_NOBLOCK) != -1) { + temp = sp20 >> 24; + isDone = sScriptLoadDonePointers[temp]; + if (isDone != NULL) { + *isDone = 0; } } } -void func_800E4FB0(void) { - osCreateMesgQueue(&D_8016B6E0, D_8016B6F8, 0x10); +void AudioLoad_InitScriptLoads(void) { + osCreateMesgQueue(&sScriptLoadQueue, sScriptLoadMesgBuf, ARRAY_COUNT(sScriptLoadMesgBuf)); } diff --git a/src/code/audio_playback.c b/src/code/audio_playback.c index 573c0d810e..4edc18db38 100644 --- a/src/code/audio_playback.c +++ b/src/code/audio_playback.c @@ -17,8 +17,8 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { reverbVol = attrs->reverbVol; sp24 = attrs->stereo.s; - sub->bitField0.s = note->noteSubEu.bitField0.s; - sub->bitField1.s = note->noteSubEu.bitField1.s; + sub->bitField0 = note->noteSubEu.bitField0; + sub->bitField1 = note->noteSubEu.bitField1; sub->sound.samples = note->noteSubEu.sound.samples; sub->unk_06 = note->noteSubEu.unk_06; @@ -26,10 +26,10 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { pan &= 0x7F; - sub->bitField0.s.stereoStrongRight = false; - sub->bitField0.s.stereoStrongLeft = false; - sub->bitField0.s.stereoHeadsetEffects = sp24.stereoHeadsetEffects; - sub->bitField0.s.usesHeadsetPanEffects = sp24.usesHeadsetPanEffects; + sub->bitField0.stereoStrongRight = false; + sub->bitField0.stereoStrongLeft = false; + sub->bitField0.stereoHeadsetEffects = sp24.stereoHeadsetEffects; + sub->bitField0.usesHeadsetPanEffects = sp24.usesHeadsetPanEffects; if (stereoHeadsetEffects && gAudioContext.soundMode == 1) { smallPanIndex = pan >> 1; if (smallPanIndex > 0x3F) { @@ -38,7 +38,7 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { sub->headsetPanLeft = gHeadsetPanQuantization[smallPanIndex]; sub->headsetPanRight = gHeadsetPanQuantization[0x3F - smallPanIndex]; - sub->bitField1.s.usesHeadsetPanEffects2 = true; + sub->bitField1.usesHeadsetPanEffects2 = true; volLeft = gHeadsetPanVolume[pan]; volRight = gHeadsetPanVolume[0x7F - pan]; @@ -46,7 +46,7 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { strongLeft = strongRight = 0; sub->headsetPanRight = 0; sub->headsetPanLeft = 0; - sub->bitField1.s.usesHeadsetPanEffects2 = false; + sub->bitField1.usesHeadsetPanEffects2 = false; volLeft = gStereoPanVolume[pan]; volRight = gStereoPanVolume[0x7F - pan]; @@ -56,34 +56,34 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { strongRight = 1; } - sub->bitField0.s.stereoStrongRight = strongRight; - sub->bitField0.s.stereoStrongLeft = strongLeft; + sub->bitField0.stereoStrongRight = strongRight; + sub->bitField0.stereoStrongLeft = strongLeft; switch (sp24.bit2) { case 0: break; case 1: - sub->bitField0.s.stereoStrongRight = sp24.strongRight; - sub->bitField0.s.stereoStrongLeft = sp24.strongLeft; + sub->bitField0.stereoStrongRight = sp24.strongRight; + sub->bitField0.stereoStrongLeft = sp24.strongLeft; break; case 2: - sub->bitField0.s.stereoStrongRight = sp24.strongRight | strongRight; - sub->bitField0.s.stereoStrongLeft = sp24.strongLeft | strongLeft; + sub->bitField0.stereoStrongRight = sp24.strongRight | strongRight; + sub->bitField0.stereoStrongLeft = sp24.strongLeft | strongLeft; break; case 3: - sub->bitField0.s.stereoStrongRight = sp24.strongRight ^ strongRight; - sub->bitField0.s.stereoStrongLeft = sp24.strongLeft ^ strongLeft; + sub->bitField0.stereoStrongRight = sp24.strongRight ^ strongRight; + sub->bitField0.stereoStrongLeft = sp24.strongLeft ^ strongLeft; break; } } else if (gAudioContext.soundMode == 3) { - sub->bitField0.s.stereoHeadsetEffects = false; - sub->bitField0.s.usesHeadsetPanEffects = false; + sub->bitField0.stereoHeadsetEffects = false; + sub->bitField0.usesHeadsetPanEffects = false; volLeft = 0.707f; // approx 1/sqrt(2) volRight = 0.707f; } else { - sub->bitField0.s.stereoStrongRight = sp24.strongRight; - sub->bitField0.s.stereoStrongLeft = sp24.strongLeft; + sub->bitField0.stereoStrongRight = sp24.strongRight; + sub->bitField0.stereoStrongLeft = sp24.strongLeft; volLeft = gDefaultPanVolume[pan]; volRight = gDefaultPanVolume[0x7F - pan]; } @@ -105,7 +105,7 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput) f32 resamplingRate = 0.0f; if (resamplingRateInput < 2.0f) { - noteSubEu->bitField1.s.hasTwoAdpcmParts = false; + noteSubEu->bitField1.hasTwoParts = false; if (1.99998f < resamplingRateInput) { resamplingRate = 1.99998f; @@ -114,7 +114,7 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput) } } else { - noteSubEu->bitField1.s.hasTwoAdpcmParts = true; + noteSubEu->bitField1.hasTwoParts = true; if (3.99996f < resamplingRateInput) { resamplingRate = 1.99998f; } else { @@ -126,11 +126,11 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput) void Audio_NoteInit(Note* note) { if (note->playbackState.parentLayer->adsr.releaseRate == 0) { - Audio_AdsrInit(¬e->playbackState.adsr, note->playbackState.parentLayer->seqChannel->adsr.envelope, - ¬e->playbackState.adsrVolScale); + Audio_AdsrInit(¬e->playbackState.adsr, note->playbackState.parentLayer->channel->adsr.envelope, + ¬e->playbackState.adsrVolScaleUnused); } else { Audio_AdsrInit(¬e->playbackState.adsr, note->playbackState.parentLayer->adsr.envelope, - ¬e->playbackState.adsrVolScale); + ¬e->playbackState.adsrVolScaleUnused); } note->playbackState.unk_04 = 0; @@ -139,13 +139,13 @@ void Audio_NoteInit(Note* note) { } void Audio_NoteDisable(Note* note) { - if (note->noteSubEu.bitField0.s.needsInit == true) { - note->noteSubEu.bitField0.s.needsInit = false; + if (note->noteSubEu.bitField0.needsInit == true) { + note->noteSubEu.bitField0.needsInit = false; } note->playbackState.priority = 0; - note->noteSubEu.bitField0.s.enabled = false; + note->noteSubEu.bitField0.enabled = false; note->playbackState.unk_04 = 0; - note->noteSubEu.bitField0.s.finished = false; + note->noteSubEu.bitField0.finished = false; note->playbackState.parentLayer = NO_LAYER; note->playbackState.prevParentLayer = NO_LAYER; note->playbackState.adsr.action.s.state = ADSR_STATE_DISABLED; @@ -164,7 +164,7 @@ void Audio_ProcessNotes(void) { f32 scale; s32 i; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { note = &gAudioContext.notes[i]; noteSubEu2 = &gAudioContext.noteSubsEu[gAudioContext.noteSubEuOffset + i]; playbackState = ¬e->playbackState; @@ -182,19 +182,19 @@ void Audio_ProcessNotes(void) { } else if (!playbackState->parentLayer->enabled && playbackState->unk_04 == 0 && playbackState->priority >= 1) { // do nothing - } else if (playbackState->parentLayer->seqChannel->seqPlayer == NULL) { - Audio_SequenceChannelDisable(playbackState->parentLayer->seqChannel); + } else if (playbackState->parentLayer->channel->seqPlayer == NULL) { + AudioSeq_SequenceChannelDisable(playbackState->parentLayer->channel); playbackState->priority = 1; playbackState->unk_04 = 1; continue; - } else if (playbackState->parentLayer->seqChannel->seqPlayer->muted && - (playbackState->parentLayer->seqChannel->muteBehavior & 0x40)) { + } else if (playbackState->parentLayer->channel->seqPlayer->muted && + (playbackState->parentLayer->channel->muteBehavior & 0x40)) { // do nothing } else { goto out; } - Audio_SeqChanLayerNoteRelease(playbackState->parentLayer); + Audio_SeqLayerNoteRelease(playbackState->parentLayer); Audio_AudioListRemove(¬e->listItem); Audio_AudioListPushFront(¬e->listItem.pool->decaying, ¬e->listItem); playbackState->priority = 1; @@ -207,22 +207,22 @@ void Audio_ProcessNotes(void) { if (playbackState->priority != 0) { if (1) {} noteSubEu = ¬e->noteSubEu; - if (playbackState->unk_04 >= 1 || noteSubEu->bitField0.s.finished) { - if (playbackState->adsr.action.s.state == ADSR_STATE_DISABLED || noteSubEu->bitField0.s.finished) { + if (playbackState->unk_04 >= 1 || noteSubEu->bitField0.finished) { + if (playbackState->adsr.action.s.state == ADSR_STATE_DISABLED || noteSubEu->bitField0.finished) { if (playbackState->wantedParentLayer != NO_LAYER) { Audio_NoteDisable(note); - if (playbackState->wantedParentLayer->seqChannel != NULL) { + if (playbackState->wantedParentLayer->channel != NULL) { Audio_NoteInitForLayer(note, playbackState->wantedParentLayer); Audio_NoteVibratoInit(note); Audio_NotePortamentoInit(note); Audio_AudioListRemove(¬e->listItem); - Audio_AudioListPushBack(¬e->listItem.pool->active, ¬e->listItem); + AudioSeq_AudioListPushBack(¬e->listItem.pool->active, ¬e->listItem); playbackState->wantedParentLayer = NO_LAYER; // don't skip } else { Audio_NoteDisable(note); Audio_AudioListRemove(¬e->listItem); - Audio_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); + AudioSeq_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); playbackState->wantedParentLayer = NO_LAYER; goto skip; } @@ -232,7 +232,7 @@ void Audio_ProcessNotes(void) { } Audio_NoteDisable(note); Audio_AudioListRemove(¬e->listItem); - Audio_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); + AudioSeq_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); continue; } } @@ -242,7 +242,7 @@ void Audio_ProcessNotes(void) { } Audio_NoteDisable(note); Audio_AudioListRemove(¬e->listItem); - Audio_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); + AudioSeq_AudioListPushBack(¬e->listItem.pool->disabled, ¬e->listItem); continue; } @@ -259,10 +259,10 @@ void Audio_ProcessNotes(void) { subAttrs.filter = attrs->filter; subAttrs.unk_14 = attrs->unk_4; subAttrs.unk_16 = attrs->unk_6; - bookOffset = noteSubEu->bitField1.s.bookOffset; + bookOffset = noteSubEu->bitField1.bookOffset; } else { - SequenceChannelLayer* layer = playbackState->parentLayer; - SequenceChannel* channel = layer->seqChannel; + SequenceLayer* layer = playbackState->parentLayer; + SequenceChannel* channel = layer->channel; subAttrs.frequency = layer->noteFreqScale; subAttrs.velocity = layer->noteVelocity; @@ -289,14 +289,14 @@ void Audio_ProcessNotes(void) { subAttrs.frequency *= gAudioContext.audioBufferParameters.resampleRate; subAttrs.velocity *= scale; Audio_InitNoteSub(note, noteSubEu2, &subAttrs); - noteSubEu->bitField1.s.bookOffset = bookOffset; + noteSubEu->bitField1.bookOffset = bookOffset; skip:; } } } -AudioBankSound* Audio_InstrumentGetAudioBankSound(Instrument* instrument, s32 semitone) { - AudioBankSound* sound; +SoundFontSound* Audio_InstrumentGetSound(Instrument* instrument, s32 semitone) { + SoundFontSound* sound; if (semitone < instrument->normalRangeLo) { sound = &instrument->lowNotesSound; } else if (semitone <= instrument->normalRangeHi) { @@ -307,85 +307,85 @@ AudioBankSound* Audio_InstrumentGetAudioBankSound(Instrument* instrument, s32 se return sound; } -Instrument* Audio_GetInstrumentInner(s32 bankId, s32 instId) { +Instrument* Audio_GetInstrumentInner(s32 fontId, s32 instId) { Instrument* inst; - if (bankId == 0xFF) { + if (fontId == 0xFF) { return NULL; } - if (!Audio_IsBankLoadComplete(bankId)) { - gAudioContext.audioErrorFlags = bankId + 0x10000000; + if (!AudioLoad_IsFontLoadComplete(fontId)) { + gAudioContext.audioErrorFlags = fontId + 0x10000000; return NULL; } - if (instId >= gAudioContext.ctlEntries[bankId].numInstruments) { - gAudioContext.audioErrorFlags = ((bankId << 8) + instId) + 0x3000000; + if (instId >= gAudioContext.soundFonts[fontId].numInstruments) { + gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x3000000; return NULL; } - inst = gAudioContext.ctlEntries[bankId].instruments[instId]; + inst = gAudioContext.soundFonts[fontId].instruments[instId]; if (inst == NULL) { - gAudioContext.audioErrorFlags = ((bankId << 8) + instId) + 0x1000000; + gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x1000000; return inst; } return inst; } -Drum* Audio_GetDrum(s32 bankId, s32 drumId) { +Drum* Audio_GetDrum(s32 fontId, s32 drumId) { Drum* drum; - if (bankId == 0xFF) { + if (fontId == 0xFF) { return NULL; } - if (!Audio_IsBankLoadComplete(bankId)) { - gAudioContext.audioErrorFlags = bankId + 0x10000000; + if (!AudioLoad_IsFontLoadComplete(fontId)) { + gAudioContext.audioErrorFlags = fontId + 0x10000000; return NULL; } - if (drumId >= gAudioContext.ctlEntries[bankId].numDrums) { - gAudioContext.audioErrorFlags = ((bankId << 8) + drumId) + 0x4000000; + if (drumId >= gAudioContext.soundFonts[fontId].numDrums) { + gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x4000000; return NULL; } - if ((u32)gAudioContext.ctlEntries[bankId].drums < 0x80000000) { + if ((u32)gAudioContext.soundFonts[fontId].drums < 0x80000000) { return NULL; } - drum = gAudioContext.ctlEntries[bankId].drums[drumId]; + drum = gAudioContext.soundFonts[fontId].drums[drumId]; if (drum == NULL) { - gAudioContext.audioErrorFlags = ((bankId << 8) + drumId) + 0x5000000; + gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x5000000; } return drum; } -AudioBankSound* Audio_GetSfx(s32 bankId, s32 sfxId) { - AudioBankSound* sfx; +SoundFontSound* Audio_GetSfx(s32 fontId, s32 sfxId) { + SoundFontSound* sfx; - if (bankId == 0xFF) { + if (fontId == 0xFF) { return NULL; } - if (!Audio_IsBankLoadComplete(bankId)) { - gAudioContext.audioErrorFlags = bankId + 0x10000000; + if (!AudioLoad_IsFontLoadComplete(fontId)) { + gAudioContext.audioErrorFlags = fontId + 0x10000000; return NULL; } - if (sfxId >= gAudioContext.ctlEntries[bankId].numSfx) { - gAudioContext.audioErrorFlags = ((bankId << 8) + sfxId) + 0x4000000; + if (sfxId >= gAudioContext.soundFonts[fontId].numSfx) { + gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x4000000; return NULL; } - if ((u32)gAudioContext.ctlEntries[bankId].soundEffects < 0x80000000) { + if ((u32)gAudioContext.soundFonts[fontId].soundEffects < 0x80000000) { return NULL; } - sfx = &gAudioContext.ctlEntries[bankId].soundEffects[sfxId]; + sfx = &gAudioContext.soundFonts[fontId].soundEffects[sfxId]; if (sfx == NULL) { - gAudioContext.audioErrorFlags = ((bankId << 8) + sfxId) + 0x5000000; + gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x5000000; } if (sfx->sample == NULL) { @@ -395,67 +395,67 @@ AudioBankSound* Audio_GetSfx(s32 bankId, s32 sfxId) { return sfx; } -s32 func_800E7744(s32 instrument, s32 bankId, s32 instId, void* arg3) { - if (bankId == 0xFF) { +s32 Audio_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, void* value) { + if (fontId == 0xFF) { return -1; } - if (!Audio_IsBankLoadComplete(bankId)) { + if (!AudioLoad_IsFontLoadComplete(fontId)) { return -2; } - switch (instrument) { + switch (instrumentType) { case 0: - if (instId >= gAudioContext.ctlEntries[bankId].numDrums) { + if (index >= gAudioContext.soundFonts[fontId].numDrums) { return -3; } - gAudioContext.ctlEntries[bankId].drums[instId] = arg3; + gAudioContext.soundFonts[fontId].drums[index] = value; break; case 1: - if (instId >= gAudioContext.ctlEntries[bankId].numSfx) { + if (index >= gAudioContext.soundFonts[fontId].numSfx) { return -3; } - gAudioContext.ctlEntries[bankId].soundEffects[instId] = *(AudioBankSound*)arg3; + gAudioContext.soundFonts[fontId].soundEffects[index] = *(SoundFontSound*)value; break; default: - if (instId >= gAudioContext.ctlEntries[bankId].numInstruments) { + if (index >= gAudioContext.soundFonts[fontId].numInstruments) { return -3; } - gAudioContext.ctlEntries[bankId].instruments[instId] = arg3; + gAudioContext.soundFonts[fontId].instruments[index] = value; break; } return 0; } -void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) { +void Audio_SeqLayerDecayRelease(SequenceLayer* layer, s32 target) { Note* note; NoteAttributes* attrs; SequenceChannel* chan; s32 i; - if (seqLayer == NO_LAYER) { + if (layer == NO_LAYER) { return; } - seqLayer->bit3 = false; + layer->bit3 = false; - if (seqLayer->note == NULL) { + if (layer->note == NULL) { return; } - note = seqLayer->note; + note = layer->note; attrs = ¬e->playbackState.attributes; - if (note->playbackState.wantedParentLayer == seqLayer) { + if (note->playbackState.wantedParentLayer == layer) { note->playbackState.wantedParentLayer = NO_LAYER; } - if (note->playbackState.parentLayer != seqLayer) { + if (note->playbackState.parentLayer != layer) { if (note->playbackState.parentLayer == NO_LAYER && note->playbackState.wantedParentLayer == NO_LAYER && - note->playbackState.prevParentLayer == seqLayer && target != ADSR_STATE_DECAY) { + note->playbackState.prevParentLayer == layer && target != ADSR_STATE_DECAY) { note->playbackState.adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv; note->playbackState.adsr.action.s.release = true; } @@ -463,12 +463,12 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) } if (note->playbackState.adsr.action.s.state != ADSR_STATE_DECAY) { - attrs->freqScale = seqLayer->noteFreqScale; - attrs->velocity = seqLayer->noteVelocity; - attrs->pan = seqLayer->notePan; + attrs->freqScale = layer->noteFreqScale; + attrs->velocity = layer->noteVelocity; + attrs->pan = layer->notePan; - if (seqLayer->seqChannel != NULL) { - chan = seqLayer->seqChannel; + if (layer->channel != NULL) { + chan = layer->channel; attrs->reverb = chan->reverb; attrs->unk_1 = chan->unk_0C; attrs->filter = chan->filter; @@ -483,17 +483,17 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) attrs->unk_6 = chan->unk_20; attrs->unk_4 = chan->unk_0F; if (chan->seqPlayer->muted && (chan->muteBehavior & 8)) { - note->noteSubEu.bitField0.s.finished = true; + note->noteSubEu.bitField0.finished = true; } - if (seqLayer->stereo.asByte == 0) { + if (layer->stereo.asByte == 0) { attrs->stereo = chan->stereo; } else { - attrs->stereo = seqLayer->stereo; + attrs->stereo = layer->stereo; } note->playbackState.priority = chan->someOtherPriority; } else { - attrs->stereo = seqLayer->stereo; + attrs->stereo = layer->stereo; note->playbackState.priority = 1; } @@ -506,13 +506,13 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) } else { note->playbackState.unk_04 = 1; note->playbackState.adsr.action.s.decay = true; - if (seqLayer->adsr.releaseRate == 0) { - note->playbackState.adsr.fadeOutVel = gAudioContext.unk_3520[seqLayer->seqChannel->adsr.releaseRate]; + if (layer->adsr.releaseRate == 0) { + note->playbackState.adsr.fadeOutVel = gAudioContext.unk_3520[layer->channel->adsr.releaseRate]; } else { - note->playbackState.adsr.fadeOutVel = gAudioContext.unk_3520[seqLayer->adsr.releaseRate]; + note->playbackState.adsr.fadeOutVel = gAudioContext.unk_3520[layer->adsr.releaseRate]; } note->playbackState.adsr.sustain = - ((f32)(s32)(seqLayer->seqChannel->adsr.sustain) * note->playbackState.adsr.current) / 256.0f; + ((f32)(s32)(layer->channel->adsr.sustain) * note->playbackState.adsr.current) / 256.0f; } } @@ -522,15 +522,15 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) } } -void Audio_SeqChanLayerNoteDecay(SequenceChannelLayer* seqLayer) { - Audio_SeqChanLayerDecayRelease(seqLayer, ADSR_STATE_DECAY); +void Audio_SeqLayerNoteDecay(SequenceLayer* layer) { + Audio_SeqLayerDecayRelease(layer, ADSR_STATE_DECAY); } -void Audio_SeqChanLayerNoteRelease(SequenceChannelLayer* seqLayer) { - Audio_SeqChanLayerDecayRelease(seqLayer, ADSR_STATE_RELEASE); +void Audio_SeqLayerNoteRelease(SequenceLayer* layer) { + Audio_SeqLayerDecayRelease(layer, ADSR_STATE_RELEASE); } -s32 Audio_BuildSyntheticWave(Note* note, SequenceChannelLayer* seqLayer, s32 waveId) { +s32 Audio_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveId) { f32 freqScale; f32 ratio; u8 sampleCountIndex; @@ -539,9 +539,9 @@ s32 Audio_BuildSyntheticWave(Note* note, SequenceChannelLayer* seqLayer, s32 wav waveId = 128; } - freqScale = seqLayer->freqScale; - if (seqLayer->portamento.mode != 0 && 0.0f < seqLayer->portamento.extent) { - freqScale *= (seqLayer->portamento.extent + 1.0f); + freqScale = layer->freqScale; + if (layer->portamento.mode != 0 && 0.0f < layer->portamento.extent) { + freqScale *= (layer->portamento.extent + 1.0f); } if (freqScale < 0.99999f) { sampleCountIndex = 0; @@ -556,7 +556,7 @@ s32 Audio_BuildSyntheticWave(Note* note, SequenceChannelLayer* seqLayer, s32 wav sampleCountIndex = 3; ratio = 0.13081f; } - seqLayer->freqScale *= ratio; + layer->freqScale *= ratio; note->playbackState.waveId = waveId; note->playbackState.sampleCountIndex = sampleCountIndex; @@ -565,17 +565,17 @@ s32 Audio_BuildSyntheticWave(Note* note, SequenceChannelLayer* seqLayer, s32 wav return sampleCountIndex; } -void Audio_InitSyntheticWave(Note* note, SequenceChannelLayer* seqLayer) { +void Audio_InitSyntheticWave(Note* note, SequenceLayer* layer) { s32 sampleCountIndex; s32 waveSampleCountIndex; - s32 waveId = seqLayer->instOrWave; + s32 waveId = layer->instOrWave; if (waveId == 0xFF) { - waveId = seqLayer->seqChannel->instOrWave; + waveId = layer->channel->instOrWave; } sampleCountIndex = note->playbackState.sampleCountIndex; - waveSampleCountIndex = Audio_BuildSyntheticWave(note, seqLayer, waveId); + waveSampleCountIndex = Audio_BuildSyntheticWave(note, layer, waveId); if (waveSampleCountIndex != sampleCountIndex) { note->noteSubEu.unk_06 = waveSampleCountIndex * 4 + sampleCountIndex; @@ -603,10 +603,10 @@ void Audio_InitNoteFreeList(void) { s32 i; Audio_InitNoteLists(&gAudioContext.noteFreeLists); - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { gAudioContext.notes[i].listItem.u.value = &gAudioContext.notes[i]; gAudioContext.notes[i].listItem.prev = NULL; - Audio_AudioListPushBack(&gAudioContext.noteFreeLists.disabled, &gAudioContext.notes[i].listItem); + AudioSeq_AudioListPushBack(&gAudioContext.noteFreeLists.disabled, &gAudioContext.notes[i].listItem); } } @@ -645,7 +645,7 @@ void Audio_NotePoolClear(NotePool* pool) { break; } Audio_AudioListRemove(cur); - Audio_AudioListPushBack(dest, cur); + AudioSeq_AudioListPushBack(dest, cur); } } } @@ -687,11 +687,11 @@ void Audio_NotePoolFill(NotePool* pool, s32 count) { } while (j < count) { - note = Audio_AudioListPopBack(source); + note = AudioSeq_AudioListPopBack(source); if (note == NULL) { break; } - Audio_AudioListPushBack(dest, ¬e->listItem); + AudioSeq_AudioListPushBack(dest, ¬e->listItem); j++; } } @@ -718,7 +718,7 @@ void Audio_AudioListRemove(AudioListItem* item) { } } -Note* Audio_PopNodeWithValueLessEqual(AudioListItem* list, s32 limit) { +Note* Audio_FindNodeWithPrioLessThan(AudioListItem* list, s32 limit) { AudioListItem* cur = list->next; AudioListItem* best; @@ -743,89 +743,90 @@ Note* Audio_PopNodeWithValueLessEqual(AudioListItem* list, s32 limit) { return best->u.value; } -void Audio_NoteInitForLayer(Note* note, SequenceChannelLayer* seqLayer) { +void Audio_NoteInitForLayer(Note* note, SequenceLayer* layer) { s32 pad[3]; s16 instId; NotePlaybackState* playback = ¬e->playbackState; NoteSubEu* sub = ¬e->noteSubEu; note->playbackState.prevParentLayer = NO_LAYER; - note->playbackState.parentLayer = seqLayer; - playback->priority = seqLayer->seqChannel->notePriority; - seqLayer->notePropertiesNeedInit = true; - seqLayer->bit3 = true; - seqLayer->note = note; - seqLayer->seqChannel->noteUnused = note; - seqLayer->seqChannel->layerUnused = seqLayer; - seqLayer->noteVelocity = 0.0f; + note->playbackState.parentLayer = layer; + playback->priority = layer->channel->notePriority; + layer->notePropertiesNeedInit = true; + layer->bit3 = true; + layer->note = note; + layer->channel->noteUnused = note; + layer->channel->layerUnused = layer; + layer->noteVelocity = 0.0f; Audio_NoteInit(note); - instId = seqLayer->instOrWave; + instId = layer->instOrWave; if (instId == 0xFF) { - instId = seqLayer->seqChannel->instOrWave; + instId = layer->channel->instOrWave; } - sub->sound.audioBankSound = seqLayer->sound; + sub->sound.soundFontSound = layer->sound; if (instId >= 0x80 && instId < 0xC0) { - sub->bitField1.s.isSyntheticWave = true; + sub->bitField1.isSyntheticWave = true; } else { - sub->bitField1.s.isSyntheticWave = false; + sub->bitField1.isSyntheticWave = false; } - if (sub->bitField1.s.isSyntheticWave) { - Audio_BuildSyntheticWave(note, seqLayer, instId); + if (sub->bitField1.isSyntheticWave) { + Audio_BuildSyntheticWave(note, layer, instId); } - playback->bankId = seqLayer->seqChannel->bankId; - playback->stereoHeadsetEffects = seqLayer->seqChannel->stereoHeadsetEffects; - sub->bitField1.s.reverbIndex = seqLayer->seqChannel->reverbIndex & 3; + playback->fontId = layer->channel->fontId; + playback->stereoHeadsetEffects = layer->channel->stereoHeadsetEffects; + sub->bitField1.reverbIndex = layer->channel->reverbIndex & 3; } -void func_800E82C0(Note* note, SequenceChannelLayer* seqLayer) { - Audio_SeqChanLayerNoteRelease(note->playbackState.parentLayer); - note->playbackState.wantedParentLayer = seqLayer; +void func_800E82C0(Note* note, SequenceLayer* layer) { + // similar to Audio_NoteReleaseAndTakeOwnership, hard to say what the difference is + Audio_SeqLayerNoteRelease(note->playbackState.parentLayer); + note->playbackState.wantedParentLayer = layer; } -void Audio_NoteReleaseAndTakeOwnership(Note* note, SequenceChannelLayer* seqLayer) { - note->playbackState.wantedParentLayer = seqLayer; - note->playbackState.priority = seqLayer->seqChannel->notePriority; +void Audio_NoteReleaseAndTakeOwnership(Note* note, SequenceLayer* layer) { + note->playbackState.wantedParentLayer = layer; + note->playbackState.priority = layer->channel->notePriority; note->playbackState.adsr.fadeOutVel = gAudioContext.audioBufferParameters.updatesPerFrameInv; note->playbackState.adsr.action.s.release = true; } -Note* Audio_AllocNoteFromDisabled(NotePool* pool, SequenceChannelLayer* seqLayer) { - Note* note = Audio_AudioListPopBack(&pool->disabled); +Note* Audio_AllocNoteFromDisabled(NotePool* pool, SequenceLayer* layer) { + Note* note = AudioSeq_AudioListPopBack(&pool->disabled); if (note != NULL) { - Audio_NoteInitForLayer(note, seqLayer); + Audio_NoteInitForLayer(note, layer); Audio_AudioListPushFront(&pool->active, ¬e->listItem); } return note; } -Note* Audio_AllocNoteFromDecaying(NotePool* pool, SequenceChannelLayer* seqLayer) { - Note* note = Audio_AudioListPopBack(&pool->decaying); +Note* Audio_AllocNoteFromDecaying(NotePool* pool, SequenceLayer* layer) { + Note* note = AudioSeq_AudioListPopBack(&pool->decaying); if (note != NULL) { - Audio_NoteReleaseAndTakeOwnership(note, seqLayer); - Audio_AudioListPushBack(&pool->releasing, ¬e->listItem); + Audio_NoteReleaseAndTakeOwnership(note, layer); + AudioSeq_AudioListPushBack(&pool->releasing, ¬e->listItem); } return note; } -Note* Audio_AllocNoteFromActive(NotePool* pool, SequenceChannelLayer* seqLayer) { +Note* Audio_AllocNoteFromActive(NotePool* pool, SequenceLayer* layer) { Note* rNote; Note* aNote; s32 rPriority; s32 aPriority; rPriority = aPriority = 0x10; - rNote = Audio_PopNodeWithValueLessEqual(&pool->releasing, seqLayer->seqChannel->notePriority); + rNote = Audio_FindNodeWithPrioLessThan(&pool->releasing, layer->channel->notePriority); if (rNote != NULL) { rPriority = rNote->playbackState.priority; } - aNote = Audio_PopNodeWithValueLessEqual(&pool->active, seqLayer->seqChannel->notePriority); + aNote = Audio_FindNodeWithPrioLessThan(&pool->active, layer->channel->notePriority); if (aNote != NULL) { aPriority = aNote->playbackState.priority; @@ -837,76 +838,76 @@ Note* Audio_AllocNoteFromActive(NotePool* pool, SequenceChannelLayer* seqLayer) if (aPriority < rPriority) { Audio_AudioListRemove(&aNote->listItem); - func_800E82C0(aNote, seqLayer); - Audio_AudioListPushBack(&pool->releasing, &aNote->listItem); - aNote->playbackState.priority = seqLayer->seqChannel->notePriority; + func_800E82C0(aNote, layer); + AudioSeq_AudioListPushBack(&pool->releasing, &aNote->listItem); + aNote->playbackState.priority = layer->channel->notePriority; return aNote; } - rNote->playbackState.wantedParentLayer = seqLayer; - rNote->playbackState.priority = seqLayer->seqChannel->notePriority; + rNote->playbackState.wantedParentLayer = layer; + rNote->playbackState.priority = layer->channel->notePriority; return rNote; } -Note* Audio_AllocNote(SequenceChannelLayer* seqLayer) { +Note* Audio_AllocNote(SequenceLayer* layer) { Note* ret; - u32 policy = seqLayer->seqChannel->noteAllocPolicy; + u32 policy = layer->channel->noteAllocPolicy; if (policy & 1) { - ret = seqLayer->note; - if (ret != NULL && ret->playbackState.prevParentLayer == seqLayer && + ret = layer->note; + if (ret != NULL && ret->playbackState.prevParentLayer == layer && ret->playbackState.wantedParentLayer == NO_LAYER) { - Audio_NoteReleaseAndTakeOwnership(ret, seqLayer); + Audio_NoteReleaseAndTakeOwnership(ret, layer); Audio_AudioListRemove(&ret->listItem); - Audio_AudioListPushBack(&ret->listItem.pool->releasing, &ret->listItem); + AudioSeq_AudioListPushBack(&ret->listItem.pool->releasing, &ret->listItem); return ret; } } if (policy & 2) { - if (!(ret = Audio_AllocNoteFromDisabled(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&seqLayer->seqChannel->notePool, seqLayer))) { + if (!(ret = Audio_AllocNoteFromDisabled(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromActive(&layer->channel->notePool, layer))) { goto null_return; } return ret; } if (policy & 4) { - if (!(ret = Audio_AllocNoteFromDisabled(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDisabled(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer))) { + if (!(ret = Audio_AllocNoteFromDisabled(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromDisabled(&layer->channel->seqPlayer->notePool, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&layer->channel->seqPlayer->notePool, layer)) && + !(ret = Audio_AllocNoteFromActive(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromActive(&layer->channel->seqPlayer->notePool, layer))) { goto null_return; } return ret; } if (policy & 8) { - if (!(ret = Audio_AllocNoteFromDisabled(&gAudioContext.noteFreeLists, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&gAudioContext.noteFreeLists, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&gAudioContext.noteFreeLists, seqLayer))) { + if (!(ret = Audio_AllocNoteFromDisabled(&gAudioContext.noteFreeLists, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&gAudioContext.noteFreeLists, layer)) && + !(ret = Audio_AllocNoteFromActive(&gAudioContext.noteFreeLists, layer))) { goto null_return; } return ret; } - if (!(ret = Audio_AllocNoteFromDisabled(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDisabled(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDisabled(&gAudioContext.noteFreeLists, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromDecaying(&gAudioContext.noteFreeLists, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&seqLayer->seqChannel->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&seqLayer->seqChannel->seqPlayer->notePool, seqLayer)) && - !(ret = Audio_AllocNoteFromActive(&gAudioContext.noteFreeLists, seqLayer))) { + if (!(ret = Audio_AllocNoteFromDisabled(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromDisabled(&layer->channel->seqPlayer->notePool, layer)) && + !(ret = Audio_AllocNoteFromDisabled(&gAudioContext.noteFreeLists, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&layer->channel->seqPlayer->notePool, layer)) && + !(ret = Audio_AllocNoteFromDecaying(&gAudioContext.noteFreeLists, layer)) && + !(ret = Audio_AllocNoteFromActive(&layer->channel->notePool, layer)) && + !(ret = Audio_AllocNoteFromActive(&layer->channel->seqPlayer->notePool, layer)) && + !(ret = Audio_AllocNoteFromActive(&gAudioContext.noteFreeLists, layer))) { goto null_return; } return ret; null_return: - seqLayer->bit3 = true; + layer->bit3 = true; return NULL; } @@ -914,7 +915,7 @@ void Audio_NoteInitAll(void) { Note* note; s32 i; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { note = &gAudioContext.notes[i]; note->noteSubEu = gZeroNoteSub; note->playbackState.priority = 0; @@ -924,13 +925,13 @@ void Audio_NoteInitAll(void) { note->playbackState.prevParentLayer = NO_LAYER; note->playbackState.waveId = 0; note->playbackState.attributes.velocity = 0.0f; - note->playbackState.adsrVolScale = 0; + note->playbackState.adsrVolScaleUnused = 0; note->playbackState.adsr.action.asByte = 0; note->vibratoState.active = 0; note->portamento.cur = 0; note->portamento.speed = 0; note->playbackState.stereoHeadsetEffects = false; note->unk_BC = 0; - note->synthesisState.synthesisBuffers = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 0x1E0); + note->synthesisState.synthesisBuffers = AudioHeap_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 0x1E0); } } diff --git a/src/code/audio_seqplayer.c b/src/code/audio_seqplayer.c index 64b8b95314..cce9333bce 100644 --- a/src/code/audio_seqplayer.c +++ b/src/code/audio_seqplayer.c @@ -11,30 +11,28 @@ extern u8 D_80130470[]; -u8 Audio_M64ReadU8(M64ScriptState* state); +u8 AudioSeq_ScriptReadU8(SeqScriptState* state); +s16 AudioSeq_ScriptReadS16(SeqScriptState* state); +u16 AudioSeq_ScriptReadCompressedU16(SeqScriptState* state); -s16 Audio_M64ReadS16(M64ScriptState* state); +u8 AudioSeq_GetInstrument(SequenceChannel* channel, u8 instId, Instrument** instOut, AdsrSettings* adsr); -u16 Audio_M64ReadCompressedU16(M64ScriptState* state); - -u8 Audio_GetInstrument(SequenceChannel* seqChannel, u8 instId, Instrument** instOut, AdsrSettings* adsr); - -u16 Audio_GetScriptControlFlowArgument(M64ScriptState* state, u8 arg1) { +u16 AudioSeq_GetScriptControlFlowArgument(SeqScriptState* state, u8 arg1) { u8 temp_v0 = D_80130470[arg1]; u8 loBits = temp_v0 & 3; u16 ret = 0; if (loBits == 1) { if ((temp_v0 & 0x80) == 0) { - ret = Audio_M64ReadU8(state); + ret = AudioSeq_ScriptReadU8(state); } else { - ret = Audio_M64ReadS16(state); + ret = AudioSeq_ScriptReadS16(state); } } return ret; } -s32 Audio_HandleScriptFlowControl(SequencePlayer* seqPlayer, M64ScriptState* state, s32 cmd, s32 arg) { +s32 AudioSeq_HandleScriptFlowControl(SequencePlayer* seqPlayer, SeqScriptState* state, s32 cmd, s32 arg) { switch (cmd) { case 0xFF: if (state->depth == 0) { @@ -44,7 +42,7 @@ s32 Audio_HandleScriptFlowControl(SequencePlayer* seqPlayer, M64ScriptState* sta break; case 0xFD: - return Audio_M64ReadCompressedU16(state); + return AudioSeq_ScriptReadCompressedU16(state); case 0xFE: return 1; @@ -104,79 +102,79 @@ s32 Audio_HandleScriptFlowControl(SequencePlayer* seqPlayer, M64ScriptState* sta return 0; } -void Audio_SequenceChannelInit(SequenceChannel* seqChannel) { +void AudioSeq_InitSequenceChannel(SequenceChannel* channel) { s32 i; - if (seqChannel == &gAudioContext.sequenceChannelNone) { + if (channel == &gAudioContext.sequenceChannelNone) { return; } - seqChannel->enabled = false; - seqChannel->finished = false; - seqChannel->stopScript = false; - seqChannel->stopSomething2 = false; - seqChannel->hasInstrument = false; - seqChannel->stereoHeadsetEffects = false; - seqChannel->transposition = 0; - seqChannel->largeNotes = false; - seqChannel->bookOffset = 0; - seqChannel->stereo.asByte = 0; - seqChannel->changes.asByte = 0xFF; - seqChannel->scriptState.depth = 0; - seqChannel->newPan = 0x40; - seqChannel->panChannelWeight = 0x80; - seqChannel->velocityRandomVariance = 0; - seqChannel->durationRandomVariance = 0; - seqChannel->noteUnused = NULL; - seqChannel->reverbIndex = 0; - seqChannel->reverb = 0; - seqChannel->unk_0C = 0; - seqChannel->notePriority = 3; - seqChannel->someOtherPriority = 1; - seqChannel->delay = 0; - seqChannel->adsr.envelope = gDefaultEnvelope; - seqChannel->adsr.releaseRate = 0xF0; - seqChannel->adsr.sustain = 0; - seqChannel->vibratoRateTarget = 0x800; - seqChannel->vibratoRateStart = 0x800; - seqChannel->vibratoExtentTarget = 0; - seqChannel->vibratoExtentStart = 0; - seqChannel->vibratoRateChangeDelay = 0; - seqChannel->vibratoExtentChangeDelay = 0; - seqChannel->vibratoDelay = 0; - seqChannel->filter = NULL; - seqChannel->unk_20 = 0; - seqChannel->unk_0F = 0; - seqChannel->volume = 1.0f; - seqChannel->volumeScale = 1.0f; - seqChannel->freqScale = 1.0f; + channel->enabled = false; + channel->finished = false; + channel->stopScript = false; + channel->stopSomething2 = false; + channel->hasInstrument = false; + channel->stereoHeadsetEffects = false; + channel->transposition = 0; + channel->largeNotes = false; + channel->bookOffset = 0; + channel->stereo.asByte = 0; + channel->changes.asByte = 0xFF; + channel->scriptState.depth = 0; + channel->newPan = 0x40; + channel->panChannelWeight = 0x80; + channel->velocityRandomVariance = 0; + channel->gateTimeRandomVariance = 0; + channel->noteUnused = NULL; + channel->reverbIndex = 0; + channel->reverb = 0; + channel->unk_0C = 0; + channel->notePriority = 3; + channel->someOtherPriority = 1; + channel->delay = 0; + channel->adsr.envelope = gDefaultEnvelope; + channel->adsr.releaseRate = 0xF0; + channel->adsr.sustain = 0; + channel->vibratoRateTarget = 0x800; + channel->vibratoRateStart = 0x800; + channel->vibratoExtentTarget = 0; + channel->vibratoExtentStart = 0; + channel->vibratoRateChangeDelay = 0; + channel->vibratoExtentChangeDelay = 0; + channel->vibratoDelay = 0; + channel->filter = NULL; + channel->unk_20 = 0; + channel->unk_0F = 0; + channel->volume = 1.0f; + channel->volumeScale = 1.0f; + channel->freqScale = 1.0f; for (i = 0; i < 8; i++) { - seqChannel->soundScriptIO[i] = -1; + channel->soundScriptIO[i] = -1; } - seqChannel->unused = false; - Audio_InitNoteLists(&seqChannel->notePool); + channel->unused = false; + Audio_InitNoteLists(&channel->notePool); } -s32 Audio_SeqChannelSetLayer(SequenceChannel* seqChannel, s32 layerIdx) { - SequenceChannelLayer* layer; +s32 AudioSeq_SeqChannelSetLayer(SequenceChannel* channel, s32 layerIdx) { + SequenceLayer* layer; - if (seqChannel->layers[layerIdx] == NULL) { - SequenceChannelLayer* layer; - layer = Audio_AudioListPopBack(&gAudioContext.layerFreeList); - seqChannel->layers[layerIdx] = layer; + if (channel->layers[layerIdx] == NULL) { + SequenceLayer* layer; + layer = AudioSeq_AudioListPopBack(&gAudioContext.layerFreeList); + channel->layers[layerIdx] = layer; if (layer == NULL) { - seqChannel->layers[layerIdx] = NULL; + channel->layers[layerIdx] = NULL; return -1; } } else { - Audio_SeqChanLayerNoteDecay(seqChannel->layers[layerIdx]); + Audio_SeqLayerNoteDecay(channel->layers[layerIdx]); } - layer = seqChannel->layers[layerIdx]; - layer->seqChannel = seqChannel; - layer->adsr = seqChannel->adsr; + layer = channel->layers[layerIdx]; + layer->channel = channel; + layer->adsr = channel->adsr; layer->adsr.releaseRate = 0; layer->enabled = true; layer->finished = false; @@ -189,11 +187,11 @@ s32 Audio_SeqChannelSetLayer(SequenceChannel* seqChannel, s32 layerIdx) { layer->stereo.asByte = 0; layer->portamento.mode = 0; layer->scriptState.depth = 0; - layer->noteDuration = 0x80; + layer->gateTime = 0x80; layer->pan = 0x40; layer->transposition = 0; layer->delay = 0; - layer->duration = 0; + layer->gateDelay = 0; layer->delay2 = 0; layer->note = NULL; layer->instrument = NULL; @@ -204,90 +202,90 @@ s32 Audio_SeqChannelSetLayer(SequenceChannel* seqChannel, s32 layerIdx) { return 0; } -void Audio_SeqChannelLayerDisable(SequenceChannelLayer* layer) { +void AudioSeq_SeqLayerDisable(SequenceLayer* layer) { if (layer != NULL) { - if (layer->seqChannel != &gAudioContext.sequenceChannelNone && layer->seqChannel->seqPlayer->finished == 1) { - Audio_SeqChanLayerNoteRelease(layer); + if (layer->channel != &gAudioContext.sequenceChannelNone && layer->channel->seqPlayer->finished == 1) { + Audio_SeqLayerNoteRelease(layer); } else { - Audio_SeqChanLayerNoteDecay(layer); + Audio_SeqLayerNoteDecay(layer); } layer->enabled = false; layer->finished = true; } } -void Audio_SeqChannelLayerFree(SequenceChannel* seqChannel, s32 layerIdx) { - SequenceChannelLayer* layer = seqChannel->layers[layerIdx]; +void AudioSeq_SeqLayerFree(SequenceChannel* channel, s32 layerIdx) { + SequenceLayer* layer = channel->layers[layerIdx]; if (layer != NULL) { - Audio_AudioListPushBack(&gAudioContext.layerFreeList, &layer->listItem); - Audio_SeqChannelLayerDisable(layer); - seqChannel->layers[layerIdx] = NULL; + AudioSeq_AudioListPushBack(&gAudioContext.layerFreeList, &layer->listItem); + AudioSeq_SeqLayerDisable(layer); + channel->layers[layerIdx] = NULL; } } -void Audio_SequenceChannelDisable(SequenceChannel* seqChannel) { +void AudioSeq_SequenceChannelDisable(SequenceChannel* channel) { s32 i; for (i = 0; i < 4; i++) { - Audio_SeqChannelLayerFree(seqChannel, i); + AudioSeq_SeqLayerFree(channel, i); } - Audio_NotePoolClear(&seqChannel->notePool); - seqChannel->enabled = false; - seqChannel->finished = true; + Audio_NotePoolClear(&channel->notePool); + channel->enabled = false; + channel->finished = true; } -void Audio_SequencePlayerInitChannels(SequencePlayer* seqPlayer, u16 channelBits) { - SequenceChannel* seqChannel; +void AudioSeq_SequencePlayerSetupChannels(SequencePlayer* seqPlayer, u16 channelBits) { + SequenceChannel* channel; s32 i; for (i = 0; i < 0x10; i++) { if (channelBits & 1) { - seqChannel = seqPlayer->channels[i]; - seqChannel->bankId = seqPlayer->defaultBank; - seqChannel->muteBehavior = seqPlayer->muteBehavior; - seqChannel->noteAllocPolicy = seqPlayer->noteAllocPolicy; + channel = seqPlayer->channels[i]; + channel->fontId = seqPlayer->defaultFont; + channel->muteBehavior = seqPlayer->muteBehavior; + channel->noteAllocPolicy = seqPlayer->noteAllocPolicy; } channelBits = channelBits >> 1; } } -void Audio_SequencePlayerDisableChannels(SequencePlayer* seqPlayer, u16 channelBitsUnused) { - SequenceChannel* seqChannel; +void AudioSeq_SequencePlayerDisableChannels(SequencePlayer* seqPlayer, u16 channelBitsUnused) { + SequenceChannel* channel; s32 i; for (i = 0; i < 0x10; i++) { - seqChannel = seqPlayer->channels[i]; - if (IS_SEQUENCE_CHANNEL_VALID(seqChannel) == 1) { - Audio_SequenceChannelDisable(seqChannel); + channel = seqPlayer->channels[i]; + if (IS_SEQUENCE_CHANNEL_VALID(channel) == 1) { + AudioSeq_SequenceChannelDisable(channel); } } } -void Audio_SequenceChannelEnable(SequencePlayer* seqPlayer, u8 channelIdx, void* script) { - SequenceChannel* seqChannel = seqPlayer->channels[channelIdx]; +void AudioSeq_SequenceChannelEnable(SequencePlayer* seqPlayer, u8 channelIdx, void* script) { + SequenceChannel* channel = seqPlayer->channels[channelIdx]; s32 i; - seqChannel->enabled = true; - seqChannel->finished = false; - seqChannel->scriptState.depth = 0; - seqChannel->scriptState.pc = script; - seqChannel->delay = 0; + channel->enabled = true; + channel->finished = false; + channel->scriptState.depth = 0; + channel->scriptState.pc = script; + channel->delay = 0; for (i = 0; i < 4; i++) { - if (seqChannel->layers[i] != NULL) { - Audio_SeqChannelLayerFree(seqChannel, i); + if (channel->layers[i] != NULL) { + AudioSeq_SeqLayerFree(channel, i); } } } -void Audio_SequencePlayerDisableAsFinished(SequencePlayer* seqPlayer) { +void AudioSeq_SequencePlayerDisableAsFinished(SequencePlayer* seqPlayer) { seqPlayer->finished = true; - Audio_SequencePlayerDisable(seqPlayer); + AudioSeq_SequencePlayerDisable(seqPlayer); } -void Audio_SequencePlayerDisable(SequencePlayer* seqPlayer) { - Audio_SequencePlayerDisableChannels(seqPlayer, 0xFFFF); +void AudioSeq_SequencePlayerDisable(SequencePlayer* seqPlayer) { + AudioSeq_SequencePlayerDisableChannels(seqPlayer, 0xFFFF); Audio_NotePoolClear(&seqPlayer->notePool); if (!seqPlayer->enabled) { return; @@ -296,21 +294,21 @@ void Audio_SequencePlayerDisable(SequencePlayer* seqPlayer) { seqPlayer->enabled = false; seqPlayer->finished = true; - if (Audio_IsSeqLoadComplete(seqPlayer->seqId)) { - Audio_SetSeqLoadStatus(seqPlayer->seqId, 3); + if (AudioLoad_IsSeqLoadComplete(seqPlayer->seqId)) { + AudioLoad_SetSeqLoadStatus(seqPlayer->seqId, 3); } - if (Audio_IsBankLoadComplete(seqPlayer->defaultBank)) { - Audio_SetBankLoadStatus(seqPlayer->defaultBank, 4); + if (AudioLoad_IsFontLoadComplete(seqPlayer->defaultFont)) { + AudioLoad_SetFontLoadStatus(seqPlayer->defaultFont, 4); } - if (seqPlayer->defaultBank == gAudioContext.bankLoadedPool.temporary.entries[0].id) { - gAudioContext.bankLoadedPool.temporary.nextSide = 0; - } else if (seqPlayer->defaultBank == gAudioContext.bankLoadedPool.temporary.entries[1].id) { - gAudioContext.bankLoadedPool.temporary.nextSide = 1; + if (seqPlayer->defaultFont == gAudioContext.fontCache.temporary.entries[0].id) { + gAudioContext.fontCache.temporary.nextSide = 0; + } else if (seqPlayer->defaultFont == gAudioContext.fontCache.temporary.entries[1].id) { + gAudioContext.fontCache.temporary.nextSide = 1; } } -void Audio_AudioListPushBack(AudioListItem* list, AudioListItem* item) { +void AudioSeq_AudioListPushBack(AudioListItem* list, AudioListItem* item) { if (item->prev == NULL) { list->prev->next = item; item->prev = list->prev; @@ -321,7 +319,7 @@ void Audio_AudioListPushBack(AudioListItem* list, AudioListItem* item) { } } -void* Audio_AudioListPopBack(AudioListItem* list) { +void* AudioSeq_AudioListPopBack(AudioListItem* list) { AudioListItem* item = list->prev; if (item == list) { @@ -335,7 +333,7 @@ void* Audio_AudioListPopBack(AudioListItem* list) { return item->u.value; } -void Audio_InitLayerFreelist(void) { +void AudioSeq_InitLayerFreelist(void) { s32 i; gAudioContext.layerFreeList.prev = &gAudioContext.layerFreeList; @@ -346,21 +344,21 @@ void Audio_InitLayerFreelist(void) { for (i = 0; i < ARRAY_COUNT(gAudioContext.sequenceLayers); i++) { gAudioContext.sequenceLayers[i].listItem.u.value = &gAudioContext.sequenceLayers[i]; gAudioContext.sequenceLayers[i].listItem.prev = NULL; - Audio_AudioListPushBack(&gAudioContext.layerFreeList, &gAudioContext.sequenceLayers[i].listItem); + AudioSeq_AudioListPushBack(&gAudioContext.layerFreeList, &gAudioContext.sequenceLayers[i].listItem); } } -u8 Audio_M64ReadU8(M64ScriptState* state) { +u8 AudioSeq_ScriptReadU8(SeqScriptState* state) { return *(state->pc++); } -s16 Audio_M64ReadS16(M64ScriptState* state) { +s16 AudioSeq_ScriptReadS16(SeqScriptState* state) { s16 ret = *(state->pc++) << 8; ret = *(state->pc++) | ret; return ret; } -u16 Audio_M64ReadCompressedU16(M64ScriptState* state) { +u16 AudioSeq_ScriptReadCompressedU16(SeqScriptState* state) { u16 ret = *(state->pc++); if (ret & 0x80) { ret = (ret << 8) & 0x7F00; @@ -369,54 +367,54 @@ u16 Audio_M64ReadCompressedU16(M64ScriptState* state) { return ret; } -void func_800E9ED8(SequenceChannelLayer* layer); -s32 func_800E9F64(SequenceChannelLayer* layer, s32 arg1); -s32 func_800EA0C0(SequenceChannelLayer* layer); -s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1); -s32 func_800EAAE0(SequenceChannelLayer* layer, s32 arg1); +void AudioSeq_SeqLayerProcessScriptStep1(SequenceLayer* layer); +s32 AudioSeq_SeqLayerProcessScriptStep2(SequenceLayer* layer); +s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd); +s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd); +s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameSound); -void Audio_SeqChannelLayerProcessScript(SequenceChannelLayer* layer) { +void AudioSeq_SeqLayerProcessScript(SequenceLayer* layer) { s32 val; - if (layer->enabled == 0) { + if (!layer->enabled) { return; } if (layer->delay > 1) { layer->delay--; - if (!layer->stopSomething && layer->delay <= layer->duration) { - Audio_SeqChanLayerNoteDecay(layer); + if (!layer->stopSomething && layer->delay <= layer->gateDelay) { + Audio_SeqLayerNoteDecay(layer); layer->stopSomething = true; } return; } - func_800E9ED8(layer); - val = func_800EA0C0(layer); + AudioSeq_SeqLayerProcessScriptStep1(layer); + val = AudioSeq_SeqLayerProcessScriptStep2(layer); if (val == -1) { return; } - val = func_800EAAE0(layer, val); + val = AudioSeq_SeqLayerProcessScriptStep3(layer, val); if (val != -1) { - val = func_800EA440(layer, val); + val = AudioSeq_SeqLayerProcessScriptStep4(layer, val); } if (val != -1) { - func_800E9F64(layer, val); + AudioSeq_SeqLayerProcessScriptStep5(layer, val); } - if (layer->stopSomething == 1) { + if (layer->stopSomething == true) { if ((layer->note != NULL) || layer->continuousNotes) { - Audio_SeqChanLayerNoteDecay(layer); + Audio_SeqLayerNoteDecay(layer); } } } -void func_800E9ED8(SequenceChannelLayer* layer) { +void AudioSeq_SeqLayerProcessScriptStep1(SequenceLayer* layer) { if (!layer->continuousNotes) { - Audio_SeqChanLayerNoteDecay(layer); + Audio_SeqLayerNoteDecay(layer); } else if (layer->note != NULL && layer->note->playbackState.wantedParentLayer == layer) { - Audio_SeqChanLayerNoteDecay(layer); + Audio_SeqLayerNoteDecay(layer); } if (PORTAMENTO_MODE(layer->portamento) == PORTAMENTO_MODE_1 || @@ -426,25 +424,25 @@ void func_800E9ED8(SequenceChannelLayer* layer) { layer->notePropertiesNeedInit = true; } -s32 func_800E9F64(SequenceChannelLayer* layer, s32 arg1) { - if (!layer->stopSomething && layer->sound != NULL && layer->sound->sample->codec == 2 && - layer->sound->sample->medium != 0) { +s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameSound) { + if (!layer->stopSomething && layer->sound != NULL && layer->sound->sample->codec == CODEC_S16_INMEMORY && + layer->sound->sample->medium != MEDIUM_RAM) { layer->stopSomething = true; return -1; } - if (layer->continuousNotes == 1 && layer->bit1 == 1) { + if (layer->continuousNotes == true && layer->bit1 == 1) { return 0; } - if (layer->continuousNotes == 1 && layer->note != NULL && layer->bit3 && arg1 == 1 && + if (layer->continuousNotes == true && layer->note != NULL && layer->bit3 && sameSound == true && layer->note->playbackState.parentLayer == layer) { if (layer->sound == NULL) { Audio_InitSyntheticWave(layer->note, layer); } } else { - if (arg1 == 0) { - Audio_SeqChanLayerNoteDecay(layer); + if (sameSound == false) { + Audio_SeqLayerNoteDecay(layer); } layer->note = Audio_AllocNote(layer); if (layer->note != NULL && layer->note->playbackState.parentLayer == layer) { @@ -459,24 +457,24 @@ s32 func_800E9F64(SequenceChannelLayer* layer, s32 arg1) { return 0; } -s32 func_800EA0C0(SequenceChannelLayer* layer) { - SequenceChannel* seqChannel = layer->seqChannel; - M64ScriptState* state = &layer->scriptState; - SequencePlayer* seqPlayer = seqChannel->seqPlayer; +s32 AudioSeq_SeqLayerProcessScriptStep2(SequenceLayer* layer) { + SequenceChannel* channel = layer->channel; + SeqScriptState* state = &layer->scriptState; + SequencePlayer* seqPlayer = channel->seqPlayer; u16 sp3A; u8 cmd; for (;;) { - cmd = Audio_M64ReadU8(state); + cmd = AudioSeq_ScriptReadU8(state); if (cmd < 0xC1) { return cmd; } if (cmd >= 0xF2) { - u16 arg = Audio_GetScriptControlFlowArgument(state, cmd); - if (Audio_HandleScriptFlowControl(seqPlayer, state, cmd, arg) == 0) { + u16 arg = AudioSeq_GetScriptControlFlowArgument(state, cmd); + if (AudioSeq_HandleScriptFlowControl(seqPlayer, state, cmd, arg) == 0) { continue; } - Audio_SeqChannelLayerDisable(layer); + AudioSeq_SeqLayerDisable(layer); return -1; } @@ -493,12 +491,12 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { break; } - case 0xC9: // layer_setshortnoteduration + case 0xC9: // layer_setshortnotegatetime case 0xC2: // layer_transpose; set transposition in semitones { u8 tempByte = *(state->pc++); if (cmd == 0xC9) { - layer->noteDuration = tempByte; + layer->gateTime = tempByte; } else { layer->transposition = tempByte; } @@ -513,16 +511,16 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { layer->continuousNotes = false; } layer->bit1 = false; - Audio_SeqChanLayerNoteDecay(layer); + Audio_SeqLayerNoteDecay(layer); break; - case 0xC3: // layer_setshortnotedefaultplaypercentage - sp3A = Audio_M64ReadCompressedU16(state); - layer->shortNoteDefaultPlayPercentage = sp3A; + case 0xC3: // layer_setshortnotedefaultdelay + sp3A = AudioSeq_ScriptReadCompressedU16(state); + layer->shortNoteDefaultDelay = sp3A; break; case 0xC6: // layer_setinstr - cmd = Audio_M64ReadU8(state); + cmd = AudioSeq_ScriptReadU8(state); if (cmd >= 0x7E) { if (cmd == 0x7E) { layer->instOrWave = 1; @@ -540,16 +538,16 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { break; } - if ((layer->instOrWave = Audio_GetInstrument(seqChannel, cmd, &layer->instrument, &layer->adsr)) == 0) { + if ((layer->instOrWave = AudioSeq_GetInstrument(channel, cmd, &layer->instrument, &layer->adsr)) == 0) { layer->instOrWave = 0xFF; } break; case 0xC7: // layer_portamento - layer->portamento.mode = Audio_M64ReadU8(state); + layer->portamento.mode = AudioSeq_ScriptReadU8(state); - cmd = Audio_M64ReadU8(state); - cmd += seqChannel->transposition; + cmd = AudioSeq_ScriptReadU8(state); + cmd += channel->transposition; cmd += layer->transposition; cmd += seqPlayer->transposition; @@ -565,7 +563,7 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { break; } - sp3A = Audio_M64ReadCompressedU16(state); + sp3A = AudioSeq_ScriptReadCompressedU16(state); layer->portamentoTime = sp3A; break; @@ -574,12 +572,12 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { break; case 0xCB: - sp3A = Audio_M64ReadS16(state); + sp3A = AudioSeq_ScriptReadS16(state); layer->adsr.envelope = (AdsrEnvelope*)(seqPlayer->seqData + sp3A); // fallthrough case 0xCF: - layer->adsr.releaseRate = Audio_M64ReadU8(state); + layer->adsr.releaseRate = AudioSeq_ScriptReadU8(state); break; case 0xCC: @@ -587,11 +585,11 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { break; case 0xCD: - layer->stereo.asByte = Audio_M64ReadU8(state); + layer->stereo.asByte = AudioSeq_ScriptReadU8(state); break; case 0xCE: { - u8 tempByte = Audio_M64ReadU8(state); + u8 tempByte = AudioSeq_ScriptReadU8(state); layer->unk_34 = D_8012F4B4[(tempByte + 0x80) & 0xFF]; break; } @@ -602,16 +600,16 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) { sp3A = seqPlayer->shortNoteVelocityTable[cmd & 0xF]; layer->velocitySquare = (f32)(sp3A * sp3A) / 16129.0f; break; - case 0xE0: // layer_setshortnotedurationfromtable - layer->noteDuration = (u8)seqPlayer->shortNoteDurationTable[cmd & 0xF]; + case 0xE0: // layer_setshortnotegatetimefromtable + layer->gateTime = (u8)seqPlayer->shortNoteGateTimeTable[cmd & 0xF]; break; } } } } -s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { - s32 sameSound = 1; +s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) { + s32 sameSound = true; s32 instOrWave; s32 speed; f32 temp_f14; @@ -619,35 +617,35 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { Portamento* portamento; f32 freqScale; f32 freqScale2; - AudioBankSound* sound; + SoundFontSound* sound; Instrument* instrument; Drum* drum; s32 pad; - SequenceChannel* seqChannel; + SequenceChannel* channel; SequencePlayer* seqPlayer; - u8 cmd = arg1; + u8 semitone = cmd; u16 sfxId; - s32 cmd2; + s32 semitone2; s32 vel; f32 time; f32 tuning; instOrWave = layer->instOrWave; - seqChannel = layer->seqChannel; - seqPlayer = seqChannel->seqPlayer; + channel = layer->channel; + seqPlayer = channel->seqPlayer; if (instOrWave == 0xFF) { - if (!seqChannel->hasInstrument) { + if (!channel->hasInstrument) { return -1; } - instOrWave = seqChannel->instOrWave; + instOrWave = channel->instOrWave; } switch (instOrWave) { case 0: - cmd += seqChannel->transposition + layer->transposition; - layer->semitone = cmd; - drum = Audio_GetDrum(seqChannel->bankId, cmd); + semitone += channel->transposition + layer->transposition; + layer->semitone = semitone; + drum = Audio_GetDrum(channel->fontId, semitone); if (drum == NULL) { layer->stopSomething = true; layer->delay2 = layer->delay; @@ -664,9 +662,9 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { break; case 1: - layer->semitone = cmd; - sfxId = (layer->transposition << 6) + cmd; - sound = Audio_GetSfx(seqChannel->bankId, sfxId); + layer->semitone = semitone; + sfxId = (layer->transposition << 6) + semitone; + sound = Audio_GetSfx(channel->fontId, sfxId); if (sound == NULL) { layer->stopSomething = true; layer->delay2 = layer->delay + 1; @@ -677,25 +675,25 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { break; default: - cmd += seqPlayer->transposition + seqChannel->transposition + layer->transposition; - cmd2 = cmd; - layer->semitone = cmd; - if (cmd >= 0x80) { + semitone += seqPlayer->transposition + channel->transposition + layer->transposition; + semitone2 = semitone; + layer->semitone = semitone; + if (semitone >= 0x80) { layer->stopSomething = true; return -1; } if (layer->instOrWave == 0xFF) { - instrument = seqChannel->instrument; + instrument = channel->instrument; } else { instrument = layer->instrument; } if (layer->portamento.mode != 0) { portamento = &layer->portamento; - vel = (cmd > layer->portamentoTargetNote) ? cmd : layer->portamentoTargetNote; + vel = (semitone > layer->portamentoTargetNote) ? semitone : layer->portamentoTargetNote; if (instrument != NULL) { - sound = Audio_InstrumentGetAudioBankSound(instrument, vel); + sound = Audio_InstrumentGetSound(instrument, vel); sameSound = (layer->sound == sound); layer->sound = sound; tuning = sound->tuning; @@ -707,7 +705,7 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { } } - temp_f2 = gNoteFrequencies[cmd2] * tuning; + temp_f2 = gNoteFrequencies[semitone2] * tuning; temp_f14 = gNoteFrequencies[layer->portamentoTargetNote] * tuning; switch (PORTAMENTO_MODE(*portamento)) { @@ -749,19 +747,19 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { portamento->cur = 0; layer->freqScale = freqScale; if (PORTAMENTO_MODE(*portamento) == PORTAMENTO_MODE_5) { - layer->portamentoTargetNote = cmd; + layer->portamentoTargetNote = semitone; } break; } if (instrument != NULL) { - sound = Audio_InstrumentGetAudioBankSound(instrument, cmd); + sound = Audio_InstrumentGetSound(instrument, semitone); sameSound = (sound == layer->sound); layer->sound = sound; - layer->freqScale = gNoteFrequencies[cmd2] * sound->tuning; + layer->freqScale = gNoteFrequencies[semitone2] * sound->tuning; } else { layer->sound = NULL; - layer->freqScale = gNoteFrequencies[cmd2]; + layer->freqScale = gNoteFrequencies[semitone2]; if (instOrWave >= 0xC0) { layer->sound = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].sound; } @@ -783,7 +781,7 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { if (time > 32766.0f) { time = 32766.0f; } - layer->duration = 0; + layer->gateDelay = 0; layer->delay = (u16)(s32)time + 1; if (layer->portamento.mode != 0) { // (It's a bit unclear if 'portamento' has actually always been @@ -804,43 +802,43 @@ s32 func_800EA440(SequenceChannelLayer* layer, s32 arg1) { return sameSound; } -s32 func_800EAAE0(SequenceChannelLayer* layer, s32 arg1) { - M64ScriptState* state = &layer->scriptState; - u16 playPercentage; +s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd) { + SeqScriptState* state = &layer->scriptState; + u16 delay; s32 velocity; - SequenceChannel* seqChannel = layer->seqChannel; - SequencePlayer* seqPlayer = seqChannel->seqPlayer; + SequenceChannel* channel = layer->channel; + SequencePlayer* seqPlayer = channel->seqPlayer; s32 intDelta; f32 floatDelta; - if (arg1 == 0xC0) { - layer->delay = Audio_M64ReadCompressedU16(state); + if (cmd == 0xC0) { + layer->delay = AudioSeq_ScriptReadCompressedU16(state); layer->stopSomething = true; layer->bit1 = false; return -1; } layer->stopSomething = false; - if (seqChannel->largeNotes == 1) { - switch (arg1 & 0xC0) { - case 0: - playPercentage = Audio_M64ReadCompressedU16(state); + if (channel->largeNotes == 1) { + switch (cmd & 0xC0) { + case 0x00: + delay = AudioSeq_ScriptReadCompressedU16(state); velocity = *(state->pc++); - layer->noteDuration = *(state->pc++); - layer->playPercentage = playPercentage; + layer->gateTime = *(state->pc++); + layer->lastDelay = delay; break; case 0x40: - playPercentage = Audio_M64ReadCompressedU16(state); + delay = AudioSeq_ScriptReadCompressedU16(state); velocity = *(state->pc++); - layer->noteDuration = 0; - layer->playPercentage = playPercentage; + layer->gateTime = 0; + layer->lastDelay = delay; break; case 0x80: - playPercentage = layer->playPercentage; + delay = layer->lastDelay; velocity = *(state->pc++); - layer->noteDuration = *(state->pc++); + layer->gateTime = *(state->pc++); break; } @@ -848,28 +846,28 @@ s32 func_800EAAE0(SequenceChannelLayer* layer, s32 arg1) { velocity = 0x7F; } layer->velocitySquare = (f32)velocity * (f32)velocity / 16129.0f; - arg1 -= (arg1 & 0xC0); + cmd -= (cmd & 0xC0); } else { - switch (arg1 & 0xC0) { - case 0: - playPercentage = Audio_M64ReadCompressedU16(state); - layer->playPercentage = playPercentage; + switch (cmd & 0xC0) { + case 0x00: + delay = AudioSeq_ScriptReadCompressedU16(state); + layer->lastDelay = delay; break; case 0x40: - playPercentage = layer->shortNoteDefaultPlayPercentage; + delay = layer->shortNoteDefaultDelay; break; case 0x80: - playPercentage = layer->playPercentage; + delay = layer->lastDelay; break; } - arg1 -= (arg1 & 0xC0); + cmd -= (cmd & 0xC0); } - if (seqChannel->velocityRandomVariance != 0) { + if (channel->velocityRandomVariance != 0) { floatDelta = - layer->velocitySquare * (f32)(gAudioContext.audioRandom % seqChannel->velocityRandomVariance) / 100.0f; + layer->velocitySquare * (f32)(gAudioContext.audioRandom % channel->velocityRandomVariance) / 100.0f; if ((gAudioContext.audioRandom & 0x8000) != 0) { floatDelta = -floatDelta; } @@ -883,45 +881,45 @@ s32 func_800EAAE0(SequenceChannelLayer* layer, s32 arg1) { layer->velocitySquare2 = layer->velocitySquare; } - layer->delay = playPercentage; - layer->duration = (layer->noteDuration * playPercentage) >> 8; - if (seqChannel->durationRandomVariance != 0) { - //! @bug should probably be durationRandomVariance - intDelta = (layer->duration * (gAudioContext.audioRandom % seqChannel->velocityRandomVariance)) / 100; + layer->delay = delay; + layer->gateDelay = (layer->gateTime * delay) >> 8; + if (channel->gateTimeRandomVariance != 0) { + //! @bug should probably be gateTimeRandomVariance + intDelta = (layer->gateDelay * (gAudioContext.audioRandom % channel->velocityRandomVariance)) / 100; if ((gAudioContext.audioRandom & 0x4000) != 0) { intDelta = -intDelta; } - layer->duration += intDelta; - if (layer->duration < 0) { - layer->duration = 0; - } else if (layer->duration > layer->delay) { - layer->duration = layer->delay; + layer->gateDelay += intDelta; + if (layer->gateDelay < 0) { + layer->gateDelay = 0; + } else if (layer->gateDelay > layer->delay) { + layer->gateDelay = layer->delay; } } - if ((seqPlayer->muted && (seqChannel->muteBehavior & (0x40 | 0x10)) != 0) || seqChannel->stopSomething2) { + if ((seqPlayer->muted && (channel->muteBehavior & (0x40 | 0x10)) != 0) || channel->stopSomething2) { layer->stopSomething = true; return -1; } - if (seqPlayer->unk_DC != 0) { + if (seqPlayer->skipTicks != 0) { layer->stopSomething = true; return -1; } - return arg1; + return cmd; } -void func_800EAEF4(SequenceChannel* seqChannel, u8 arg1) { +void AudioSeq_SetChannelPriorities(SequenceChannel* channel, u8 arg1) { if ((arg1 & 0xF) != 0) { - seqChannel->notePriority = arg1 & 0xF; + channel->notePriority = arg1 & 0xF; } arg1 = arg1 >> 4; if (arg1 != 0) { - seqChannel->someOtherPriority = arg1; + channel->someOtherPriority = arg1; } } -u8 Audio_GetInstrument(SequenceChannel* seqChannel, u8 instId, Instrument** instOut, AdsrSettings* adsr) { - Instrument* inst = Audio_GetInstrumentInner(seqChannel->bankId, instId); +u8 AudioSeq_GetInstrument(SequenceChannel* channel, u8 instId, Instrument** instOut, AdsrSettings* adsr) { + Instrument* inst = Audio_GetInstrumentInner(channel->fontId, instId); if (inst == NULL) { *instOut = NULL; @@ -934,29 +932,29 @@ u8 Audio_GetInstrument(SequenceChannel* seqChannel, u8 instId, Instrument** inst return instId; } -void Audio_SetInstrument(SequenceChannel* seqChannel, u8 instId) { +void AudioSeq_SetInstrument(SequenceChannel* channel, u8 instId) { if (instId >= 0x80) { - seqChannel->instOrWave = instId; - seqChannel->instrument = NULL; + channel->instOrWave = instId; + channel->instrument = NULL; } else if (instId == 0x7F) { - seqChannel->instOrWave = 0; - seqChannel->instrument = (Instrument*)1; + channel->instOrWave = 0; + channel->instrument = (Instrument*)1; } else if (instId == 0x7E) { - seqChannel->instOrWave = 1; - seqChannel->instrument = (Instrument*)2; - } else if ((seqChannel->instOrWave = - Audio_GetInstrument(seqChannel, instId, &seqChannel->instrument, &seqChannel->adsr)) == 0) { - seqChannel->hasInstrument = false; + channel->instOrWave = 1; + channel->instrument = (Instrument*)2; + } else if ((channel->instOrWave = AudioSeq_GetInstrument(channel, instId, &channel->instrument, &channel->adsr)) == + 0) { + channel->hasInstrument = false; return; } - seqChannel->hasInstrument = true; + channel->hasInstrument = true; } -void Audio_SequenceChannelSetVolume(SequenceChannel* seqChannel, u8 volume) { - seqChannel->volume = (f32)(s32)volume / 127.0f; +void AudioSeq_SequenceChannelSetVolume(SequenceChannel* channel, u8 volume) { + channel->volume = (f32)(s32)volume / 127.0f; } -void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { +void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) { s32 i; u8* data; u8* test; @@ -976,13 +974,13 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { } while (true) { - M64ScriptState* scriptState = &channel->scriptState; + SeqScriptState* scriptState = &channel->scriptState; s32 param; s16 pad1; u16 offset; u32 parameters[3]; s8 signedParam; - u8 command = Audio_M64ReadU8(scriptState); + u8 command = AudioSeq_ScriptReadU8(scriptState); u8 lowBits; u8 highBits; s32 result; @@ -994,17 +992,17 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { for (i = 0; i < lowBits; i++, highBits <<= 1) { if (!(highBits & 0x80)) { - parameters[i] = Audio_M64ReadU8(scriptState); + parameters[i] = AudioSeq_ScriptReadU8(scriptState); } else { - parameters[i] = Audio_M64ReadS16(scriptState); + parameters[i] = AudioSeq_ScriptReadS16(scriptState); } } if (command >= 0xF2) { - result = Audio_HandleScriptFlowControl(seqPlayer, scriptState, command, parameters[0]); + result = AudioSeq_HandleScriptFlowControl(seqPlayer, scriptState, command, parameters[0]); if (result != 0) { if (result == -1) { - Audio_SequenceChannelDisable(channel); + AudioSeq_SequenceChannelDisable(channel); } else { channel->delay = result; } @@ -1040,21 +1038,21 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { result = (u8)parameters[0]; command = (u8)parameters[0]; - if (seqPlayer->defaultBank != 0xFF) { - offset = ((u16*)gAudioContext.unk_283C)[seqPlayer->seqId]; - lowBits = gAudioContext.unk_283Cb[offset]; - command = gAudioContext.unk_283Cb[offset + lowBits - result]; + if (seqPlayer->defaultFont != 0xFF) { + offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId]; + lowBits = gAudioContext.sequenceFontTable[offset]; + command = gAudioContext.sequenceFontTable[offset + lowBits - result]; } - if (func_800DF074(1, 2, command)) { - channel->bankId = command; + if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, command)) { + channel->fontId = command; } parameters[0] = parameters[1]; // NOTE: Intentional fallthrough case 0xC1: command = (u8)parameters[0]; - Audio_SetInstrument(channel, command); + AudioSeq_SetInstrument(channel, command); break; case 0xC3: channel->largeNotes = false; @@ -1064,7 +1062,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { break; case 0xDF: command = (u8)parameters[0]; - Audio_SequenceChannelSetVolume(channel, command); + AudioSeq_SequenceChannelSetVolume(channel, command); channel->changes.s.volume = true; break; case 0xE0: @@ -1151,14 +1149,14 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { result = (u8)parameters[0]; command = (u8)parameters[0]; - if (seqPlayer->defaultBank != 0xFF) { - offset = ((u16*)gAudioContext.unk_283C)[seqPlayer->seqId]; - lowBits = gAudioContext.unk_283Cb[offset]; - command = gAudioContext.unk_283Cb[offset + lowBits - result]; + if (seqPlayer->defaultFont != 0xFF) { + offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId]; + lowBits = gAudioContext.sequenceFontTable[offset]; + command = gAudioContext.sequenceFontTable[offset + lowBits - result]; } - if (func_800DF074(1, 2, command)) { - channel->bankId = command; + if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, command)) { + channel->fontId = command; } break; @@ -1183,7 +1181,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { break; case 0xCD: command = (u8)parameters[0]; - Audio_SequenceChannelDisable(seqPlayer->channels[command]); + AudioSeq_SequenceChannelDisable(seqPlayer->channels[command]); break; case 0xCA: command = (u8)parameters[0]; @@ -1245,7 +1243,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { channel->muteBehavior = data[0]; data += 3; channel->noteAllocPolicy = data[-2]; - func_800EAEF4(channel, data[-1]); + AudioSeq_SetChannelPriorities(channel, data[-1]); channel->transposition = (s8)data[0]; data += 4; channel->newPan = data[-3]; @@ -1259,12 +1257,12 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { channel->muteBehavior = parameters[0]; channel->noteAllocPolicy = parameters[1]; command = (u8)parameters[2]; - func_800EAEF4(channel, command); - channel->transposition = (s8)Audio_M64ReadU8(scriptState); - channel->newPan = Audio_M64ReadU8(scriptState); - channel->panChannelWeight = Audio_M64ReadU8(scriptState); - channel->reverb = Audio_M64ReadU8(scriptState); - channel->reverbIndex = Audio_M64ReadU8(scriptState); + AudioSeq_SetChannelPriorities(channel, command); + channel->transposition = (s8)AudioSeq_ScriptReadU8(scriptState); + channel->newPan = AudioSeq_ScriptReadU8(scriptState); + channel->panChannelWeight = AudioSeq_ScriptReadU8(scriptState); + channel->reverb = AudioSeq_ScriptReadU8(scriptState); + channel->reverbIndex = AudioSeq_ScriptReadU8(scriptState); //! @bug: Not marking reverb state as changed channel->changes.s.pan = true; break; @@ -1279,14 +1277,14 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { channel->unk_0C = 0; channel->adsr.sustain = 0; channel->velocityRandomVariance = 0; - channel->durationRandomVariance = 0; + channel->gateTimeRandomVariance = 0; channel->unk_0F = 0; channel->unk_20 = 0; channel->bookOffset = 0; channel->freqScale = 1.0f; break; case 0xE9: - func_800EAEF4(channel, (u8)parameters[0]); + AudioSeq_SetChannelPriorities(channel, (u8)parameters[0]); break; case 0xED: command = (u8)parameters[0]; @@ -1306,7 +1304,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { if (channel->filter != NULL) { lowBits = (command >> 4) & 0xF; command &= 0xF; - func_800DF688(channel->filter, lowBits, command); + AudioHeap_LoadFilter(channel->filter, lowBits, command); } break; case 0xB2: @@ -1342,7 +1340,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { channel->velocityRandomVariance = parameters[0]; break; case 0xBA: - channel->durationRandomVariance = parameters[0]; + channel->gateTimeRandomVariance = parameters[0]; break; case 0xBB: channel->unk_0F = parameters[0]; @@ -1369,16 +1367,16 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { } break; case 0x88: - offset = Audio_M64ReadS16(scriptState); - if (!Audio_SeqChannelSetLayer(channel, lowBits)) { + offset = AudioSeq_ScriptReadS16(scriptState); + if (!AudioSeq_SeqChannelSetLayer(channel, lowBits)) { channel->layers[lowBits]->scriptState.pc = &seqPlayer->seqData[offset]; } break; case 0x90: - Audio_SeqChannelLayerFree(channel, lowBits); + AudioSeq_SeqLayerFree(channel, lowBits); break; case 0x98: - if (scriptState->value == -1 || Audio_SeqChannelSetLayer(channel, lowBits) == -1) { + if (scriptState->value == -1 || AudioSeq_SeqChannelSetLayer(channel, lowBits) == -1) { break; } @@ -1390,8 +1388,8 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { channel->soundScriptIO[lowBits] = scriptState->value; break; case 0x78: - pad1 = Audio_M64ReadS16(scriptState); - if (!Audio_SeqChannelSetLayer(channel, lowBits)) { + pad1 = AudioSeq_ScriptReadS16(scriptState); + if (!AudioSeq_SeqChannelSetLayer(channel, lowBits)) { channel->layers[lowBits]->scriptState.pc = &scriptState->pc[pad1]; } break; @@ -1400,22 +1398,22 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { lowBits = command & 0xF; switch (command & 0xF0) { - case 0: { + case 0x00: { channel->delay = lowBits; goto exit_loop; } case 0x10: if (lowBits < 8) { channel->soundScriptIO[lowBits] = -1; - if (Audio_SyncLoadSample(channel->bankId, scriptState->value, - &channel->soundScriptIO[lowBits]) == -1) { + if (AudioLoad_SlowLoadSample(channel->fontId, scriptState->value, + &channel->soundScriptIO[lowBits]) == -1) { break; } } else { lowBits -= 8; channel->soundScriptIO[lowBits] = -1; - if (Audio_SyncLoadSample(channel->bankId, channel->unk_22 + 0x100, - &channel->soundScriptIO[lowBits]) == -1) { + if (AudioLoad_SlowLoadSample(channel->fontId, channel->unk_22 + 0x100, + &channel->soundScriptIO[lowBits]) == -1) { break; } } @@ -1430,15 +1428,15 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) { scriptState->value -= channel->soundScriptIO[lowBits]; break; case 0x20: - offset = Audio_M64ReadS16(scriptState); - Audio_SequenceChannelEnable(seqPlayer, lowBits, &seqPlayer->seqData[offset]); + offset = AudioSeq_ScriptReadS16(scriptState); + AudioSeq_SequenceChannelEnable(seqPlayer, lowBits, &seqPlayer->seqData[offset]); break; case 0x30: - command = Audio_M64ReadU8(scriptState); + command = AudioSeq_ScriptReadU8(scriptState); seqPlayer->channels[lowBits]->soundScriptIO[command] = scriptState->value; break; case 0x40: - command = Audio_M64ReadU8(scriptState); + command = AudioSeq_ScriptReadU8(scriptState); scriptState->value = seqPlayer->channels[lowBits]->soundScriptIO[command]; break; } @@ -1448,15 +1446,15 @@ exit_loop: for (i = 0; i < ARRAY_COUNT(channel->layers); i++) { if (channel->layers[i] != NULL) { - Audio_SeqChannelLayerProcessScript(channel->layers[i]); + AudioSeq_SeqLayerProcessScript(channel->layers[i]); } } } -void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { +void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { u8 command; u8 commandLow; - M64ScriptState* seqScript = &seqPlayer->scriptState; + SeqScriptState* seqScript = &seqPlayer->scriptState; s16 tempS; u16 temp; s32 i; @@ -1471,19 +1469,19 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { return; } - if (!Audio_IsSeqLoadComplete(seqPlayer->seqId) || !Audio_IsBankLoadComplete(seqPlayer->defaultBank)) { - Audio_SequencePlayerDisable(seqPlayer); + if (!AudioLoad_IsSeqLoadComplete(seqPlayer->seqId) || !AudioLoad_IsFontLoadComplete(seqPlayer->defaultFont)) { + AudioSeq_SequencePlayerDisable(seqPlayer); return; } - Audio_SetSeqLoadStatus(seqPlayer->seqId, 2); - Audio_SetBankLoadStatus(seqPlayer->defaultBank, 2); + AudioLoad_SetSeqLoadStatus(seqPlayer->seqId, 2); + AudioLoad_SetFontLoadStatus(seqPlayer->defaultFont, 2); if (seqPlayer->muted && (seqPlayer->muteBehavior & 0x80)) { return; } - seqPlayer->unk_E0++; + seqPlayer->scriptCounter++; seqPlayer->tempoAcc += seqPlayer->tempo; seqPlayer->tempoAcc += (s16)seqPlayer->unk_0C; @@ -1493,7 +1491,7 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { seqPlayer->tempoAcc -= (u16)gAudioContext.tempoInternalToExternal; - if (seqPlayer->unk_0b2 == true) { + if (seqPlayer->stopScript == true) { return; } @@ -1503,17 +1501,17 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { seqPlayer->recalculateVolume = true; while (true) { - command = Audio_M64ReadU8(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); // 0xF2 and above are "flow control" commands, including termination. if (command >= 0xF2) { - s32 scriptHandled = - Audio_HandleScriptFlowControl(seqPlayer, seqScript, command, - Audio_GetScriptControlFlowArgument(&seqPlayer->scriptState, command)); + s32 scriptHandled = AudioSeq_HandleScriptFlowControl( + seqPlayer, seqScript, command, + AudioSeq_GetScriptControlFlowArgument(&seqPlayer->scriptState, command)); if (scriptHandled != 0) { if (scriptHandled == -1) { - Audio_SequencePlayerDisable(seqPlayer); + AudioSeq_SequencePlayerDisable(seqPlayer); } else { seqPlayer->delay = (u16)scriptHandled; } @@ -1523,7 +1521,7 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { switch (command) { case 0xF1: Audio_NotePoolClear(&seqPlayer->notePool); - command = Audio_M64ReadU8(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); Audio_NotePoolFill(&seqPlayer->notePool, command); // Fake-match: the asm has two breaks in a row here, // which the compiler normally optimizes out. @@ -1543,10 +1541,10 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { seqPlayer->transposition = 0; // Note: intentional fallthrough, also executes below command case 0xDE: - seqPlayer->transposition += (s8)Audio_M64ReadU8(seqScript); + seqPlayer->transposition += (s8)AudioSeq_ScriptReadU8(seqScript); break; case 0xDD: - seqPlayer->tempo = Audio_M64ReadU8(seqScript) * 48; + seqPlayer->tempo = AudioSeq_ScriptReadU8(seqScript) * 48; if (seqPlayer->tempo > gAudioContext.tempoInternalToExternal) { seqPlayer->tempo = (u16)gAudioContext.tempoInternalToExternal; } @@ -1555,11 +1553,11 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { } break; case 0xDC: - seqPlayer->unk_0C = (s8)Audio_M64ReadU8(seqScript) * 48; + seqPlayer->unk_0C = (s8)AudioSeq_ScriptReadU8(seqScript) * 48; break; case 0xDA: - command = Audio_M64ReadU8(seqScript); - temp = Audio_M64ReadS16(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); + temp = AudioSeq_ScriptReadS16(seqScript); switch (command) { case 0: case 1: @@ -1576,7 +1574,7 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { } break; case 0xDB: - value = Audio_M64ReadU8(seqScript); + value = AudioSeq_ScriptReadU8(seqScript); switch (seqPlayer->state) { case 1: seqPlayer->state = 0; @@ -1596,39 +1594,39 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { } break; case 0xD9: - seqPlayer->fadeVolumeScale = (s8)Audio_M64ReadU8(seqScript) / 127.0f; + seqPlayer->fadeVolumeScale = (s8)AudioSeq_ScriptReadU8(seqScript) / 127.0f; break; case 0xD7: - temp = Audio_M64ReadS16(seqScript); - Audio_SequencePlayerInitChannels(seqPlayer, temp); + temp = AudioSeq_ScriptReadS16(seqScript); + AudioSeq_SequencePlayerSetupChannels(seqPlayer, temp); break; case 0xD6: - Audio_M64ReadS16(seqScript); + AudioSeq_ScriptReadS16(seqScript); break; case 0xD5: - seqPlayer->muteVolumeScale = (s8)Audio_M64ReadU8(seqScript) / 127.0f; + seqPlayer->muteVolumeScale = (s8)AudioSeq_ScriptReadU8(seqScript) / 127.0f; break; case 0xD4: seqPlayer->muted = true; break; case 0xD3: - seqPlayer->muteBehavior = Audio_M64ReadU8(seqScript); + seqPlayer->muteBehavior = AudioSeq_ScriptReadU8(seqScript); break; case 0xD1: case 0xD2: - temp = Audio_M64ReadS16(seqScript); + temp = AudioSeq_ScriptReadS16(seqScript); data3 = &seqPlayer->seqData[temp]; if (command == 0xD2) { seqPlayer->shortNoteVelocityTable = data3; } else { - seqPlayer->shortNoteDurationTable = data3; + seqPlayer->shortNoteGateTimeTable = data3; } break; case 0xD0: - seqPlayer->noteAllocPolicy = Audio_M64ReadU8(seqScript); + seqPlayer->noteAllocPolicy = AudioSeq_ScriptReadU8(seqScript); break; case 0xCE: - command = Audio_M64ReadU8(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); if (command == 0) { seqScript->value = (gAudioContext.audioRandom >> 2) & 0xFF; } else { @@ -1636,7 +1634,7 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { } break; case 0xCD: { - temp = Audio_M64ReadS16(seqScript); + temp = AudioSeq_ScriptReadS16(seqScript); if ((seqScript->value != -1) && (seqScript->depth != 3)) { data = seqPlayer->seqData + (u32)(temp + (seqScript->value << 1)); @@ -1649,38 +1647,38 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { break; } case 0xCC: - seqScript->value = Audio_M64ReadU8(seqScript); + seqScript->value = AudioSeq_ScriptReadU8(seqScript); break; case 0xC9: - seqScript->value &= Audio_M64ReadU8(seqScript); + seqScript->value &= AudioSeq_ScriptReadU8(seqScript); break; case 0xC8: - seqScript->value -= Audio_M64ReadU8(seqScript); + seqScript->value -= AudioSeq_ScriptReadU8(seqScript); break; case 0xC7: - command = Audio_M64ReadU8(seqScript); - temp = Audio_M64ReadS16(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); + temp = AudioSeq_ScriptReadS16(seqScript); data2 = &seqPlayer->seqData[temp]; *data2 = (u8)seqScript->value + command; break; case 0xC6: - seqPlayer->unk_0b2 = true; + seqPlayer->stopScript = true; return; case 0xC5: - seqPlayer->unk_E0 = (u16)Audio_M64ReadS16(seqScript); + seqPlayer->scriptCounter = (u16)AudioSeq_ScriptReadS16(seqScript); break; case 0xEF: - Audio_M64ReadS16(seqScript); - Audio_M64ReadU8(seqScript); + AudioSeq_ScriptReadS16(seqScript); + AudioSeq_ScriptReadU8(seqScript); break; case 0xC4: - command = Audio_M64ReadU8(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); if (command == 0xFF) { - command = seqPlayer->playerIndex; + command = seqPlayer->playerIdx; } - commandLow = Audio_M64ReadU8(seqScript); - func_800E20D4(command, commandLow, 0); - if (command == (u8)seqPlayer->playerIndex) { + commandLow = AudioSeq_ScriptReadU8(seqScript); + AudioLoad_SyncInitSeqPlayer(command, commandLow, 0); + if (command == (u8)seqPlayer->playerIdx) { return; } break; @@ -1689,44 +1687,44 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { commandLow = command & 0x0F; switch (command & 0xF0) { - case 0: + case 0x00: seqScript->value = seqPlayer->channels[commandLow]->enabled ^ 1; break; case 0x50: - seqScript->value -= seqPlayer->unk_158[commandLow]; + seqScript->value -= seqPlayer->soundScriptIO[commandLow]; break; case 0x70: - seqPlayer->unk_158[commandLow] = seqScript->value; + seqPlayer->soundScriptIO[commandLow] = seqScript->value; break; case 0x80: - seqScript->value = seqPlayer->unk_158[commandLow]; + seqScript->value = seqPlayer->soundScriptIO[commandLow]; if (commandLow < 2) { - seqPlayer->unk_158[commandLow] = -1; + seqPlayer->soundScriptIO[commandLow] = -1; } break; case 0x40: - Audio_SequenceChannelDisable(seqPlayer->channels[commandLow]); + AudioSeq_SequenceChannelDisable(seqPlayer->channels[commandLow]); break; case 0x90: - temp = Audio_M64ReadS16(seqScript); - Audio_SequenceChannelEnable(seqPlayer, commandLow, (void*)&seqPlayer->seqData[temp]); + temp = AudioSeq_ScriptReadS16(seqScript); + AudioSeq_SequenceChannelEnable(seqPlayer, commandLow, (void*)&seqPlayer->seqData[temp]); break; case 0xA0: - tempS = Audio_M64ReadS16(seqScript); - Audio_SequenceChannelEnable(seqPlayer, commandLow, (void*)&seqScript->pc[tempS]); + tempS = AudioSeq_ScriptReadS16(seqScript); + AudioSeq_SequenceChannelEnable(seqPlayer, commandLow, (void*)&seqScript->pc[tempS]); break; case 0xB0: - command = Audio_M64ReadU8(seqScript); - temp = Audio_M64ReadS16(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); + temp = AudioSeq_ScriptReadS16(seqScript); data2 = &seqPlayer->seqData[temp]; - Audio_SyncLoadSeq(command, data2, &seqPlayer->unk_158[commandLow]); + AudioLoad_SlowLoadSeq(command, data2, &seqPlayer->soundScriptIO[commandLow]); break; case 0x60: { - command = Audio_M64ReadU8(seqScript); + command = AudioSeq_ScriptReadU8(seqScript); value = command; - temp = Audio_M64ReadU8(seqScript); + temp = AudioSeq_ScriptReadU8(seqScript); - func_800E4EEC(value, temp, &seqPlayer->unk_158[commandLow]); + AudioLoad_ScriptLoad(value, temp, &seqPlayer->soundScriptIO[commandLow]); break; } } @@ -1736,40 +1734,40 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) { for (i = 0; i < ARRAY_COUNT(seqPlayer->channels); i++) { if (seqPlayer->channels[i]->enabled) { - Audio_SequenceChannelProcessScript(seqPlayer->channels[i]); + AudioSeq_SequenceChannelProcessScript(seqPlayer->channels[i]); } } } -void Audio_ProcessSequences(s32 arg0) { +void AudioSeq_ProcessSequences(s32 arg0) { SequencePlayer* seqPlayer; u32 i; gAudioContext.noteSubEuOffset = - (gAudioContext.audioBufferParameters.updatesPerFrame - arg0 - 1) * gAudioContext.maxSimultaneousNotes; + (gAudioContext.audioBufferParameters.updatesPerFrame - arg0 - 1) * gAudioContext.numNotes; for (i = 0; i < (u32)gAudioContext.audioBufferParameters.numSequencePlayers; i++) { seqPlayer = &gAudioContext.seqPlayers[i]; if (seqPlayer->enabled == 1) { - Audio_SequencePlayerProcessSequence(seqPlayer); + AudioSeq_SequencePlayerProcessSequence(seqPlayer); Audio_SequencePlayerProcessSound(seqPlayer); } } Audio_ProcessNotes(); } -void Audio_ProcessSequence(SequencePlayer* seqPlayer) { - while (seqPlayer->unk_DC > 0) { - Audio_SequencePlayerProcessSequence(seqPlayer); +void AudioSeq_SkipForwardSequence(SequencePlayer* seqPlayer) { + while (seqPlayer->skipTicks > 0) { + AudioSeq_SequencePlayerProcessSequence(seqPlayer); Audio_SequencePlayerProcessSound(seqPlayer); - seqPlayer->unk_DC--; + seqPlayer->skipTicks--; } } -void Audio_ResetSequencePlayer(SequencePlayer* seqPlayer) { +void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer) { s32 i; - Audio_SequencePlayerDisable(seqPlayer); - seqPlayer->unk_0b2 = false; + AudioSeq_SequencePlayerDisable(seqPlayer); + seqPlayer->stopScript = false; seqPlayer->delay = 0; seqPlayer->state = 1; seqPlayer->fadeTimer = 0; @@ -1780,40 +1778,40 @@ void Audio_ResetSequencePlayer(SequencePlayer* seqPlayer) { seqPlayer->transposition = 0; seqPlayer->noteAllocPolicy = 0; seqPlayer->shortNoteVelocityTable = gDefaultShortNoteVelocityTable; - seqPlayer->shortNoteDurationTable = gDefaultShortNoteDurationTable; - seqPlayer->unk_E0 = 0; + seqPlayer->shortNoteGateTimeTable = gDefaultShortNoteGateTimeTable; + seqPlayer->scriptCounter = 0; seqPlayer->fadeVolume = 1.0f; seqPlayer->fadeVelocity = 0.0f; seqPlayer->volume = 0.0f; seqPlayer->muteVolumeScale = 0.5f; for (i = 0; i < 0x10; i++) { - Audio_SequenceChannelInit(seqPlayer->channels[i]); + AudioSeq_InitSequenceChannel(seqPlayer->channels[i]); } } -void func_800EC734(s32 seqPlayerIdx) { - SequenceChannel* seqChannel; - SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[seqPlayerIdx]; +void AudioSeq_InitSequencePlayerChannels(s32 playerIdx) { + SequenceChannel* channel; + SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIdx]; s32 i, j; for (i = 0; i < 0x10; i++) { - seqPlayer->channels[i] = Audio_AllocZeroed(&gAudioContext.notesAndBuffersPool, sizeof(SequenceChannel)); + seqPlayer->channels[i] = AudioHeap_AllocZeroed(&gAudioContext.notesAndBuffersPool, sizeof(SequenceChannel)); if (seqPlayer->channels[i] == NULL) { seqPlayer->channels[i] = &gAudioContext.sequenceChannelNone; } else { - seqChannel = seqPlayer->channels[i]; - seqChannel->seqPlayer = seqPlayer; - seqChannel->enabled = false; + channel = seqPlayer->channels[i]; + channel->seqPlayer = seqPlayer; + channel->enabled = false; for (j = 0; j < 4; j++) { - seqChannel->layers[j] = NULL; + channel->layers[j] = NULL; } } - Audio_SequenceChannelInit(seqPlayer->channels[i]); + AudioSeq_InitSequenceChannel(seqPlayer->channels[i]); } } -void Audio_InitSequencePlayer(SequencePlayer* seqPlayer) { +void AudioSeq_InitSequencePlayer(SequencePlayer* seqPlayer) { s32 i, j; for (i = 0; i < 0x10; i++) { @@ -1822,30 +1820,30 @@ void Audio_InitSequencePlayer(SequencePlayer* seqPlayer) { seqPlayer->enabled = false; seqPlayer->muted = false; - seqPlayer->bankDmaInProgress = false; + seqPlayer->fontDmaInProgress = false; seqPlayer->seqDmaInProgress = false; seqPlayer->unk_0b1 = false; for (j = 0; j < 8; j++) { - seqPlayer->unk_158[j] = -1; + seqPlayer->soundScriptIO[j] = -1; } seqPlayer->muteBehavior = 0x40 | 0x20; seqPlayer->fadeVolumeScale = 1.0f; seqPlayer->unk_34 = 1.0f; Audio_InitNoteLists(&seqPlayer->notePool); - Audio_ResetSequencePlayer(seqPlayer); + AudioSeq_ResetSequencePlayer(seqPlayer); } -void Audio_InitSequencePlayers(void) { +void AudioSeq_InitSequencePlayers(void) { s32 i; - Audio_InitLayerFreelist(); + AudioSeq_InitLayerFreelist(); for (i = 0; i < 64; i++) { - gAudioContext.sequenceLayers[i].seqChannel = NULL; + gAudioContext.sequenceLayers[i].channel = NULL; gAudioContext.sequenceLayers[i].enabled = false; } for (i = 0; i < 4; i++) { - Audio_InitSequencePlayer(&gAudioContext.seqPlayers[i]); + AudioSeq_InitSequencePlayer(&gAudioContext.seqPlayers[i]); } } diff --git a/src/code/audio_synthesis.c b/src/code/audio_synthesis.c index cd686bf0b0..68c5d0cb6e 100644 --- a/src/code/audio_synthesis.c +++ b/src/code/audio_synthesis.c @@ -112,14 +112,14 @@ void func_800DB03C(s32 arg0) { s32 baseIndex; s32 i; - baseIndex = gAudioContext.maxSimultaneousNotes * arg0; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + baseIndex = gAudioContext.numNotes * arg0; + for (i = 0; i < gAudioContext.numNotes; i++) { subEu = &gAudioContext.notes[i].noteSubEu; subEu2 = &gAudioContext.noteSubsEu[baseIndex + i]; - if (subEu->bitField0.s.enabled) { - subEu->bitField0.s.needsInit = false; + if (subEu->bitField0.enabled) { + subEu->bitField0.needsInit = false; } else { - subEu2->bitField0.s.enabled = false; + subEu2->bitField0.enabled = false; } subEu->unk_06 = 0; @@ -136,7 +136,7 @@ Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen) cmdP = cmdStart; for (i = gAudioContext.audioBufferParameters.updatesPerFrame; i > 0; i--) { - Audio_ProcessSequences(i - 1); + AudioSeq_ProcessSequences(i - 1); func_800DB03C(gAudioContext.audioBufferParameters.updatesPerFrame - i); } @@ -181,9 +181,9 @@ void func_800DB2C0(s32 updateIndexStart, s32 noteIndex) { s32 i; for (i = updateIndexStart + 1; i < gAudioContext.audioBufferParameters.updatesPerFrame; i++) { - temp_v1 = &gAudioContext.noteSubsEu[(gAudioContext.maxSimultaneousNotes * i) + noteIndex]; - if (!temp_v1->bitField0.s.needsInit) { - temp_v1->bitField0.s.enabled = 0; + temp_v1 = &gAudioContext.noteSubsEu[(gAudioContext.numNotes * i) + noteIndex]; + if (!temp_v1->bitField0.needsInit) { + temp_v1->bitField0.enabled = 0; } else { break; } @@ -442,11 +442,11 @@ void func_800DBE64(void) { void func_800DBE6C(void) { } -void AudioSynth_SetFilter(Acmd* cmd, s32 flags, s32 countOrBuf, s32 addr) { +void AudioSynth_LoadFilter(Acmd* cmd, s32 flags, s32 countOrBuf, s32 addr) { aFilter(cmd, flags, countOrBuf, addr); } -void AudioSynth_SetFilterCount(Acmd* cmd, s32 count, s32 addr) { +void AudioSynth_LoadFilterCount(Acmd* cmd, s32 count, s32 addr) { aFilter(cmd, 2, count, addr); } @@ -563,28 +563,27 @@ Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updat NoteSubEu* noteSubEu2; s32 unk14; - t = gAudioContext.maxSimultaneousNotes * updateIndex; + t = gAudioContext.numNotes * updateIndex; count = 0; if (gAudioContext.numSynthesisReverbs == 0) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { - if (gAudioContext.noteSubsEu[t + i].bitField0.s.enabled) { + for (i = 0; i < gAudioContext.numNotes; i++) { + if (gAudioContext.noteSubsEu[t + i].bitField0.enabled) { noteIndices[count++] = i; } } } else { for (reverbIndex = 0; reverbIndex < gAudioContext.numSynthesisReverbs; reverbIndex++) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { noteSubEu = &gAudioContext.noteSubsEu[t + i]; - if (noteSubEu->bitField0.s.enabled && noteSubEu->bitField1.s.reverbIndex == reverbIndex) { + if (noteSubEu->bitField0.enabled && noteSubEu->bitField1.reverbIndex == reverbIndex) { noteIndices[count++] = i; } } } - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { noteSubEu = &gAudioContext.noteSubsEu[t + i]; - if (noteSubEu->bitField0.s.enabled && - noteSubEu->bitField1.s.reverbIndex >= gAudioContext.numSynthesisReverbs) { + if (noteSubEu->bitField0.enabled && noteSubEu->bitField1.reverbIndex >= gAudioContext.numSynthesisReverbs) { noteIndices[count++] = i; } } @@ -620,7 +619,7 @@ Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updat while (i < count) { noteSubEu2 = &gAudioContext.noteSubsEu[noteIndices[i] + t]; - if (noteSubEu2->bitField1.s.reverbIndex == reverbIndex) { + if (noteSubEu2->bitField1.reverbIndex == reverbIndex) { cmd = AudioSynth_ProcessNote(noteIndices[i], noteSubEu2, &gAudioContext.notes[noteIndices[i]].synthesisState, aiBuf, aiBufLen, cmd, updateIndex); @@ -662,43 +661,43 @@ Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updat Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIndex) { s32 pad1[3]; - AudioBankSample* audioBankSample; + SoundFontSample* audioFontSample; AdpcmLoop* loopInfo; - s32 samplesRemaining; + s32 nSamplesUntilLoopEnd; s32 nSamplesInThisIteration; s32 noteFinished; s32 restart; s32 flags; u16 resamplingRateFixedPoint; - s32 phi_s6; - s32 phi_s7; + s32 nSamplesInFirstFrame; + s32 nTrailingSamplesToIgnore; s32 phi_a1_2; - s32 temp_v1_5; - s32 sp120; + s32 frameIndex; + s32 skipBytes; s32 temp_v1_6; void* buf; - s32 phi_s0; - s32 sampleAddr; + s32 nSamplesToDecode; + u32 sampleAddr; u32 samplesLenFixedPoint; s32 samplesLenAdjusted; - s32 nAdpcmSamplesProcessed; - s32 endPos; + s32 nSamplesProcessed; + s32 loopEndPos; s32 nSamplesToProcess; s32 phi_s4; - s32 phi_s3; + s32 nFirstFrameSamplesToIgnore; s32 pad2[7]; - s32 spD4; - s32 phi_s1; - s32 spCC; - s32 spC8; - u8* phi_a1; + s32 frameSize; + s32 nFramesToDecode; + s32 skipInitialSamples; + s32 sampleDataStart; + u8* sampleData; s32 nParts; s32 curPart; - s32 phi_t0; + s32 sampleDataStartPad; s32 side; s32 resampledTempLen; u16 noteSamplesDmemAddrBeforeResampling; - s32 temp_mult; + s32 sampleDataOffset; s32 thing; s32 s5; Note* note; @@ -712,12 +711,12 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS s16 addr; u16 unused; - bookOffset = noteSubEu->bitField1.s.bookOffset; - finished = noteSubEu->bitField0.s.finished; + bookOffset = noteSubEu->bitField1.bookOffset; + finished = noteSubEu->bitField0.finished; note = &gAudioContext.notes[noteIndex]; flags = A_CONTINUE; - if (noteSubEu->bitField0.s.needsInit == true) { + if (noteSubEu->bitField0.needsInit == true) { flags = A_INIT; synthState->restart = 0; synthState->samplePosInt = note->unk_BC; @@ -727,42 +726,40 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS synthState->prevHeadsetPanRight = 0; synthState->prevHeadsetPanLeft = 0; synthState->reverbVol = noteSubEu->reverbVol; - synthState->numAdpcmParts = 0; + synthState->numParts = 0; synthState->unk_1A = 1; - note->noteSubEu.bitField0.s.finished = false; + note->noteSubEu.bitField0.finished = false; finished = false; } resamplingRateFixedPoint = noteSubEu->resamplingRateFixedPoint; - nParts = noteSubEu->bitField1.s.hasTwoAdpcmParts + 1; + nParts = noteSubEu->bitField1.hasTwoParts + 1; samplesLenFixedPoint = (resamplingRateFixedPoint * aiBufLen * 2) + synthState->samplePosFrac; nSamplesToLoad = samplesLenFixedPoint >> 16; synthState->samplePosFrac = samplesLenFixedPoint & 0xFFFF; // Partially-optimized out no-op ifs required for matching. SM64 decomp // makes it clear that this is how it should look. - if (synthState->numAdpcmParts == 1 && nParts == 2) { - } else if (synthState->numAdpcmParts == 2 && nParts == 1) { + if (synthState->numParts == 1 && nParts == 2) { + } else if (synthState->numParts == 2 && nParts == 1) { } else { } - synthState->numAdpcmParts = nParts; + synthState->numParts = nParts; - if (noteSubEu->bitField1.s.isSyntheticWave) { + if (noteSubEu->bitField1.isSyntheticWave) { cmd = AudioSynth_LoadWaveSamples(cmd, noteSubEu, synthState, nSamplesToLoad); noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + (synthState->samplePosInt * 2); synthState->samplePosInt += nSamplesToLoad; } else { - // ADPCM note - audioBankSample = noteSubEu->sound.audioBankSound->sample; - loopInfo = audioBankSample->loop; - endPos = loopInfo->end; - sampleAddr = audioBankSample->sampleAddr; + audioFontSample = noteSubEu->sound.soundFontSound->sample; + loopInfo = audioFontSample->loop; + loopEndPos = loopInfo->end; + sampleAddr = audioFontSample->sampleAddr; resampledTempLen = 0; for (curPart = 0; curPart < nParts; curPart++) { - // reordering in the loop prelude - nAdpcmSamplesProcessed = 0; + nSamplesProcessed = 0; s5 = 0; if (nParts == 1) { @@ -773,8 +770,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS samplesLenAdjusted = nSamplesToLoad; } - if (audioBankSample->codec == 0 || audioBankSample->codec == 3) { - if (gAudioContext.curLoadedBook != (*audioBankSample->book).book) { + if (audioFontSample->codec == CODEC_ADPCM || audioFontSample->codec == CODEC_SMALL_ADPCM) { + if (gAudioContext.curLoadedBook != audioFontSample->book->book) { u32 nEntries; switch (bookOffset) { case 1: @@ -783,43 +780,43 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS case 2: case 3: default: - gAudioContext.curLoadedBook = (*audioBankSample->book).book; + gAudioContext.curLoadedBook = audioFontSample->book->book; break; } if (1) {} if (1) {} if (1) {} - nEntries = 16 * audioBankSample->book->order * audioBankSample->book->npredictors; + nEntries = 16 * audioFontSample->book->order * audioFontSample->book->npredictors; aLoadADPCM(cmd++, nEntries, gAudioContext.curLoadedBook); } } - while (nAdpcmSamplesProcessed != samplesLenAdjusted) { + while (nSamplesProcessed != samplesLenAdjusted) { noteFinished = false; restart = false; phi_s4 = 0; - phi_s3 = synthState->samplePosInt & 0xF; - samplesRemaining = endPos - synthState->samplePosInt; - nSamplesToProcess = samplesLenAdjusted - nAdpcmSamplesProcessed; + nFirstFrameSamplesToIgnore = synthState->samplePosInt & 0xF; + nSamplesUntilLoopEnd = loopEndPos - synthState->samplePosInt; + nSamplesToProcess = samplesLenAdjusted - nSamplesProcessed; - if (phi_s3 == 0 && synthState->restart == false) { - phi_s3 = 16; + if (nFirstFrameSamplesToIgnore == 0 && !synthState->restart) { + nFirstFrameSamplesToIgnore = 16; } - phi_s6 = 16 - phi_s3; + nSamplesInFirstFrame = 16 - nFirstFrameSamplesToIgnore; - if (nSamplesToProcess < samplesRemaining) { - phi_s1 = (s32)(nSamplesToProcess - phi_s6 + 15) / 16; - phi_s0 = phi_s1 * 16; - phi_s7 = phi_s6 + phi_s0 - nSamplesToProcess; + if (nSamplesToProcess < nSamplesUntilLoopEnd) { + nFramesToDecode = (s32)(nSamplesToProcess - nSamplesInFirstFrame + 15) / 16; + nSamplesToDecode = nFramesToDecode * 16; + nTrailingSamplesToIgnore = nSamplesInFirstFrame + nSamplesToDecode - nSamplesToProcess; } else { - phi_s0 = samplesRemaining - phi_s6; - phi_s7 = 0; - if (phi_s0 <= 0) { - phi_s0 = 0; - phi_s6 = samplesRemaining; + nSamplesToDecode = nSamplesUntilLoopEnd - nSamplesInFirstFrame; + nTrailingSamplesToIgnore = 0; + if (nSamplesToDecode <= 0) { + nSamplesToDecode = 0; + nSamplesInFirstFrame = nSamplesUntilLoopEnd; } - phi_s1 = (phi_s0 + 15) / 16; + nFramesToDecode = (nSamplesToDecode + 15) / 16; if (loopInfo->count != 0) { // Loop around and restart restart = true; @@ -828,111 +825,114 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS } } - switch (audioBankSample->codec) { + switch (audioFontSample->codec) { case CODEC_ADPCM: - spD4 = 9; - spCC = 0x10; - spC8 = 0; + frameSize = 9; + skipInitialSamples = 16; + sampleDataStart = 0; break; - case 3: - spD4 = 5; - spCC = 0x10; - spC8 = 0; + case CODEC_SMALL_ADPCM: + frameSize = 5; + skipInitialSamples = 16; + sampleDataStart = 0; break; case CODEC_S8: - spD4 = 0x10; - spCC = 0x10; - spC8 = 0; + frameSize = 16; + skipInitialSamples = 16; + sampleDataStart = 0; break; - case 2: + case CODEC_S16_INMEMORY: AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20); flags = A_CONTINUE; - sp120 = 0; - nAdpcmSamplesProcessed = samplesLenAdjusted; + skipBytes = 0; + nSamplesProcessed = samplesLenAdjusted; s5 = samplesLenAdjusted; goto skip; - case 5: + case CODEC_S16: AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20); flags = A_CONTINUE; - sp120 = 0; - nAdpcmSamplesProcessed = samplesLenAdjusted; + skipBytes = 0; + nSamplesProcessed = samplesLenAdjusted; s5 = samplesLenAdjusted; goto skip; - case 4: + case CODEC_REVERB: break; } - if (phi_s1 != 0) { - temp_v1_5 = (synthState->samplePosInt + spCC - phi_s3) / 16; - temp_mult = (temp_v1_5 * spD4); - if (audioBankSample->medium == 0) { - phi_a1 = spC8 + temp_mult + sampleAddr; - } else if (audioBankSample->medium == 1) { + if (nFramesToDecode != 0) { + frameIndex = (synthState->samplePosInt + skipInitialSamples - nFirstFrameSamplesToIgnore) / 16; + sampleDataOffset = frameIndex * frameSize; + if (audioFontSample->medium == MEDIUM_RAM) { + sampleData = (u8*)(sampleDataStart + sampleDataOffset + sampleAddr); + } else if (audioFontSample->medium == MEDIUM_UNK) { return cmd; } else { - phi_a1 = - Audio_DmaSampleData((u32)(spC8 + temp_mult + sampleAddr), ALIGN16((phi_s1 * spD4) + 0x10), - flags, &synthState->sampleDmaIndex, audioBankSample->medium); + sampleData = AudioLoad_DmaSampleData(sampleDataStart + sampleDataOffset + sampleAddr, + ALIGN16((nFramesToDecode * frameSize) + 0x10), flags, + &synthState->sampleDmaIndex, audioFontSample->medium); } - if (phi_a1 == NULL) { + if (sampleData == NULL) { return cmd; } - phi_t0 = (u32)phi_a1 & 0xF; - aligned = ALIGN16((phi_s1 * spD4) + 16); + sampleDataStartPad = (u32)sampleData & 0xF; + aligned = ALIGN16((nFramesToDecode * frameSize) + 16); addr = DMEM_COMPRESSED_ADPCM_DATA - aligned; - aLoadBuffer(cmd++, phi_a1 - phi_t0, addr, aligned); + aLoadBuffer(cmd++, sampleData - sampleDataStartPad, addr, aligned); } else { - phi_s0 = 0; - phi_t0 = 0; + nSamplesToDecode = 0; + sampleDataStartPad = 0; } if (synthState->restart) { - aSetLoop(cmd++, audioBankSample->loop->state); + aSetLoop(cmd++, audioFontSample->loop->state); flags = A_LOOP; synthState->restart = false; } - nSamplesInThisIteration = phi_s0 + phi_s6 - phi_s7; - if (nAdpcmSamplesProcessed == 0) { + nSamplesInThisIteration = nSamplesToDecode + nSamplesInFirstFrame - nTrailingSamplesToIgnore; + if (nSamplesProcessed == 0) { if (1) {} - sp120 = phi_s3 * 2; + skipBytes = nFirstFrameSamplesToIgnore * 2; } else { phi_s4 = ALIGN16(s5 + 16); } - switch (audioBankSample->codec) { + switch (audioFontSample->codec) { case CODEC_ADPCM: - aligned = ALIGN16((phi_s1 * spD4) + 0x10); + aligned = ALIGN16((nFramesToDecode * frameSize) + 0x10); addr = DMEM_COMPRESSED_ADPCM_DATA - aligned; - aSetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2); + aSetBuffer(cmd++, 0, addr + sampleDataStartPad, DMEM_UNCOMPRESSED_NOTE + phi_s4, + nSamplesToDecode * 2); aADPCMdec(cmd++, flags, synthState->synthesisBuffers->adpcmdecState); break; - case 3: - aligned = ALIGN16((phi_s1 * spD4) + 0x10); + case CODEC_SMALL_ADPCM: + aligned = ALIGN16((nFramesToDecode * frameSize) + 0x10); addr = DMEM_COMPRESSED_ADPCM_DATA - aligned; - aSetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2); + aSetBuffer(cmd++, 0, addr + sampleDataStartPad, DMEM_UNCOMPRESSED_NOTE + phi_s4, + nSamplesToDecode * 2); aADPCMdec(cmd++, flags | 4, synthState->synthesisBuffers->adpcmdecState); break; case CODEC_S8: - aligned = ALIGN16((phi_s1 * spD4) + 0x10); + aligned = ALIGN16((nFramesToDecode * frameSize) + 0x10); addr = DMEM_COMPRESSED_ADPCM_DATA - aligned; - AudioSynth_SetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2); + AudioSynth_SetBuffer(cmd++, 0, addr + sampleDataStartPad, DMEM_UNCOMPRESSED_NOTE + phi_s4, + nSamplesToDecode * 2); AudioSynth_S8Dec(cmd++, flags, synthState->synthesisBuffers->adpcmdecState); break; } - if (nAdpcmSamplesProcessed != 0) { - aDMEMMove(cmd++, DMEM_UNCOMPRESSED_NOTE + phi_s4 + (phi_s3 * 2), DMEM_UNCOMPRESSED_NOTE + s5, - nSamplesInThisIteration * 2); + if (nSamplesProcessed != 0) { + aDMEMMove(cmd++, DMEM_UNCOMPRESSED_NOTE + phi_s4 + (nFirstFrameSamplesToIgnore * 2), + DMEM_UNCOMPRESSED_NOTE + s5, nSamplesInThisIteration * 2); } - nAdpcmSamplesProcessed += nSamplesInThisIteration; + nSamplesProcessed += nSamplesInThisIteration; switch (flags) { case A_INIT: - sp120 = 0x20; - s5 = (phi_s0 + 0x10) * 2; + skipBytes = 0x20; + s5 = (nSamplesToDecode + 0x10) * 2; break; case A_LOOP: s5 = nSamplesInThisIteration * 2 + s5; @@ -941,7 +941,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS if (s5 != 0) { s5 = nSamplesInThisIteration * 2 + s5; } else { - s5 = (phi_s3 + nSamplesInThisIteration) * 2; + s5 = (nFirstFrameSamplesToIgnore + nSamplesInThisIteration) * 2; } break; } @@ -951,9 +951,9 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS skip: if (noteFinished) { AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE + s5, - (samplesLenAdjusted - nAdpcmSamplesProcessed) * 2); + (samplesLenAdjusted - nSamplesProcessed) * 2); finished = true; - note->noteSubEu.bitField0.s.finished = true; + note->noteSubEu.bitField0.finished = true; func_800DB2C0(updateIndex, noteIndex); break; } else { @@ -968,12 +968,12 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS switch (nParts) { case 1: - noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + sp120; + noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + skipBytes; break; case 2: switch (curPart) { case 0: - AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + sp120, DMEM_TEMP + 0x20, + AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + skipBytes, DMEM_TEMP + 0x20, ((samplesLenAdjusted / 2) + 7) & ~7); resampledTempLen = samplesLenAdjusted; noteSamplesDmemAddrBeforeResampling = DMEM_TEMP + 0x20; @@ -983,7 +983,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS } break; case 1: - AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + sp120, + AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + skipBytes, DMEM_TEMP + 0x20 + resampledTempLen, ((samplesLenAdjusted / 2) + 7) & ~7); break; } @@ -995,8 +995,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS } flags = A_CONTINUE; - if (noteSubEu->bitField0.s.needsInit == true) { - noteSubEu->bitField0.s.needsInit = false; + if (noteSubEu->bitField0.needsInit == true) { + noteSubEu->bitField0.needsInit = false; flags = A_INIT; } @@ -1020,8 +1020,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS filter = noteSubEu->filter; if (filter != 0) { - AudioSynth_SetFilterCount(cmd++, aiBufLen * 2, filter); - AudioSynth_SetFilter(cmd++, flags, DMEM_TEMP, synthState->synthesisBuffers->mixEnvelopeState); + AudioSynth_LoadFilterCount(cmd++, aiBufLen * 2, filter); + AudioSynth_LoadFilter(cmd++, flags, DMEM_TEMP, synthState->synthesisBuffers->mixEnvelopeState); } unk7 = noteSubEu->unk_07; @@ -1051,7 +1051,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS side = 0; } cmd = AudioSynth_ProcessEnvelope(cmd, noteSubEu, synthState, aiBufLen, DMEM_TEMP, side, flags); - if (noteSubEu->bitField1.s.usesHeadsetPanEffects2) { + if (noteSubEu->bitField1.usesHeadsetPanEffects2) { if (!(flags & A_INIT)) { flags = A_CONTINUE; } @@ -1118,7 +1118,7 @@ Acmd* AudioSynth_ProcessEnvelope(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisS synthState->curVolLeft = curVolLeft + (rampLeft * (aiBufLen >> 3)); synthState->curVolRight = curVolRight + (rampRight * (aiBufLen >> 3)); - if (noteSubEu->bitField1.s.usesHeadsetPanEffects2) { + if (noteSubEu->bitField1.usesHeadsetPanEffects2) { AudioSynth_ClearBuffer(cmd++, DMEM_NOTE_PAN_TEMP, DEFAULT_LEN_1CH); AudioSynth_EnvSetup1(cmd++, phi_t1 * 2, rampReverb, rampLeft, rampRight); AudioSynth_EnvSetup2(cmd++, curVolLeft, curVolRight); @@ -1139,9 +1139,9 @@ Acmd* AudioSynth_ProcessEnvelope(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisS phi_a1 = D_801304AC; } - aEnvMixer(cmd++, inBuf, aiBufLen, (sourceReverbVol & 0x80) >> 7, noteSubEu->bitField0.s.stereoHeadsetEffects, - noteSubEu->bitField0.s.usesHeadsetPanEffects, noteSubEu->bitField0.s.stereoStrongRight, - noteSubEu->bitField0.s.stereoStrongLeft, phi_a1, D_801304A0); + aEnvMixer(cmd++, inBuf, aiBufLen, (sourceReverbVol & 0x80) >> 7, noteSubEu->bitField0.stereoHeadsetEffects, + noteSubEu->bitField0.usesHeadsetPanEffects, noteSubEu->bitField0.stereoStrongRight, + noteSubEu->bitField0.stereoStrongLeft, phi_a1, D_801304A0); return cmd; } @@ -1151,7 +1151,7 @@ Acmd* AudioSynth_LoadWaveSamples(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisS s32 samplePosInt = synthState->samplePosInt; s32 repeats; - if (noteSubEu->bitField1.s.bookOffset != 0) { + if (noteSubEu->bitField1.bookOffset != 0) { AudioSynth_LoadBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, ALIGN16(nSamplesToLoad * 2), gWaveSamples[8]); gWaveSamples[8] += nSamplesToLoad * 2; return cmd; diff --git a/src/code/code_8006BA00.c b/src/code/code_8006BA00.c index e3549db8bc..6919827fbb 100644 --- a/src/code/code_8006BA00.c +++ b/src/code/code_8006BA00.c @@ -16,7 +16,7 @@ void func_8006BA30(GlobalContext* globalCtx) { for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) { if (source->countdown != 0) { if (DECR(source->countdown) == 0) { - func_800F89E8(&source->relativePos); + Audio_StopSfxByPos(&source->relativePos); } else { SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->mf_11D60, &source->originPos, &source->relativePos); } @@ -49,7 +49,7 @@ void Audio_PlaySoundAtPosition(GlobalContext* globalCtx, Vec3f* pos, s32 duratio if (i >= ARRAY_COUNT(globalCtx->soundSources)) { source = backupSource; - func_800F89E8(&source->relativePos); + Audio_StopSfxByPos(&source->relativePos); } source->originPos = *pos; diff --git a/src/code/code_800C3C20.c b/src/code/code_800C3C20.c index 72596fbf22..bd3b37850a 100644 --- a/src/code/code_800C3C20.c +++ b/src/code/code_800C3C20.c @@ -8,6 +8,6 @@ void func_800C3C20(void) { s32 i; for (i = 0; (i < ARRAY_COUNT(D_8012D200)) & 0xFFFFFFFF; i++) { - func_800F87A0(D_8012D200[i]); + Audio_StopSfxByBank(D_8012D200[i]); } } diff --git a/src/code/code_800E4FE0.c b/src/code/code_800E4FE0.c index 6371bf2bbf..102012fa7e 100644 --- a/src/code/code_800E4FE0.c +++ b/src/code/code_800E4FE0.c @@ -107,12 +107,12 @@ AudioTask* func_800E5000(void) { } gAudioContext.curAudioFrameDmaCount = 0; - func_800E11F0(); - Audio_ProcessLoads(gAudioContext.resetStatus); - func_800E4F58(); + AudioLoad_DecreaseSampleDmaTtls(); + AudioLoad_ProcessLoads(gAudioContext.resetStatus); + AudioLoad_ProcessScriptLoads(); if (gAudioContext.resetStatus != 0) { - if (Audio_ResetStep() == 0) { + if (AudioHeap_ResetStep() == 0) { if (gAudioContext.resetStatus == 0) { osSendMesg(gAudioContext.audioResetQueueP, gAudioContext.audioResetSpecIdToLoad, OS_MESG_NOBLOCK); } @@ -217,19 +217,19 @@ void func_800E5584(AudioCmd* cmd) { switch (cmd->op) { case 0x81: - func_800E1C18(cmd->arg1, cmd->arg2); + AudioLoad_SyncLoadSeqParts(cmd->arg1, cmd->arg2); return; case 0x82: - func_800E20D4(cmd->arg0, cmd->arg1, cmd->arg2); + AudioLoad_SyncInitSeqPlayer(cmd->arg0, cmd->arg1, cmd->arg2); func_800E59AC(cmd->arg0, cmd->data); return; case 0x85: - func_800E2124(cmd->arg0, cmd->arg1, cmd->data); + AudioLoad_SyncInitSeqPlayerSkipTicks(cmd->arg0, cmd->arg1, cmd->data); return; case 0x83: if (gAudioContext.seqPlayers[cmd->arg0].enabled) { if (cmd->asInt == 0) { - Audio_SequencePlayerDisableAsFinished(&gAudioContext.seqPlayers[cmd->arg0]); + AudioSeq_SequencePlayerDisableAsFinished(&gAudioContext.seqPlayers[cmd->arg0]); } else { func_800E5958(cmd->arg0, cmd->asInt); } @@ -247,12 +247,12 @@ void func_800E5584(AudioCmd* cmd) { return; case 0xF2: if (cmd->asUInt == 1) { - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { Note* note = &gAudioContext.notes[i]; NoteSubEu* subEu = ¬e->noteSubEu; - if (subEu->bitField0.s.enabled && note->playbackState.unk_04 == 0) { - if (note->playbackState.parentLayer->seqChannel->muteBehavior & 8) { - subEu->bitField0.s.finished = 1; + if (subEu->bitField0.enabled && note->playbackState.unk_04 == 0) { + if (note->playbackState.parentLayer->channel->muteBehavior & 8) { + subEu->bitField0.finished = 1; } } } @@ -266,19 +266,19 @@ void func_800E5584(AudioCmd* cmd) { return; case 0xF3: - func_800E1D64(cmd->arg0, cmd->arg1, cmd->arg2); + AudioLoad_SyncLoadInstrument(cmd->arg0, cmd->arg1, cmd->arg2); return; case 0xF4: - Audio_AudioTableAsyncLoad(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.unk_1E20); + AudioLoad_AsyncLoadSampleBank(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.externalLoadQueue); return; case 0xF5: - Audio_AudioBankAsyncLoad(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.unk_1E20); + AudioLoad_AsyncLoadFont(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.externalLoadQueue); return; case 0xFC: - Audio_AudioSeqAsyncLoad(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.unk_1E20); + AudioLoad_AsyncLoadSeq(cmd->arg0, cmd->arg1, cmd->arg2, &gAudioContext.externalLoadQueue); return; case 0xF6: - func_800E1F7C(cmd->arg1); + AudioLoad_DiscardSeqFonts(cmd->arg1); return; case 0x90: gAudioContext.unk_5BDC[cmd->arg0] = cmd->asUShort; @@ -293,7 +293,7 @@ void func_800E5584(AudioCmd* cmd) { case 0xE0: case 0xE1: case 0xE2: - func_800E7744(cmd->op - 0xE0, cmd->arg0, cmd->arg1, cmd->data); + Audio_SetFontInstrument(cmd->op - 0xE0, cmd->arg0, cmd->arg1, cmd->data); return; case 0xFE: temp_t7 = cmd->asUInt; @@ -301,14 +301,14 @@ void func_800E5584(AudioCmd* cmd) { for (i = 0; i < gAudioContext.audioBufferParameters.numSequencePlayers; i++) { SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[i]; if (seqPlayer->enabled) { - Audio_SequencePlayerDisableAsFinished(seqPlayer); + AudioSeq_SequencePlayerDisableAsFinished(seqPlayer); } } } func_800E66C0(temp_t7); return; case 0xE3: - func_800DE4B0(cmd->asInt); + AudioHeap_PopCache(cmd->asInt); return; default: return; @@ -478,24 +478,24 @@ void Audio_ProcessCmds(u32 msg) { } } -u32 func_800E5E20(u32* arg0) { +u32 func_800E5E20(u32* out) { u32 sp1C; - if (osRecvMesg(&gAudioContext.unk_1E20, (OSMesg*)&sp1C, OS_MESG_NOBLOCK) == -1) { - *arg0 = 0; + if (osRecvMesg(&gAudioContext.externalLoadQueue, (OSMesg*)&sp1C, OS_MESG_NOBLOCK) == -1) { + *out = 0; return 0; } - *arg0 = sp1C & 0xFFFFFF; + *out = sp1C & 0xFFFFFF; return sp1C >> 0x18; } u8* func_800E5E84(s32 arg0, u32* arg1) { - return func_800E1F38(arg0, arg1); + return AudioLoad_GetFontsForSequence(arg0, arg1); } void func_800E5EA4(s32 arg0, u32* arg1, u32* arg2) { - *arg1 = gAudioContext.ctlEntries[arg0].unk_02; - *arg2 = gAudioContext.ctlEntries[arg0].unk_03; + *arg1 = gAudioContext.soundFonts[arg0].sampleBankId1; + *arg2 = gAudioContext.soundFonts[arg0].sampleBankId2; } s32 func_800E5EDC(void) { @@ -563,15 +563,15 @@ s8 func_800E6070(s32 playerIdx, s32 channelIdx, s32 scriptIdx) { } s8 func_800E60C4(s32 arg0, s32 arg1) { - return gAudioContext.seqPlayers[arg0].unk_158[arg1]; + return gAudioContext.seqPlayers[arg0].soundScriptIO[arg1]; } -void func_800E60EC(void* memAddr, u32 size) { - Audio_SoundAllocPoolInit(&gAudioContext.unkPool, memAddr, size); +void Audio_InitExternalPool(void* mem, u32 size) { + AudioHeap_AllocPoolInit(&gAudioContext.externalPool, mem, size); } -void func_800E611C(void) { - gAudioContext.unkPool.start = NULL; +void Audio_DestroyExternalPool(void) { + gAudioContext.externalPool.start = NULL; } void func_800E6128(SequencePlayer* seqPlayer, AudioCmd* cmd) { @@ -596,7 +596,7 @@ void func_800E6128(SequencePlayer* seqPlayer, AudioCmd* cmd) { seqPlayer->transposition = cmd->asSbyte; return; case 0x46: - seqPlayer->unk_158[cmd->arg2] = cmd->asSbyte; + seqPlayer->soundScriptIO[cmd->arg2] = cmd->asSbyte; return; case 0x4A: fadeVolume = (s32)cmd->arg1 / 127.0f; @@ -725,9 +725,9 @@ void Audio_WaitForAudioTask(void) { s32 func_800E6590(s32 arg0, s32 arg1, s32 arg2) { SequencePlayer* seqPlayer; - SequenceChannelLayer* layer; + SequenceLayer* layer; Note* note; - AudioBankSound* sound; + SoundFontSound* sound; s32 loopEnd; s32 samplePos; @@ -749,7 +749,7 @@ s32 func_800E6590(s32 arg0, s32 arg1, s32 arg2) { note = layer->note; if (layer == note->playbackState.parentLayer) { - sound = note->noteSubEu.sound.audioBankSound; + sound = note->noteSubEu.sound.soundFontSound; if (sound == NULL) { return 0; } @@ -777,21 +777,21 @@ s32 func_800E66C0(s32 arg0) { NoteSubEu* temp_a3; s32 i; Note* note; - AudioBankSound* sound; + SoundFontSound* sound; phi_v1 = 0; - for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) { + for (i = 0; i < gAudioContext.numNotes; i++) { note = &gAudioContext.notes[i]; temp_a2 = ¬e->playbackState; - if (note->noteSubEu.bitField0.s.enabled) { + if (note->noteSubEu.bitField0.enabled) { temp_a3 = ¬e->noteSubEu; if (temp_a2->adsr.action.s.state != 0) { if (arg0 >= 2) { - sound = temp_a3->sound.audioBankSound; - if (sound == NULL || temp_a3->bitField1.s.isSyntheticWave) { + sound = temp_a3->sound.soundFontSound; + if (sound == NULL || temp_a3->bitField1.isSyntheticWave) { continue; } - if (sound->sample->medium == 0) { + if (sound->sample->medium == MEDIUM_RAM) { continue; } } diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c index 74d20e6b8f..0b56958550 100644 --- a/src/code/code_800EC960.c +++ b/src/code/code_800EC960.c @@ -3,34 +3,35 @@ // TODO: can these macros be shared between files? code_800F9280 seems to use // versions without any casts... -#define Audio_DisableSeq(seqIdx, fadeOut) Audio_QueueCmdS32(0x83000000 | ((u8)seqIdx << 16), fadeOut) -#define Audio_StartSeq(seqIdx, fadeTimer, seqId) \ - Audio_QueueSeqCmd(0x00000000 | ((u8)seqIdx << 24) | ((u8)(fadeTimer) << 0x10) | (u16)seqId) -#define Audio_SeqCmd7(seqIdx, a, b) Audio_QueueSeqCmd(0x70000000 | ((u8)seqIdx << 0x18) | ((u8)a << 0x10) | (u8)(b)) -#define Audio_SeqCmdC(seqIdx, a, b, c) \ - Audio_QueueSeqCmd(0xC0000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)(c))) -#define Audio_SeqCmdA(seqIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((u8)seqIdx << 24) | ((u16)(a))) -#define Audio_SeqCmd1(seqIdx, a) Audio_QueueSeqCmd(0x100000FF | ((u8)seqIdx << 24) | ((u8)(a) << 16)) -#define Audio_SeqCmdB(seqIdx, a, b, c) \ - Audio_QueueSeqCmd(0xB0000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c)) -#define Audio_SeqCmdB40(seqIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b)) -#define Audio_SeqCmd6(seqIdx, a, b, c) \ - Audio_QueueSeqCmd(0x60000000 | ((u8)seqIdx << 24) | ((u8)(a) << 16) | ((u8)b << 8) | ((u8)c)) -#define Audio_SeqCmdE0(seqIdx, a) Audio_QueueSeqCmd(0xE0000000 | ((u8)seqIdx << 24) | ((u8)a)) -#define Audio_SeqCmdE01(seqIdx, a) Audio_QueueSeqCmd(0xE0000100 | ((u8)seqIdx << 24) | ((u16)a)) -#define Audio_SeqCmd8(seqIdx, a, b, c) \ - Audio_QueueSeqCmd(0x80000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c)) -#define Audio_SeqCmdF(seqIdx, a) Audio_QueueSeqCmd(0xF0000000 | ((u8)seqIdx << 24) | ((u8)a)) +#define Audio_DisableSeq(playerIdx, fadeOut) Audio_QueueCmdS32(0x83000000 | ((u8)playerIdx << 16), fadeOut) +#define Audio_StartSeq(playerIdx, fadeTimer, seqId) \ + Audio_QueueSeqCmd(0x00000000 | ((u8)playerIdx << 24) | ((u8)(fadeTimer) << 0x10) | (u16)seqId) +#define Audio_SeqCmd7(playerIdx, a, b) \ + Audio_QueueSeqCmd(0x70000000 | ((u8)playerIdx << 0x18) | ((u8)a << 0x10) | (u8)(b)) +#define Audio_SeqCmdC(playerIdx, a, b, c) \ + Audio_QueueSeqCmd(0xC0000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)(c))) +#define Audio_SeqCmdA(playerIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((u8)playerIdx << 24) | ((u16)(a))) +#define Audio_SeqCmd1(playerIdx, a) Audio_QueueSeqCmd(0x100000FF | ((u8)playerIdx << 24) | ((u8)(a) << 16)) +#define Audio_SeqCmdB(playerIdx, a, b, c) \ + Audio_QueueSeqCmd(0xB0000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c)) +#define Audio_SeqCmdB40(playerIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b)) +#define Audio_SeqCmd6(playerIdx, a, b, c) \ + Audio_QueueSeqCmd(0x60000000 | ((u8)playerIdx << 24) | ((u8)(a) << 16) | ((u8)b << 8) | ((u8)c)) +#define Audio_SeqCmdE0(playerIdx, a) Audio_QueueSeqCmd(0xE0000000 | ((u8)playerIdx << 24) | ((u8)a)) +#define Audio_SeqCmdE01(playerIdx, a) Audio_QueueSeqCmd(0xE0000100 | ((u8)playerIdx << 24) | ((u16)a)) +#define Audio_SeqCmd8(playerIdx, a, b, c) \ + Audio_QueueSeqCmd(0x80000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c)) +#define Audio_SeqCmdF(playerIdx, a) Audio_QueueSeqCmd(0xF0000000 | ((u8)playerIdx << 24) | ((u8)a)) typedef struct { - /* 0x0 */ f32 unk_00; + /* 0x0 */ f32 vol; /* 0x4 */ f32 freqScale; /* 0x8 */ s8 reverb; /* 0x9 */ s8 panSigned; /* 0xA */ s8 stereoBits; - /* 0xB */ u8 unk_0B; + /* 0xB */ u8 filter; /* 0xC */ u8 unk_0C; -} unk_s1; +} SfxPlayerState; typedef struct { /* 0x0 */ f32 value; @@ -54,11 +55,11 @@ typedef enum { /* 0x5 */ PAGE_SUB_TRACK_INFO, /* 0x6 */ PAGE_CHANNEL_INFO, // unused /* 0x7 */ PAGE_INTERFACE_INFO, - /* 0x8 */ PAGE_SE_FLAG_SWAP, + /* 0x8 */ PAGE_SFX_SWAP, /* 0x9 */ PAGE_BLOCK_CHANGE_BGM, /* 0xA */ PAGE_NATURAL_SOUND_CONTROL, // unused /* 0xB */ PAGE_OCARINA_TEST, - /* 0xC */ PAGE_SE_PARAMETER_CHANGE, + /* 0xC */ PAGE_SFX_PARAMETER_CHANGE, /* 0xD */ PAGE_SCROLL_PRINT, /* 0xE */ PAGE_FREE_AREA, /* 0xF */ PAGE_MAX @@ -81,16 +82,23 @@ typedef enum { #define SCROLL_PRINT_BUF_SIZE 25 +#define OCA_SONGS_SCARECROW 12 +#define OCA_SONGS_MEMORYGAME 13 + +#define SFX_PLAYER_CHANNEL_OCARINA 13 + extern f32 D_8012F6B4[]; // from audio_synthesis -u8 D_80130570[7] = { 0, 0, 0, 1, 0, 0, 0 }; -u8 D_80130578[4][7] = { +u8 gIsLargeSoundBank[7] = { 0, 0, 0, 1, 0, 0, 0 }; + +// Only the first row of these is supported by sequence 0. (gSfxChannelLayout is always 0.) +u8 gChannelsPerBank[4][7] = { { 3, 2, 3, 3, 2, 1, 2 }, { 3, 2, 2, 2, 2, 2, 2 }, { 3, 2, 2, 2, 2, 2, 2 }, { 4, 1, 0, 0, 2, 2, 2 }, }; -u8 D_80130594[4][7] = { +u8 gUsedChannelsPerBank[4][7] = { { 3, 2, 3, 2, 2, 1, 1 }, { 3, 1, 1, 1, 2, 1, 1 }, { 3, 1, 1, 1, 2, 1, 1 }, @@ -102,7 +110,7 @@ s8 D_801305B4 = 35; s8 D_801305B8 = 20; s8 D_801305BC = 30; s8 D_801305C0 = 20; -f32 D_801305C4[2] = { -15.0f, -65.0f }; +f32 sBehindScreenZ[2] = { -15.0f, -65.0f }; u8 sAudioIncreasingTranspose = 0; u8 gMorphaTransposeTable[16] = { 0, 0, 0, 1, 1, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8 }; u8 sPrevChargeLevel = 0; @@ -124,10 +132,10 @@ u8 D_8013062C = 0; u8 D_80130630 = NA_BGM_GENERAL_SFX; u32 D_80130634 = 0; u32 D_80130638 = 0; -u8 D_8013063C = 0; -u8 D_80130640 = 0; -u8 D_80130644 = 0; -u8 D_80130648 = 0; +u8 sAudioBaseFilter = 0; +u8 sAudioExtraFilter = 0; +u8 sAudioBaseFilter2 = 0; +u8 sAudioExtraFilter2 = 0; Vec3f* sSariaBgmPtr = NULL; f32 D_80130650 = 2000.0f; u8 D_80130654 = 0; @@ -207,7 +215,7 @@ f32 sNormalizedNotePlaybackTone = 1.0f; f32 sNormalizedNotePlaybackVolume = 1.0f; s32 D_80130F68 = 0; u8 sOcarinaNoteValues[5] = { 2, 5, 9, 11, 14 }; -u8 sOcaMinigameApndPos = 0; +u8 sOcaMinigameAppendPos = 0; u8 sOcaMinigameEndPos = 0; u8 sOcaMinigameNoteCnts[] = { 5, 6, 8 }; @@ -356,7 +364,7 @@ OcarinaNote sOcarinaSongs[14][20] = { { 0xFF, 0, 0, 255, 0, 0, 0 }, }, - // OCA_MEMORYGAME_IDX + // OCA_SONGS_MEMORYGAME { { 2, 0, 3, 0, 0, 0, 0 }, { 0xFF, 0, 0, 0, 0, 0, 0 }, @@ -384,8 +392,8 @@ OcarinaNote sPierresSong[108] = { }; OcarinaNote* gScarecrowCustomSongPtr = sPierresSong; -u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongs[12]; -OcarinaNote* D_80131BEC = sOcarinaSongs[13]; +u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongs[OCA_SONGS_SCARECROW]; +OcarinaNote* D_80131BEC = sOcarinaSongs[OCA_SONGS_MEMORYGAME]; u8 sNoteValueIndexMap[16] = { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 5, 3, 3, 4, 4, 4 }; // clang-format off @@ -408,7 +416,7 @@ OcarinaSongInfo gOcarinaSongNotes[14] = { // clang-format on extern u8 D_801333F0; -extern u8 gAudioSEFlagSwapOff; +extern u8 gAudioSfxSwapOff; extern u8 D_80133408; extern u8 D_80133418; @@ -436,7 +444,7 @@ u8 D_8016B8B1; u8 D_8016B8B2; u8 D_8016B8B3; u8 sAudioGanonDistVol; -unk_s1 D_8016B8B8[0x10]; +SfxPlayerState sSfxChannelState[0x10]; char sBinToStrBuf[0x20]; u8 D_8016B9D8; @@ -482,9 +490,9 @@ u32 sDebugPadPress; s32 sAudioUpdateTaskStart; s32 sAudioUpdateTaskEnd; -extern u16 gAudioSEFlagSwapSource[]; -extern u16 gAudioSEFlagSwapTarget[]; -extern u8 gAudioSEFlagSwapMode[]; +extern u16 gAudioSfxSwapSource[]; +extern u16 gAudioSfxSwapTarget[]; +extern u8 gAudioSfxSwapMode[]; void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode); @@ -577,7 +585,7 @@ void func_800ECB7C(u8 songIdx) { while (savedSongIdx < 8 && scarecrowSongIdx < 0x10) { noteIdx = sOcarinaSongs[songIdx][scarecrowSongIdx++].noteIdx; if (noteIdx != 0xFF) { - gOcarinaSongNotes[12].notesIdx[savedSongIdx++] = sNoteValueIndexMap[noteIdx]; + gOcarinaSongNotes[OCA_SONGS_SCARECROW].notesIdx[savedSongIdx++] = sNoteValueIndexMap[noteIdx]; } } } @@ -586,15 +594,15 @@ void func_800ECB7C(u8 songIdx) { void func_800ECC04(u16 flg) { u8 i; - if ((sOcarinaSongs[12][1].volume != 0xFF) && ((flg & 0xFFF) == 0xFFF)) { + if ((sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume != 0xFF) && ((flg & 0xFFF) == 0xFFF)) { flg |= 0x1000; } - if ((flg == 0xCFFF) && (sOcarinaSongs[12][1].volume != 0xFF)) { + if ((flg == 0xCFFF) && (sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume != 0xFF)) { flg = 0xDFFF; } - if ((flg == 0xFFF) && (sOcarinaSongs[12][1].volume != 0xFF)) { + if ((flg == 0xFFF) && (sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume != 0xFF)) { flg = 0x1FFF; } @@ -857,7 +865,7 @@ void func_800ED458(s32 arg0) { Audio_QueueCmdS8(0x6020D05, sCurOcarinaBtnVal); Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &D_801333D4, 4, &D_80130F24, &D_80130F28, &D_801333E8); } else if ((sPrevOcarinaNoteVal != 0xFF) && (sCurOcarinaBtnVal == 0xFF)) { - Audio_StopSfx(NA_SE_OC_OCARINA); + Audio_StopSfxById(NA_SE_OC_OCARINA); } } } @@ -871,7 +879,7 @@ void func_800ED858(u8 arg0) { return; } - Audio_SeqCmd8(2, 1, 0xD, arg0); + Audio_SeqCmd8(2, 1, SFX_PLAYER_CHANNEL_OCARINA, arg0); D_80130F10 = arg0; if (arg0 == 0) { sCurOcarinaBtnPress = 0; @@ -879,25 +887,25 @@ void func_800ED858(u8 arg0) { D_8016BA18 = 0; D_8016BA10 = 0xFFFF; func_800ED458(0); - Audio_StopSfx(NA_SE_OC_OCARINA); + Audio_StopSfxById(NA_SE_OC_OCARINA); Audio_SetSoundBanksMute(0); sPlaybackState = 0; sStaffPlaybackPos = 0; sOcarinaInpEnabled = 0; D_80130F3C = 0; - Audio_ClearBGMMute(0xD); + Audio_ClearBGMMute(SFX_PLAYER_CHANNEL_OCARINA); } else { sCurOcarinaBtnPress = 0; Audio_GetOcaInput(); D_8016BA10 = sCurOcarinaBtnPress; - Audio_QueueSeqCmdMute(0xD); + Audio_QueueSeqCmdMute(SFX_PLAYER_CHANNEL_OCARINA); } } void func_800ED93C(s8 songIdx, s8 arg1) { if (songIdx == 0) { sPlaybackState = 0; - Audio_StopSfx(NA_SE_OC_OCARINA); + Audio_StopSfxById(NA_SE_OC_OCARINA); return; } @@ -950,7 +958,7 @@ void Audio_OcaPlayback(void) { sStaffPlaybackPos = 0; sDisplayedNoteValue = 0xFF; } else { - Audio_StopSfx(NA_SE_OC_OCARINA); + Audio_StopSfxById(NA_SE_OC_OCARINA); } return; } else { @@ -993,7 +1001,7 @@ void Audio_OcaPlayback(void) { Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &D_801333D4, 4, &sNormalizedNotePlaybackTone, &sNormalizedNotePlaybackVolume, &D_801333E8); } else { - Audio_StopSfx(NA_SE_OC_OCARINA); + Audio_StopSfxById(NA_SE_OC_OCARINA); } } sPlaybackNotePos++; @@ -1004,8 +1012,8 @@ void Audio_OcaPlayback(void) { void func_800EDD68(u8 arg0) { u16 i; u16 i2; - u16 mad2; - u8 mad; + u16 pad; + u8 lastNote; OcarinaNote* note; u8 j; u8 k; @@ -1035,10 +1043,10 @@ void func_800EDD68(u8 arg0) { } i = sRecordSongPos; - mad = 0xFF; - while (i != 0 && mad == 0xFF) { + lastNote = 0xFF; + while (i != 0 && lastNote == 0xFF) { i--; - mad = song[i].noteIdx; + lastNote = song[i].noteIdx; } if (1) {} @@ -1056,19 +1064,20 @@ void func_800EDD68(u8 arg0) { song[i] = song[i + 1]; } - func_800ECB7C(0xD); + func_800ECB7C(OCA_SONGS_MEMORYGAME); - for (i = 0; i < 12; i++) { + for (i = 0; i < OCA_SONGS_SCARECROW; i++) { for (j = 0; j < 9 - gOcarinaSongNotes[i].len; j++) { - for (k = 0; k < gOcarinaSongNotes[i].len && k + j < 8 && - gOcarinaSongNotes[i].notesIdx[k] == gOcarinaSongNotes[12].notesIdx[k + j]; + for (k = 0; + k < gOcarinaSongNotes[i].len && k + j < 8 && + gOcarinaSongNotes[i].notesIdx[k] == gOcarinaSongNotes[OCA_SONGS_SCARECROW].notesIdx[k + j]; k++) { ; } if (k == gOcarinaSongNotes[i].len) { D_80131858 = 0xFF; - sOcarinaSongs[12][1].volume = 0xFF; + sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume = 0xFF; return; } } @@ -1076,7 +1085,8 @@ void func_800EDD68(u8 arg0) { i = 1; while (i < 8) { - if (gOcarinaSongNotes[12].notesIdx[0] != gOcarinaSongNotes[12].notesIdx[i]) { + if (gOcarinaSongNotes[OCA_SONGS_SCARECROW].notesIdx[0] != + gOcarinaSongNotes[OCA_SONGS_SCARECROW].notesIdx[i]) { i = 9; } else { i++; @@ -1085,17 +1095,17 @@ void func_800EDD68(u8 arg0) { if (i == 8) { D_80131858 = 0xFF; - sOcarinaSongs[12][1].volume = 0xFF; + sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume = 0xFF; return; } for (i = 0; i < sRecordSongPos; i++) { - sOcarinaSongs[12][i] = sOcarinaSongs[13][i]; + sOcarinaSongs[OCA_SONGS_SCARECROW][i] = sOcarinaSongs[OCA_SONGS_MEMORYGAME][i]; } sOcarinaInpEnabled = 0; } else { - sOcarinaSongs[12][1].volume = 0xFF; + sOcarinaSongs[OCA_SONGS_SCARECROW][1].volume = 0xFF; } } D_80131858 = 0; @@ -1232,7 +1242,7 @@ void func_800EE57C(u8 minigameIdx) { minigameIdx = 2; } - sOcaMinigameApndPos = 0; + sOcaMinigameAppendPos = 0; sOcaMinigameEndPos = sOcaMinigameNoteCnts[minigameIdx]; for (i = 0; i < 3; i++) { @@ -1240,34 +1250,33 @@ void func_800EE57C(u8 minigameIdx) { } } -#define OCA_MEMORYGAME_IDX 0xD s32 func_800EE5EC(void) { u32 rnd; u8 rndNote; - if (sOcaMinigameApndPos == sOcaMinigameEndPos) { + if (sOcaMinigameAppendPos == sOcaMinigameEndPos) { return 1; } rnd = Audio_NextRandom(); rndNote = sOcarinaNoteValues[rnd % 5]; - if (sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos - 1].noteIdx == rndNote) { + if (sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos - 1].noteIdx == rndNote) { rndNote = sOcarinaNoteValues[(rnd + 1) % 5]; } - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].noteIdx = rndNote; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].unk_02 = 0x2D; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].volume = 0x50; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].vibrato = 0; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].tone = 0; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].noteIdx = rndNote; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].unk_02 = 0x2D; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].volume = 0x50; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].vibrato = 0; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].tone = 0; - sOcaMinigameApndPos++; + sOcaMinigameAppendPos++; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].noteIdx = 0xFF; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos].unk_02 = 0; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos + 1].noteIdx = 0xFF; - sOcarinaSongs[OCA_MEMORYGAME_IDX][sOcaMinigameApndPos + 1].unk_02 = 0; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].noteIdx = 0xFF; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos].unk_02 = 0; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos + 1].noteIdx = 0xFF; + sOcarinaSongs[OCA_SONGS_MEMORYGAME][sOcaMinigameAppendPos + 1].unk_02 = 0; if (1) {} return 0; } @@ -1363,7 +1372,7 @@ f32 D_80131C8C = 0.0f; f32 sAudioUpdateDuration = 0.0f; f32 sAudioUpdateDurationMax = 0.0f; u8 sAudioDebugEverOpened = 0; -u8 sAudioSEMuted = 0; +u8 sAudioSfxMuted = 0; u8 sAudioDebugPage = 0; u8 sAudioSndContSel = 0; u8 sAudioDebugTextColor = 7; @@ -1400,13 +1409,13 @@ s8 sAudioScrPrtY = 1; u8 sAudioScrPrtWork[11] = { 1, 19, 6, 0, 0, 0, 0, 0, 0, 0, 1 }; u8 sAudioScrPrtWorkLims[11] = { 2, SCROLL_PRINT_BUF_SIZE, 8, 2, 2, 2, 2, 2, 2, 2, 2 }; u8 sAudioSubTrackInfoSpec = 0; -u8 sAudioSEFlagSwapIsEditing = 0; -u8 sAudioSEFlagSwapSel = 0; -u8 sAudioSEFlagSwapNibbleSel = 0; -char sAudioSEFlagSwapModeNames[2][5] = { "SWAP", "ADD" }; -u8 sAudioSEParamChgSel = 0; -u8 sAudioSEParamChgBitSel = 0; -u16 sAudioSEParamChgWork[4] = { 0 }; +u8 sAudioSfxSwapIsEditing = 0; +u8 sAudioSfxSwapSel = 0; +u8 sAudioSfxSwapNibbleSel = 0; +char sAudioSfxSwapModeNames[2][5] = { "SWAP", "ADD" }; +u8 sAudioSfxParamChgSel = 0; +u8 sAudioSfxParamChgBitSel = 0; +u16 sAudioSfxParamChgWork[4] = { 0 }; u8 sAudioSubTrackInfoPlayerSel = 0; u8 sAudioSubTrackInfoChannelSel = 0; u8 sSeqPlayerPeakNumLayers[20] = { 0 }; @@ -1469,8 +1478,8 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_SetPos(printer, 3, 3); GfxPrint_Printf(printer, "- %s -", sAudioDebugPageNames[sAudioDebugPage]); - for (i = 0; i < gAudioSpecs[gAudioSpecId].maxSimultaneousNotes; i++) { - if (gAudioContext.notes[i].noteSubEu.bitField0.s.enabled == 1) { + for (i = 0; i < gAudioSpecs[gAudioSpecId].numNotes; i++) { + if (gAudioContext.notes[i].noteSubEu.bitField0.enabled == 1) { numEnabledNotes++; } } @@ -1520,7 +1529,7 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "BGM CANCEL:%s", sBoolStrs[sAudioSndContWork[5]]); GfxPrint_SetPos(printer, 3, 5); - GfxPrint_Printf(printer, "SE MUTE:%s", sBoolStrs[sAudioSEMuted]); + GfxPrint_Printf(printer, "SE MUTE:%s", sBoolStrs[sAudioSfxMuted]); GfxPrint_SetPos(printer, 18, 4); SETCOL(255, 255, 255); @@ -1535,8 +1544,8 @@ void AudioDebug_Draw(GfxPrint* printer) { while (i != 0xFF) { GfxPrint_SetPos(printer, 3, 7 + j++); - GfxPrint_Printf(printer, "%02x %04x %02x %08x", i, gSoundBanks[ind][i].sfxId, - gSoundBanks[ind][i].unk_2A, gSoundBanks[ind][i].priority); + GfxPrint_Printf(printer, "%02x %04x %02x %08x", i, gSoundBanks[ind][i].sfxId, gSoundBanks[ind][i].state, + gSoundBanks[ind][i].priority); i = gSoundBanks[ind][i].next; } break; @@ -1592,13 +1601,14 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_SetPos(printer, 2 + sAudioIntInfoX, 4 + ind + sAudioIntInfoY); GfxPrint_Printf(printer, "%s <%d>", sSoundBankNames[k], sAudioIntInfoBankPage[k]); - for (k2 = 0; k2 < D_80130578[D_801333CC][k]; k2++) { -#define entryIndex (D_8016E1B8[k][k2].unk_4) + for (k2 = 0; k2 < gChannelsPerBank[gSfxChannelLayout][k]; k2++) { +#define entryIndex (gActiveSounds[k][k2].entryIndex) #define entry (&gSoundBanks[k][entryIndex]) -#define chan (gAudioContext.seqPlayers[2].channels[entry->unk_2E]) +#define chan (gAudioContext.seqPlayers[2].channels[entry->channelIdx]) GfxPrint_SetPos(printer, 2 + sAudioIntInfoX, 5 + ind + sAudioIntInfoY); if (sAudioIntInfoBankPage[k] == 1) { - if ((entryIndex != 0xFF) && ((entry->unk_2A == 4) || (entry->unk_2A == 5))) { + if ((entryIndex != 0xFF) && + ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) { GfxPrint_Printf(printer, "%2X %5d %5d %5d %02X %04X %04X", entryIndex, (s32)*entry->posX, (s32)*entry->posY, (s32)*entry->posZ, entry->sfxImportance, entry->sfxParams, entry->sfxId); @@ -1606,7 +1616,8 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "FF ----- ----- ----- -- ---- ----"); } } else if (sAudioIntInfoBankPage[k] == 2) { - if ((entryIndex != 0xFF) && ((entry->unk_2A == 4) || (entry->unk_2A == 5))) { + if ((entryIndex != 0xFF) && + ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) { GfxPrint_Printf(printer, "%2X %5d %5d %5d %3d %3d %04X", entryIndex, (s32)*entry->posX, (s32)*entry->posY, (s32)*entry->posZ, (s32)(chan->volume * 127.1f), chan->newPan, entry->sfxId); @@ -1614,7 +1625,8 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "FF ----- ----- ----- --- --- ----"); } } else if (sAudioIntInfoBankPage[k] == 3) { - if ((entryIndex != 0xFF) && ((entry->unk_2A == 4) || (entry->unk_2A == 5))) { + if ((entryIndex != 0xFF) && + ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) { GfxPrint_Printf(printer, "%2X %5d %5d %5d %3d %3d %04X", entryIndex, (s32)*entry->posX, (s32)*entry->posY, (s32)*entry->posZ, (s32)(chan->freqScale * 100.0f), chan->reverb, entry->sfxId); @@ -1622,7 +1634,8 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "FF ----- ----- ----- --- --- ----"); } } else if (sAudioIntInfoBankPage[k] == 4) { - if ((entryIndex != 0xFF) && ((entry->unk_2A == 4) || (entry->unk_2A == 5))) { + if ((entryIndex != 0xFF) && + ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) { GfxPrint_Printf(printer, "%2X %04X", entryIndex, entry->sfxId); } else { GfxPrint_Printf(printer, "FF ----"); @@ -1680,46 +1693,46 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "SEQ ENT : %d", sAudioScrPrtWork[10]); break; - case PAGE_SE_FLAG_SWAP: + case PAGE_SFX_SWAP: GfxPrint_SetPos(printer, 3, 4); SETCOL(255, 255, 255); - if (gAudioSEFlagSwapOff) { + if (gAudioSfxSwapOff) { GfxPrint_Printf(printer, "SWAP OFF"); } - if (sAudioSEFlagSwapIsEditing == 0) { + if (sAudioSfxSwapIsEditing == 0) { SETCOL(255, 255, 255); } else { SETCOL(127, 127, 127); } - GfxPrint_SetPos(printer, 2, 6 + sAudioSEFlagSwapSel); + GfxPrint_SetPos(printer, 2, 6 + sAudioSfxSwapSel); GfxPrint_Printf(printer, "*"); - ctr = sAudioSEFlagSwapNibbleSel; - if (sAudioSEFlagSwapNibbleSel >= 4) { + ctr = sAudioSfxSwapNibbleSel; + if (sAudioSfxSwapNibbleSel >= 4) { ctr++; } - if (sAudioSEFlagSwapIsEditing == 1) { + if (sAudioSfxSwapIsEditing == 1) { SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3 + ctr, 5); GfxPrint_Printf(printer, "V"); } for (i = 0; i < 10; i++) { - if (i == sAudioSEFlagSwapSel) { - if (sAudioSEFlagSwapIsEditing == 0) { + if (i == sAudioSfxSwapSel) { + if (sAudioSfxSwapIsEditing == 0) { SETCOL(192, 192, 192); } else { SETCOL(255, 255, 255); } - } else if (sAudioSEFlagSwapIsEditing == 0) { + } else if (sAudioSfxSwapIsEditing == 0) { SETCOL(144, 144, 144); } else { SETCOL(96, 96, 96); } GfxPrint_SetPos(printer, 3, 6 + i); - GfxPrint_Printf(printer, "%04x %04x %s", gAudioSEFlagSwapSource[i], gAudioSEFlagSwapTarget[i], - sAudioSEFlagSwapModeNames[gAudioSEFlagSwapMode[i]]); + GfxPrint_Printf(printer, "%04x %04x %s", gAudioSfxSwapSource[i], gAudioSfxSwapTarget[i], + sAudioSfxSwapModeNames[gAudioSfxSwapMode[i]]); } break; @@ -1849,7 +1862,7 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "%X", gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel] .channels[sAudioSubTrackInfoChannelSel] - ->bankId); + ->fontId); ctr = (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel] .channels[sAudioSubTrackInfoChannelSel] @@ -1916,7 +1929,7 @@ void AudioDebug_Draw(GfxPrint* printer) { case PAGE_HEAP_INFO: SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3, 4); - GfxPrint_Printf(printer, "TOTAL %d", D_8014A6C4.heap); + GfxPrint_Printf(printer, "TOTAL %d", D_8014A6C4.heapSize); GfxPrint_SetPos(printer, 3, 5); GfxPrint_Printf(printer, "DRIVER %05X / %05X", @@ -1925,44 +1938,40 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_SetPos(printer, 3, 6); GfxPrint_Printf( - printer, "AT-SEQ %02X-%02X (%05X-%05X / %05X)", (u8)gAudioContext.seqLoadedPool.temporary.entries[0].id, - (u8)gAudioContext.seqLoadedPool.temporary.entries[1].id, - gAudioContext.seqLoadedPool.temporary.entries[0].size, - gAudioContext.seqLoadedPool.temporary.entries[1].size, gAudioContext.seqLoadedPool.temporary.pool.size); + printer, "AT-SEQ %02X-%02X (%05X-%05X / %05X)", (u8)gAudioContext.seqCache.temporary.entries[0].id, + (u8)gAudioContext.seqCache.temporary.entries[1].id, gAudioContext.seqCache.temporary.entries[0].size, + gAudioContext.seqCache.temporary.entries[1].size, gAudioContext.seqCache.temporary.pool.size); GfxPrint_SetPos(printer, 3, 7); - GfxPrint_Printf(printer, "AT-BNK %02X-%02X (%05X-%05X / %05X)", - (u8)gAudioContext.bankLoadedPool.temporary.entries[0].id, - (u8)gAudioContext.bankLoadedPool.temporary.entries[1].id, - gAudioContext.bankLoadedPool.temporary.entries[0].size, - gAudioContext.bankLoadedPool.temporary.entries[1].size, - gAudioContext.bankLoadedPool.temporary.pool.size); + GfxPrint_Printf( + printer, "AT-BNK %02X-%02X (%05X-%05X / %05X)", (u8)gAudioContext.fontCache.temporary.entries[0].id, + (u8)gAudioContext.fontCache.temporary.entries[1].id, gAudioContext.fontCache.temporary.entries[0].size, + gAudioContext.fontCache.temporary.entries[1].size, gAudioContext.fontCache.temporary.pool.size); GfxPrint_SetPos(printer, 3, 8); - GfxPrint_Printf( - printer, "ST-SEQ %02Xseqs (%05X / %06X)", gAudioContext.seqLoadedPool.persistent.numEntries, - gAudioContext.seqLoadedPool.persistent.pool.cur - gAudioContext.seqLoadedPool.persistent.pool.start, - gAudioContext.seqLoadedPool.persistent.pool.size); + GfxPrint_Printf(printer, "ST-SEQ %02Xseqs (%05X / %06X)", gAudioContext.seqCache.persistent.numEntries, + gAudioContext.seqCache.persistent.pool.cur - gAudioContext.seqCache.persistent.pool.start, + gAudioContext.seqCache.persistent.pool.size); - for (k = 0; (u32)k < gAudioContext.seqLoadedPool.persistent.numEntries; k++) { + for (k = 0; (u32)k < gAudioContext.seqCache.persistent.numEntries; k++) { GfxPrint_SetPos(printer, 3 + 3 * k, 9); - GfxPrint_Printf(printer, "%02x", gAudioContext.seqLoadedPool.persistent.entries[k].id); + GfxPrint_Printf(printer, "%02x", gAudioContext.seqCache.persistent.entries[k].id); } GfxPrint_SetPos(printer, 3, 10); - GfxPrint_Printf( - printer, "ST-BNK %02Xbanks (%05X / %06X)", gAudioContext.bankLoadedPool.persistent.numEntries, - gAudioContext.bankLoadedPool.persistent.pool.cur - gAudioContext.bankLoadedPool.persistent.pool.start, - gAudioContext.bankLoadedPool.persistent.pool.size); + GfxPrint_Printf(printer, "ST-BNK %02Xbanks (%05X / %06X)", gAudioContext.fontCache.persistent.numEntries, + gAudioContext.fontCache.persistent.pool.cur - gAudioContext.fontCache.persistent.pool.start, + gAudioContext.fontCache.persistent.pool.size); - for (k = 0; (u32)k < gAudioContext.bankLoadedPool.persistent.numEntries; k++) { + for (k = 0; (u32)k < gAudioContext.fontCache.persistent.numEntries; k++) { GfxPrint_SetPos(printer, 3 + 3 * k, 11); - GfxPrint_Printf(printer, "%02x", gAudioContext.bankLoadedPool.persistent.entries[k].id); + GfxPrint_Printf(printer, "%02x", gAudioContext.fontCache.persistent.entries[k].id); } GfxPrint_SetPos(printer, 3, 12); - GfxPrint_Printf(printer, "E-MEM %05X / %05X", gAudioContext.unk_2D50.cur - gAudioContext.unk_2D50.start, - gAudioContext.unk_2D50.size); + GfxPrint_Printf(printer, "E-MEM %05X / %05X", + gAudioContext.permanentPool.cur - gAudioContext.permanentPool.start, + gAudioContext.permanentPool.size); break; case PAGE_BLOCK_CHANGE_BGM: @@ -1980,28 +1989,30 @@ void AudioDebug_Draw(GfxPrint* printer) { SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3, 7); - GfxPrint_Printf(printer, "NEXT SCENE %02X %s", (u8)gAudioContext.seqPlayers[0].unk_158[2], - sAudioSceneNames[(u8)gAudioContext.seqPlayers[0].unk_158[2]]); + GfxPrint_Printf(printer, "NEXT SCENE %02X %s", (u8)gAudioContext.seqPlayers[0].soundScriptIO[2], + sAudioSceneNames[(u8)gAudioContext.seqPlayers[0].soundScriptIO[2]]); GfxPrint_SetPos(printer, 3, 8); - GfxPrint_Printf(printer, "NOW SCENE %02X %s", (u8)gAudioContext.seqPlayers[0].unk_158[4], - sAudioSceneNames[(u8)gAudioContext.seqPlayers[0].unk_158[4]]); + GfxPrint_Printf(printer, "NOW SCENE %02X %s", (u8)gAudioContext.seqPlayers[0].soundScriptIO[4], + sAudioSceneNames[(u8)gAudioContext.seqPlayers[0].soundScriptIO[4]]); GfxPrint_SetPos(printer, 3, 9); - GfxPrint_Printf(printer, "NOW BLOCK %02X", (gAudioContext.seqPlayers[0].unk_158[5] + 1) & 0xFF); + GfxPrint_Printf(printer, "NOW BLOCK %02X", (gAudioContext.seqPlayers[0].soundScriptIO[5] + 1) & 0xFF); GfxPrint_SetPos(printer, 3, 11); GfxPrint_Printf(printer, "PORT"); GfxPrint_SetPos(printer, 3, 12); - GfxPrint_Printf(printer, "%02X %02X %02X %02X", (u8)gAudioContext.seqPlayers[0].unk_158[0], - (u8)gAudioContext.seqPlayers[0].unk_158[1], (u8)gAudioContext.seqPlayers[0].unk_158[2], - (u8)gAudioContext.seqPlayers[0].unk_158[3]); + GfxPrint_Printf(printer, "%02X %02X %02X %02X", (u8)gAudioContext.seqPlayers[0].soundScriptIO[0], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[1], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[2], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[3]); GfxPrint_SetPos(printer, 3, 13); - GfxPrint_Printf(printer, "%02X %02X %02X %02X", (u8)gAudioContext.seqPlayers[0].unk_158[4], - (u8)gAudioContext.seqPlayers[0].unk_158[5], (u8)gAudioContext.seqPlayers[0].unk_158[6], - (u8)gAudioContext.seqPlayers[0].unk_158[7]); + GfxPrint_Printf(printer, "%02X %02X %02X %02X", (u8)gAudioContext.seqPlayers[0].soundScriptIO[4], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[5], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[6], + (u8)gAudioContext.seqPlayers[0].soundScriptIO[7]); break; case PAGE_OCARINA_TEST: @@ -2029,39 +2040,39 @@ void AudioDebug_Draw(GfxPrint* printer) { D_80131858); break; - case PAGE_SE_PARAMETER_CHANGE: - GfxPrint_SetPos(printer, 2, 4 + sAudioSEParamChgSel); + case PAGE_SFX_PARAMETER_CHANGE: + GfxPrint_SetPos(printer, 2, 4 + sAudioSfxParamChgSel); SETCOL(127, 255, 127); GfxPrint_Printf(printer, "*"); SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3, 4); - GfxPrint_Printf(printer, "SE HD : %02x %s", sAudioSEParamChgWork[0], - sSoundBankNames[sAudioSEParamChgWork[0]]); + GfxPrint_Printf(printer, "SE HD : %02x %s", sAudioSfxParamChgWork[0], + sSoundBankNames[sAudioSfxParamChgWork[0]]); GfxPrint_SetPos(printer, 3, 5); - GfxPrint_Printf(printer, "SE No. : %02x", sAudioSEParamChgWork[1]); + GfxPrint_Printf(printer, "SE No. : %02x", sAudioSfxParamChgWork[1]); GfxPrint_SetPos(printer, 20, 6); GfxPrint_Printf(printer, " : %04x", - gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].params); + gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params); GfxPrint_SetPos(printer, 3, 6); GfxPrint_Printf( printer, "SE SW %s", - AudioDebug_ToStringBinary(gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].params, 16)); + AudioDebug_ToStringBinary(gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params, 16)); SETCOL(127, 255, 127); - digitStr[0] = (char)('0' + ((gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].params >> - (15 - sAudioSEParamChgBitSel)) & + digitStr[0] = (char)('0' + ((gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params >> + (15 - sAudioSfxParamChgBitSel)) & 1)); - GfxPrint_SetPos(printer, 12 + sAudioSEParamChgBitSel, 6); + GfxPrint_SetPos(printer, 12 + sAudioSfxParamChgBitSel, 6); GfxPrint_Printf(printer, "%s", digitStr); SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3, 7); GfxPrint_Printf(printer, "SE PR : %02x", - gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].importance); + gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance); break; case PAGE_FREE_AREA: @@ -2176,17 +2187,17 @@ void AudioDebug_ProcessInput_SndCont(void) { if (sAudioSndContSel == 8) { if (sAudioSndContWork[sAudioSndContSel] != 0) { - func_800F6828(0x20); + Audio_SetExtraFilter(0x20); } else { - func_800F6828(0); + Audio_SetExtraFilter(0); } } if (sAudioSndContSel == 9) { if (sAudioSndContWork[sAudioSndContSel] != 0) { - func_800F67A0(0x20); + Audio_SetBaseFilter(0x20); } else { - func_800F67A0(0); + Audio_SetBaseFilter(0); } } @@ -2237,7 +2248,7 @@ void AudioDebug_ProcessInput_SndCont(void) { break; case 2: case 3: - func_800F87A0(sAudioSndContWork[2]); + Audio_StopSfxByBank(sAudioSndContWork[2]); break; } } @@ -2358,59 +2369,59 @@ void AudioDebug_ProcessInput_ScrPrt(void) { (sAudioScrPrtWork[6] * 8) + (sAudioScrPrtWork[7] * 0x10) + (sAudioScrPrtWork[8] * 0x20); } -void AudioDebug_ProcessInput_SEFlagSwap(void) { +void AudioDebug_ProcessInput_SfxSwap(void) { s16 step; u16 val; u8 prev; - if (!sAudioSEFlagSwapIsEditing) { + if (!sAudioSfxSwapIsEditing) { if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) { - if (sAudioSEFlagSwapSel > 0) { - sAudioSEFlagSwapSel--; + if (sAudioSfxSwapSel > 0) { + sAudioSfxSwapSel--; } else { - sAudioSEFlagSwapSel = 9; + sAudioSfxSwapSel = 9; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) { - if (sAudioSEFlagSwapSel < 9) { - sAudioSEFlagSwapSel++; + if (sAudioSfxSwapSel < 9) { + sAudioSfxSwapSel++; } else { - sAudioSEFlagSwapSel = 0; + sAudioSfxSwapSel = 0; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) { - sAudioSEFlagSwapIsEditing = true; + sAudioSfxSwapIsEditing = true; } if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) { - gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] = 0; - gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] = 0; + gAudioSfxSwapSource[sAudioSfxSwapSel] = 0; + gAudioSfxSwapTarget[sAudioSfxSwapSel] = 0; } if (CHECK_BTN_ANY(sDebugPadPress, BTN_START)) { - if (sAudioSEFlagSwapSel != 0) { - prev = sAudioSEFlagSwapSel - 1; + if (sAudioSfxSwapSel != 0) { + prev = sAudioSfxSwapSel - 1; } else { prev = 9; } - gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] = gAudioSEFlagSwapSource[prev]; - gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] = gAudioSEFlagSwapTarget[prev]; + gAudioSfxSwapSource[sAudioSfxSwapSel] = gAudioSfxSwapSource[prev]; + gAudioSfxSwapTarget[sAudioSfxSwapSel] = gAudioSfxSwapTarget[prev]; } } else { if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) { - if (sAudioSEFlagSwapNibbleSel > 0) { - sAudioSEFlagSwapNibbleSel--; + if (sAudioSfxSwapNibbleSel > 0) { + sAudioSfxSwapNibbleSel--; } else { - sAudioSEFlagSwapNibbleSel = 7; + sAudioSfxSwapNibbleSel = 7; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) { - if (sAudioSEFlagSwapNibbleSel < 7) { - sAudioSEFlagSwapNibbleSel++; + if (sAudioSfxSwapNibbleSel < 7) { + sAudioSfxSwapNibbleSel++; } else { - sAudioSEFlagSwapNibbleSel = 0; + sAudioSfxSwapNibbleSel = 0; } } @@ -2423,42 +2434,42 @@ void AudioDebug_ProcessInput_SEFlagSwap(void) { step = CHECK_BTN_ANY(sDebugPadHold, BTN_CUP) ? -8 : -1; } - if (sAudioSEFlagSwapNibbleSel < 4) { - val = gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] >> ((3 - sAudioSEFlagSwapNibbleSel) * 4); + if (sAudioSfxSwapNibbleSel < 4) { + val = gAudioSfxSwapSource[sAudioSfxSwapSel] >> ((3 - sAudioSfxSwapNibbleSel) * 4); val = (val + step) & 0xF; - gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] = - (gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] & - ((0xF << ((3 - sAudioSEFlagSwapNibbleSel) * 4)) ^ 0xFFFF)) + - (val << ((3 - sAudioSEFlagSwapNibbleSel) * 4)); + gAudioSfxSwapSource[sAudioSfxSwapSel] = + (gAudioSfxSwapSource[sAudioSfxSwapSel] & + ((0xF << ((3 - sAudioSfxSwapNibbleSel) * 4)) ^ 0xFFFF)) + + (val << ((3 - sAudioSfxSwapNibbleSel) * 4)); } else { - val = gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] >> ((7 - sAudioSEFlagSwapNibbleSel) * 4); + val = gAudioSfxSwapTarget[sAudioSfxSwapSel] >> ((7 - sAudioSfxSwapNibbleSel) * 4); val = (val + step) & 0xF; - gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] = - (gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] & - ((0xF << ((7 - sAudioSEFlagSwapNibbleSel) * 4)) ^ 0xFFFF)) + - (val << ((7 - sAudioSEFlagSwapNibbleSel) * 4)); + gAudioSfxSwapTarget[sAudioSfxSwapSel] = + (gAudioSfxSwapTarget[sAudioSfxSwapSel] & + ((0xF << ((7 - sAudioSfxSwapNibbleSel) * 4)) ^ 0xFFFF)) + + (val << ((7 - sAudioSfxSwapNibbleSel) * 4)); } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) { - sAudioSEFlagSwapIsEditing = false; + sAudioSfxSwapIsEditing = false; } if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) { - if (sAudioSEFlagSwapNibbleSel < 4) { - gAudioSEFlagSwapSource[sAudioSEFlagSwapSel] = 0; + if (sAudioSfxSwapNibbleSel < 4) { + gAudioSfxSwapSource[sAudioSfxSwapSel] = 0; } else { - gAudioSEFlagSwapTarget[sAudioSEFlagSwapSel] = 0; + gAudioSfxSwapTarget[sAudioSfxSwapSel] = 0; } } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_CLEFT)) { - gAudioSEFlagSwapOff ^= 1; + gAudioSfxSwapOff ^= 1; } if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) { - gAudioSEFlagSwapMode[sAudioSEFlagSwapSel] ^= 1; + gAudioSfxSwapMode[sAudioSfxSwapSel] ^= 1; } } @@ -2536,7 +2547,7 @@ void AudioDebug_ProcessInput_BlkChgBgm(void) { void AudioDebug_ProcessInput_OcaTest(void) { } -void AudioDebug_ProcessInput_SEParamChg(void) { +void AudioDebug_ProcessInput_SfxParamChg(void) { s32 step; u16 sfx; @@ -2547,78 +2558,78 @@ void AudioDebug_ProcessInput_SEParamChg(void) { } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) { - if (sAudioSEParamChgSel > 0) { - sAudioSEParamChgSel--; + if (sAudioSfxParamChgSel > 0) { + sAudioSfxParamChgSel--; } else { - sAudioSEParamChgSel = 3; + sAudioSfxParamChgSel = 3; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) { - if (sAudioSEParamChgSel < 3) { - sAudioSEParamChgSel++; + if (sAudioSfxParamChgSel < 3) { + sAudioSfxParamChgSel++; } else { - sAudioSEParamChgSel = 0; + sAudioSfxParamChgSel = 0; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) { - if (sAudioSEParamChgSel < 2) { - if (sAudioSEParamChgSel == 0) { - if (sAudioSEParamChgWork[sAudioSEParamChgSel] > 0) { - sAudioSEParamChgWork[sAudioSEParamChgSel]--; + if (sAudioSfxParamChgSel < 2) { + if (sAudioSfxParamChgSel == 0) { + if (sAudioSfxParamChgWork[sAudioSfxParamChgSel] > 0) { + sAudioSfxParamChgWork[sAudioSfxParamChgSel]--; } else { - sAudioSEParamChgWork[sAudioSEParamChgSel] = sAudioSndContWorkLims[2] - 1; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] = sAudioSndContWorkLims[2] - 1; } } else { - sAudioSEParamChgWork[sAudioSEParamChgSel] -= step; - sAudioSEParamChgWork[sAudioSEParamChgSel] &= 0x1FF; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] -= step; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] &= 0x1FF; } - } else if (sAudioSEParamChgSel == 3) { - gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].importance -= step; + } else if (sAudioSfxParamChgSel == 3) { + gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance -= step; } else { - sAudioSEParamChgBitSel = (sAudioSEParamChgBitSel - 1) & 0xF; + sAudioSfxParamChgBitSel = (sAudioSfxParamChgBitSel - 1) & 0xF; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) { - if (sAudioSEParamChgSel < 2) { - if (sAudioSEParamChgSel == 0) { - if (sAudioSEParamChgWork[sAudioSEParamChgSel] < (sAudioSndContWorkLims[2] - 1)) { - sAudioSEParamChgWork[sAudioSEParamChgSel]++; + if (sAudioSfxParamChgSel < 2) { + if (sAudioSfxParamChgSel == 0) { + if (sAudioSfxParamChgWork[sAudioSfxParamChgSel] < (sAudioSndContWorkLims[2] - 1)) { + sAudioSfxParamChgWork[sAudioSfxParamChgSel]++; } else { - sAudioSEParamChgWork[sAudioSEParamChgSel] = 0; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] = 0; } } else { - sAudioSEParamChgWork[sAudioSEParamChgSel] += step; - sAudioSEParamChgWork[sAudioSEParamChgSel] &= 0x1FF; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] += step; + sAudioSfxParamChgWork[sAudioSfxParamChgSel] &= 0x1FF; } - } else if (sAudioSEParamChgSel == 3) { - gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].importance += step; + } else if (sAudioSfxParamChgSel == 3) { + gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance += step; } else { - sAudioSEParamChgBitSel = (sAudioSEParamChgBitSel + 1) & 0xF; + sAudioSfxParamChgBitSel = (sAudioSfxParamChgBitSel + 1) & 0xF; } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) { - sfx = (u16)(sAudioSEParamChgWork[0] << 12) + sAudioSEParamChgWork[1] + SFX_FLAG; + sfx = (u16)(sAudioSfxParamChgWork[0] << 12) + sAudioSfxParamChgWork[1] + SFX_FLAG; Audio_PlaySoundGeneral(sfx, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) { - func_800F87A0(sAudioSEParamChgWork[0]); + Audio_StopSfxByBank(sAudioSfxParamChgWork[0]); } if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) { - if (sAudioSEParamChgSel == 2) { - gSoundParams[sAudioSEParamChgWork[0]][sAudioSEParamChgWork[1]].params ^= - (1 << (0xF - sAudioSEParamChgBitSel)); + if (sAudioSfxParamChgSel == 2) { + gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params ^= + (1 << (0xF - sAudioSfxParamChgBitSel)); } } if (CHECK_BTN_ANY(sDebugPadPress, BTN_CUP)) { - if (sAudioSEParamChgSel < 2) { - sAudioSEParamChgWork[sAudioSEParamChgSel] = 0; + if (sAudioSfxParamChgSel < 2) { + sAudioSfxParamChgWork[sAudioSfxParamChgSel] = 0; } } } @@ -2651,7 +2662,7 @@ void AudioDebug_ProcessInput(void) { return; } - if (sAudioSEMuted) { + if (sAudioSfxMuted) { Audio_SetSoundBanksMute(0x6F); } @@ -2689,8 +2700,8 @@ void AudioDebug_ProcessInput(void) { } if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) { - sAudioSEMuted ^= 1; - if (!sAudioSEMuted) { + sAudioSfxMuted ^= 1; + if (!sAudioSfxMuted) { Audio_SetSoundBanksMute(0); } } @@ -2704,8 +2715,8 @@ void AudioDebug_ProcessInput(void) { case PAGE_SCROLL_PRINT: AudioDebug_ProcessInput_ScrPrt(); break; - case PAGE_SE_FLAG_SWAP: - AudioDebug_ProcessInput_SEFlagSwap(); + case PAGE_SFX_SWAP: + AudioDebug_ProcessInput_SfxSwap(); break; case PAGE_SUB_TRACK_INFO: AudioDebug_ProcessInput_SubTrackInfo(); @@ -2719,8 +2730,8 @@ void AudioDebug_ProcessInput(void) { case PAGE_OCARINA_TEST: AudioDebug_ProcessInput_OcaTest(); break; - case PAGE_SE_PARAMETER_CHANGE: - AudioDebug_ProcessInput_SEParamChg(); + case PAGE_SFX_PARAMETER_CHANGE: + AudioDebug_ProcessInput_SfxParamChg(); break; case PAGE_FREE_AREA: default: @@ -2768,10 +2779,10 @@ void func_800F314C(s8 arg0) { Audio_QueueCmdS32(0x82000000 | (((u8)arg0 & 0xFF) << 8), 1); } -f32 func_800F3188(u8 bankIdx, u8 entryIdx) { - SoundBankEntry* bankEntry = &gSoundBanks[bankIdx][entryIdx]; - f32 temp_f14; - f32 phi_f0; +f32 Audio_ComputeSoundVolume(u8 bankId, u8 entryIdx) { + SoundBankEntry* bankEntry = &gSoundBanks[bankId][entryIdx]; + f32 minDist; + f32 baseDist; f32 ret; if (bankEntry->sfxParams & 0x2000) { @@ -2783,27 +2794,29 @@ f32 func_800F3188(u8 bankIdx, u8 entryIdx) { } else { switch (bankEntry->sfxParams & 3) { case 1: - phi_f0 = 10000.0f / 15.0f; + baseDist = 10000.0f / 15.0f; break; case 2: - phi_f0 = 10000.0f / 10.5f; + baseDist = 10000.0f / 10.5f; break; case 3: - phi_f0 = 10000.0f / 2.6f; + baseDist = 10000.0f / 2.6f; break; default: - phi_f0 = 10000.0f / 20.0f; + baseDist = 10000.0f / 20.0f; break; } - temp_f14 = phi_f0 / 5.0f; + minDist = baseDist / 5.0f; - if (bankEntry->dist < temp_f14) { + // Volume grows as inverse square of distance. Linearly approximate + // the inverse part, then square. + if (bankEntry->dist < minDist) { ret = 1.0f; - } else if (bankEntry->dist < phi_f0) { - ret = ((((phi_f0 - temp_f14) - (bankEntry->dist - temp_f14)) / (phi_f0 - temp_f14)) * 0.19f) + 0.81f; + } else if (bankEntry->dist < baseDist) { + ret = ((((baseDist - minDist) - (bankEntry->dist - minDist)) / (baseDist - minDist)) * 0.19f) + 0.81f; } else { - ret = (1.0f - ((bankEntry->dist - phi_f0) / (10000.0f - phi_f0))) * 0.81f; + ret = (1.0f - ((bankEntry->dist - baseDist) / (10000.0f - baseDist))) * 0.81f; } ret = SQ(ret); } @@ -2811,10 +2824,10 @@ f32 func_800F3188(u8 bankIdx, u8 entryIdx) { return ret; } -s8 Audio_ComputeSoundReverb(u8 bankIdx, u8 entryIdx, u8 channelIdx) { +s8 Audio_ComputeSoundReverb(u8 bankId, u8 entryIdx, u8 channelIdx) { s8 distAdd = 0; s32 scriptAdd = 0; - SoundBankEntry* entry = &gSoundBanks[bankIdx][entryIdx]; + SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx]; s32 reverb; if (!(entry->sfxParams & 0x1000)) { @@ -2833,7 +2846,7 @@ s8 Audio_ComputeSoundReverb(u8 bankIdx, u8 entryIdx, u8 channelIdx) { } reverb = *entry->reverbAdd + distAdd + scriptAdd; - if ((bankIdx != BANK_OCARINA) || !((entry->sfxId & 0x1FF) < 2)) { + if ((bankId != BANK_OCARINA) || !((entry->sfxId & 0x1FF) < 2)) { reverb += sAudioEnvReverb + sAudioCodeReverb + sSpecReverb; } @@ -2844,7 +2857,7 @@ s8 Audio_ComputeSoundReverb(u8 bankIdx, u8 entryIdx, u8 channelIdx) { return reverb; } -s8 Audio_ComputeSoundPanSigned(f32 x, f32 z, u8 arg2) { +s8 Audio_ComputeSoundPanSigned(f32 x, f32 z, u8 token) { f32 absX; f32 absZ; f32 pan; @@ -2887,9 +2900,9 @@ s8 Audio_ComputeSoundPanSigned(f32 x, f32 z, u8 arg2) { return (s8)((pan * 127.0f) + 0.5f); } -f32 Audio_ComputeSoundFreqScale(u8 bankIdx, u8 entryIdx) { +f32 Audio_ComputeSoundFreqScale(u8 bankId, u8 entryIdx) { s32 phi_v0 = 0; - SoundBankEntry* entry = &gSoundBanks[bankIdx][entryIdx]; + SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx]; f32 unk1C; f32 freq = 1.0f; @@ -2897,17 +2910,17 @@ f32 Audio_ComputeSoundFreqScale(u8 bankIdx, u8 entryIdx) { freq = 1.0f - ((gAudioContext.audioRandom & 0xF) / 192.0f); } - switch (bankIdx) { + switch (bankId) { case BANK_PLAYER: case BANK_ITEM: case BANK_VOICE: - if (D_80130644 != 0) { + if (sAudioBaseFilter2 != 0) { phi_v0 = 1; } break; case BANK_ENV: case BANK_ENEMY: - if (D_80130648 != 0) { + if (sAudioExtraFilter2 != 0) { phi_v0 = 1; } break; @@ -2940,13 +2953,13 @@ f32 Audio_ComputeSoundFreqScale(u8 bankIdx, u8 entryIdx) { return freq; } -u8 func_800F37B8(f32 arg0, SoundBankEntry* arg1, s8 arg2) { +u8 func_800F37B8(f32 behindScreenZ, SoundBankEntry* arg1, s8 arg2) { s8 phi_v0; u8 phi_v1; f32 phi_f0; f32 phi_f12; - if (*arg1->posZ < arg0) { + if (*arg1->posZ < behindScreenZ) { phi_v0 = arg2 < 65 ? arg2 : 0x7F - arg2; if (phi_v0 < 30) { @@ -3000,20 +3013,20 @@ s8 func_800F3990(f32 arg0, u16 sfxParams) { return ret | 1; } -void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx) { - f32 sp44 = 1.0f; - s8 phi_a1; +void Audio_SetSoundProperties(u8 bankId, u8 entryIdx, u8 channelIdx) { + f32 vol = 1.0f; + s8 volS8; s8 reverb = 0; f32 freqScale = 1.0f; s8 panSigned = 0x40; u8 stereoBits = 0; - u8 sp39 = 0; + u8 filter = 0; s8 sp38 = 0; - f32 sp34; - u8 sp33 = 0; - SoundBankEntry* entry = &gSoundBanks[bankIdx][entryIdx]; + f32 behindScreenZ; + u8 baseFilter = 0; + SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx]; - switch (bankIdx) { + switch (bankId) { case BANK_PLAYER: case BANK_ITEM: case BANK_ENV: @@ -3025,99 +3038,99 @@ void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx) { // fallthrough case BANK_OCARINA: entry->dist = sqrtf(entry->dist); - sp44 = func_800F3188(bankIdx, entryIdx) * *entry->unk_14; - reverb = Audio_ComputeSoundReverb(bankIdx, entryIdx, channelIdx); - panSigned = Audio_ComputeSoundPanSigned(*entry->posX, *entry->posZ, entry->unk_C); - freqScale = Audio_ComputeSoundFreqScale(bankIdx, entryIdx) * *entry->freqScale; + vol = Audio_ComputeSoundVolume(bankId, entryIdx) * *entry->vol; + reverb = Audio_ComputeSoundReverb(bankId, entryIdx, channelIdx); + panSigned = Audio_ComputeSoundPanSigned(*entry->posX, *entry->posZ, entry->token); + freqScale = Audio_ComputeSoundFreqScale(bankId, entryIdx) * *entry->freqScale; if (D_80130604 == 2) { - sp34 = D_801305C4[(entry->sfxParams & 0x400) >> 10]; + behindScreenZ = sBehindScreenZ[(entry->sfxParams & 0x400) >> 10]; if (!(entry->sfxParams & 0x800)) { - if (*entry->posZ < sp34) { + if (*entry->posZ < behindScreenZ) { stereoBits = 0x10; } - if ((D_8016B8B8[channelIdx].stereoBits ^ stereoBits) & 0x10) { + if ((sSfxChannelState[channelIdx].stereoBits ^ stereoBits) & 0x10) { if (panSigned < 0x40) { - stereoBits = D_8016B8B8[channelIdx].stereoBits ^ 0x14; + stereoBits = sSfxChannelState[channelIdx].stereoBits ^ 0x14; } else { - stereoBits = D_8016B8B8[channelIdx].stereoBits ^ 0x18; + stereoBits = sSfxChannelState[channelIdx].stereoBits ^ 0x18; } } else { - stereoBits = D_8016B8B8[channelIdx].stereoBits; + stereoBits = sSfxChannelState[channelIdx].stereoBits; } } } - if (D_8013063C != 0) { - if ((bankIdx == BANK_ITEM) || (bankIdx == BANK_PLAYER) || (bankIdx == BANK_VOICE)) { - sp33 = D_8013063C; + if (sAudioBaseFilter != 0) { + if ((bankId == BANK_ITEM) || (bankId == BANK_PLAYER) || (bankId == BANK_VOICE)) { + baseFilter = sAudioBaseFilter; } } - if ((sp33 | D_80130640) != 0) { - sp39 = (sp33 | D_80130640); + if ((baseFilter | sAudioExtraFilter) != 0) { + filter = (baseFilter | sAudioExtraFilter); } else if (D_80130604 == 2 && (entry->sfxParams & 0x2000) == 0) { - sp39 = func_800F37B8(sp34, entry, panSigned); + filter = func_800F37B8(behindScreenZ, entry, panSigned); } break; case BANK_SYSTEM: break; } - if (D_8016B8B8[channelIdx].unk_00 != sp44) { - phi_a1 = (u8)(sp44 * 127.0f); - D_8016B8B8[channelIdx].unk_00 = sp44; + if (sSfxChannelState[channelIdx].vol != vol) { + volS8 = (u8)(vol * 127.0f); + sSfxChannelState[channelIdx].vol = vol; } else { - phi_a1 = -1; + volS8 = -1; } - // CHAN_UPD_SCRIPT_IO (slot 2) - Audio_QueueCmdS8(0x6020000 | (channelIdx << 8) | 2, phi_a1); - if (reverb != D_8016B8B8[channelIdx].reverb) { + // CHAN_UPD_SCRIPT_IO (slot 2, sets volume) + Audio_QueueCmdS8(0x6020000 | (channelIdx << 8) | 2, volS8); + if (reverb != sSfxChannelState[channelIdx].reverb) { Audio_QueueCmdS8(0x5020000 | (channelIdx << 8), reverb); - D_8016B8B8[channelIdx].reverb = reverb; + sSfxChannelState[channelIdx].reverb = reverb; } - if (freqScale != D_8016B8B8[channelIdx].freqScale) { + if (freqScale != sSfxChannelState[channelIdx].freqScale) { Audio_QueueCmdF32(0x4020000 | (channelIdx << 8), freqScale); - D_8016B8B8[channelIdx].freqScale = freqScale; + sSfxChannelState[channelIdx].freqScale = freqScale; } - if (stereoBits != D_8016B8B8[channelIdx].stereoBits) { + if (stereoBits != sSfxChannelState[channelIdx].stereoBits) { Audio_QueueCmdS8(0xE020000 | (channelIdx << 8), stereoBits | 0x10); - D_8016B8B8[channelIdx].stereoBits = stereoBits; + sSfxChannelState[channelIdx].stereoBits = stereoBits; } - if (sp39 != D_8016B8B8[channelIdx].unk_0B) { - // CHAN_UPD_SCRIPT_IO (slot 3) - Audio_QueueCmdS8(0x6020000 | (channelIdx << 8) | 3, sp39); - D_8016B8B8[channelIdx].unk_0B = sp39; + if (filter != sSfxChannelState[channelIdx].filter) { + // CHAN_UPD_SCRIPT_IO (slot 3, sets filter) + Audio_QueueCmdS8(0x6020000 | (channelIdx << 8) | 3, filter); + sSfxChannelState[channelIdx].filter = filter; } - if (sp38 != D_8016B8B8[channelIdx].unk_0C) { + if (sp38 != sSfxChannelState[channelIdx].unk_0C) { // CHAN_UPD_UNK_0F Audio_QueueCmdS8(0xC020000 | (channelIdx << 8), 0x10); // CHAN_UPD_UNK_20 Audio_QueueCmdU16(0xD020000 | (channelIdx << 8), ((u16)(sp38) << 8) + 0xFF); - D_8016B8B8[channelIdx].unk_0C = sp38; + sSfxChannelState[channelIdx].unk_0C = sp38; } - if (panSigned != D_8016B8B8[channelIdx].panSigned) { + if (panSigned != sSfxChannelState[channelIdx].panSigned) { Audio_QueueCmdS8(0x3020000 | (channelIdx << 8), panSigned); - D_8016B8B8[channelIdx].panSigned = panSigned; + sSfxChannelState[channelIdx].panSigned = panSigned; } } -void func_800F3ED4(void) { +void Audio_ResetSfxChannelState(void) { u8 i; - unk_s1* t; + SfxPlayerState* state; for (i = 0; i < 16; i++) { - t = &D_8016B8B8[i]; - t->unk_00 = 1.0f; - t->freqScale = 1.0f; - t->reverb = 0; - t->panSigned = 0x40; - t->stereoBits = 0; - t->unk_0B = 0xFF; - t->unk_0C = 0xFF; + state = &sSfxChannelState[i]; + state->vol = 1.0f; + state->freqScale = 1.0f; + state->reverb = 0; + state->panSigned = 0x40; + state->stereoBits = 0; + state->filter = 0xFF; + state->unk_0C = 0xFF; } - D_8016B8B8[13].unk_0C = 0; + sSfxChannelState[SFX_PLAYER_CHANNEL_OCARINA].unk_0C = 0; D_8013061C = 0; sAudioCodeReverb = 0; } @@ -3404,15 +3417,16 @@ void Audio_PlaySoundTransposed(Vec3f* pos, u16 sfxId, s8 semitone) { void func_800F4C58(Vec3f* pos, u16 sfxId, u8 arg2) { u8 phi_s1 = 0; u8 i; - u8 bank; + u8 bankId; - bank = SFX_BANK_SHIFT(sfxId); - for (i = 0; i < bank; i++) { - phi_s1 += D_80130578[D_801333CC][i]; + bankId = SFX_BANK_SHIFT(sfxId); + for (i = 0; i < bankId; i++) { + phi_s1 += gChannelsPerBank[gSfxChannelLayout][i]; } - for (i = 0; i < D_80130578[D_801333CC][bank]; i++) { - if ((D_8016E1B8[bank][i].unk_4 != 0xFF) && (sfxId == gSoundBanks[bank][D_8016E1B8[bank][i].unk_4].sfxId)) { + for (i = 0; i < gChannelsPerBank[gSfxChannelLayout][bankId]; i++) { + if ((gActiveSounds[bankId][i].entryIndex != 0xFF) && + (sfxId == gSoundBanks[bankId][gActiveSounds[bankId][i].entryIndex].sfxId)) { Audio_QueueCmdS8(_SHIFTL(6, 24, 8) | _SHIFTL(2, 16, 8) | _SHIFTL(phi_s1, 8, 8) | _SHIFTL(6, 0, 8), arg2); } phi_s1++; @@ -3602,7 +3616,7 @@ void func_800F56A8(void) { bvar = temp_v0 & 0xFF; if ((temp_v0 != NA_BGM_DISABLED) && ((D_80130658[bvar] & 0x10) != 0)) { if (D_8013062C != 0xC0) { - D_8013062C = gAudioContext.seqPlayers->unk_158[3]; + D_8013062C = gAudioContext.seqPlayers->soundScriptIO[3]; } else { D_8013062C = 0; } @@ -3672,18 +3686,18 @@ s32 func_800F5A58(u8 arg0) { } } -void func_800F5ACC(u16 arg0) { +void func_800F5ACC(u16 seqId) { u16 temp_v0; temp_v0 = func_800FA0B4(0); - if ((temp_v0 & 0xFF) != NA_BGM_GANON_TOWER && (temp_v0 & 0xFF) != NA_BGM_ESCAPE && temp_v0 != arg0) { + if ((temp_v0 & 0xFF) != NA_BGM_GANON_TOWER && (temp_v0 & 0xFF) != NA_BGM_ESCAPE && temp_v0 != seqId) { func_800F5E90(3); if (temp_v0 != NA_BGM_DISABLED) { D_80130628 = temp_v0; } else { osSyncPrintf("Middle Boss BGM Start not stack \n"); } - Audio_StartSeq(0, 0, arg0); + Audio_StartSeq(0, 0, seqId); } } @@ -3742,8 +3756,8 @@ void func_800F5CF8(void) { if (D_8016B9F4 != 0) { D_8016B9F4--; if (D_8016B9F4 == 0) { - Audio_QueueCmdS32(0xE3000000, 0); - Audio_QueueCmdS32(0xE3000000, 1); + Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE); + Audio_QueueCmdS32(0xE3000000, FONT_TABLE); func_800FA0B4(0); sp26 = func_800FA0B4(1); sp22 = func_800FA0B4(3); @@ -3766,9 +3780,9 @@ void func_800F5CF8(void) { } } -void func_800F5E18(u8 seqIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4) { - Audio_SeqCmd7(seqIdx, arg3, arg4); - Audio_StartSeq(seqIdx, fadeTimer, seqId); +void func_800F5E18(u8 playerIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4) { + Audio_SeqCmd7(playerIdx, arg3, arg4); + Audio_StartSeq(playerIdx, fadeTimer, seqId); } void func_800F5E90(u8 arg0) { @@ -3883,6 +3897,7 @@ void func_800F6268(f32 dist, u16 arg1) { } else { phi_v1 = (s8)(((dist - 200.0f) * 127.0f) / 1800.0f); } + // Transition volume of channels 0, 1 and 13 on seq player 0 over 3 frames Audio_SeqCmd6(0, 3, 0, 127 - phi_v1); Audio_SeqCmd6(0, 3, 1, 127 - phi_v1); Audio_SeqCmd6(0, 3, 13, phi_v1); @@ -3905,6 +3920,7 @@ void func_800F6268(f32 dist, u16 arg1) { } else { phi_v1 = (s8)(((dist - 200.0f) * 127.0f) / 1800.0f); } + // Transition volume of channels 0 and 1 on seq player 0 over 3 frames Audio_SeqCmd6(3, 3, 0, 127 - phi_v1); Audio_SeqCmd6(3, 3, 1, 127 - phi_v1); } @@ -3927,34 +3943,34 @@ void func_800F64E0(u8 arg0) { } void func_800F6584(u8 arg0) { - u8 seqIdx; + u8 playerIdx; u16 sp34; D_8016B9F2 = arg0; if ((func_800FA0B4(0) & 0xFF) == NA_BGM_LONLON) { - seqIdx = 0; + playerIdx = 0; sp34 = 0; } else if ((func_800FA0B4(3) & 0xFF) == NA_BGM_LONLON) { - seqIdx = 3; + playerIdx = 3; sp34 = 0xFFFC; } else { return; } if (arg0 != 0) { - Audio_SeqCmd6(seqIdx, 1, 0, 0); - Audio_SeqCmd6(seqIdx, 1, 1, 0); - if (seqIdx == 3) { - Audio_SeqCmdA(seqIdx, sp34 | 3); + Audio_SeqCmd6(playerIdx, 1, 0, 0); + Audio_SeqCmd6(playerIdx, 1, 1, 0); + if (playerIdx == 3) { + Audio_SeqCmdA(playerIdx, sp34 | 3); } } else { - if (seqIdx == 3) { + if (playerIdx == 3) { func_800F5E18(3, NA_BGM_LONLON, 0, 0, 0); } - Audio_SeqCmd6(seqIdx, 1, 0, 0x7F); - Audio_SeqCmd6(seqIdx, 1, 1, 0x7F); - if (seqIdx == 3) { - Audio_SeqCmdA(seqIdx, sp34); + Audio_SeqCmd6(playerIdx, 1, 0, 0x7F); + Audio_SeqCmd6(playerIdx, 1, 1, 0x7F); + if (playerIdx == 3) { + Audio_SeqCmdA(playerIdx, sp34); } } } @@ -3994,28 +4010,29 @@ void func_800F6700(s8 arg0) { Audio_SeqCmdE0(0, sp1F); } -void func_800F67A0(u8 arg0) { - if (D_8013063C != arg0) { - if (arg0 == 0) { - Audio_StopSfx(NA_SE_PL_IN_BUBBLE); - } else if (D_8013063C == 0) { +void Audio_SetBaseFilter(u8 filter) { + if (sAudioBaseFilter != filter) { + if (filter == 0) { + Audio_StopSfxById(NA_SE_PL_IN_BUBBLE); + } else if (sAudioBaseFilter == 0) { Audio_PlaySoundGeneral(NA_SE_PL_IN_BUBBLE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } - D_8013063C = arg0; - D_80130644 = arg0; + sAudioBaseFilter = filter; + sAudioBaseFilter2 = filter; } -void func_800F6828(u8 arg0) { +void Audio_SetExtraFilter(u8 filter) { u32 t; u8 i; - D_80130648 = arg0; - D_80130640 = arg0; + sAudioExtraFilter2 = filter; + sAudioExtraFilter = filter; if (D_8016E750[0].unk_254 == NA_BGM_NATURE_BACKGROUND) { for (i = 0; i < 16; i++) { t = i; - Audio_QueueCmdS8(((t & 0xFF) << 8) | 0x6000000 | 6, arg0); + // CHAN_UPD_SCRIPT_IO (seq player 0, all channels, slot 6) + Audio_QueueCmdS8(0x6000000 | ((t & 0xFF) << 8) | 6, filter); } } } @@ -4104,10 +4121,10 @@ void func_800F6C34(void) { D_8013061C = 0; D_8016B7A8 = 1.0f; D_8016B7B0 = 1.0f; - D_8013063C = 0; - D_80130640 = 0; - D_80130644 = 0; - D_80130648 = 0; + sAudioBaseFilter = 0; + sAudioExtraFilter = 0; + sAudioBaseFilter2 = 0; + sAudioExtraFilter2 = 0; func_800ED858(0); sRiverFreqScaleLerp.remainingFrames = 0; sWaterfallFreqScaleLerp.remainingFrames = 0; @@ -4205,20 +4222,20 @@ void func_800F6FB4(u8 arg0) { Audio_QueueSeqCmd(0x80000000 | (b1 << 0x10) | (b0 << 8) | b2); } - Audio_SeqCmd8(0, 0x07, 0xD, D_80130604); + Audio_SeqCmd8(0, 0x07, 13, D_80130604); } } -void func_800F70F8(void) { - Audio_ContextInit(0, 0); +void Audio_Init(void) { + AudioLoad_Init(NULL, 0); } -void func_800F711C(void) { +void Audio_InitSound(void) { func_800F6C34(); func_800EE930(); - func_800F3ED4(); + Audio_ResetSfxChannelState(); func_800FAEB4(); - func_800F905C(); + Audio_ResetSounds(); func_800F9280(2, 0, 0x70, 10); } @@ -4233,15 +4250,15 @@ void func_800F71BC(s32 arg0) { D_80133418 = 1; func_800F6C34(); func_800EE930(); - func_800F3ED4(); + Audio_ResetSfxChannelState(); func_800FADF8(); - func_800F905C(); + Audio_ResetSounds(); } void func_800F7208(void) { func_800FADF8(); Audio_QueueCmdS32(0xF2000000, 1); func_800F6C34(); - func_800F3ED4(); + Audio_ResetSfxChannelState(); func_800F9280(2, 0, 0x70, 1); } diff --git a/src/code/code_800F7260.c b/src/code/code_800F7260.c index e663d96be6..af14f70144 100644 --- a/src/code/code_800F7260.c +++ b/src/code/code_800F7260.c @@ -5,24 +5,24 @@ typedef struct { /* 0x00 */ u16 sfxId; /* 0x04 */ Vec3f* pos; - /* 0x08 */ u8 unk_8; + /* 0x08 */ u8 token; /* 0x0C */ f32* freqScale; - /* 0x10 */ f32* unk_10; + /* 0x10 */ f32* vol; /* 0x14 */ s8* reverbAdd; } SoundRequest; // size = 0x18 typedef struct { - /* 0x00 */ f32 unk_0; - /* 0x04 */ f32 unk_4; - /* 0x08 */ f32 unk_8; - /* 0x0C */ u16 unk_C; -} Struct_800F8EA0; // size = 0x10 + /* 0x00 */ f32 value; + /* 0x04 */ f32 target; + /* 0x08 */ f32 step; + /* 0x0C */ u16 remainingFrames; +} UnusedBankLerp; // size = 0x10 // rodata for Audio_ProcessSoundRequest (this file) // (probably moved to .data due to -use_readwrite_const) char D_80133340[] = "SE"; -// rodata for func_800F7CEC (this file) +// rodata for Audio_ChooseActiveSounds (this file) char D_80133344[] = VT_COL(RED, WHITE) " dist over! flag:%04X ptr:%08X pos:%f-%f-%f" VT_RST "\n"; // file padding @@ -32,6 +32,21 @@ s32 D_8013338C = 0; char D_80133390[] = "SEQ H"; char D_80133398[] = " L"; +// bss +extern SoundRequest sSoundRequests[0x100]; +extern SoundBankEntry D_8016BAD0[9]; +extern SoundBankEntry D_8016BC80[12]; +extern SoundBankEntry D_8016BEC0[22]; +extern SoundBankEntry D_8016C2E0[20]; +extern SoundBankEntry D_8016C6A0[8]; +extern SoundBankEntry D_8016C820[3]; +extern SoundBankEntry D_8016C8B0[5]; +extern u8 sSoundBankListEnd[7]; +extern u8 sSoundBankFreeListStart[7]; +extern u8 sSoundBankUnused[7]; +extern u8 sCurSfxPlayerChannelIdx; +extern UnusedBankLerp sUnusedBankLerp[7]; + // data // sSoundRequests ring buffer endpoints. read index <= write index, wrapping around mod 256. @@ -58,7 +73,7 @@ u8 sBankSizes[ARRAY_COUNT(gSoundBanks)] = { ARRAY_COUNT(D_8016C6A0), ARRAY_COUNT(D_8016C820), ARRAY_COUNT(D_8016C8B0), }; -u8 D_801333CC = 0; +u8 gSfxChannelLayout = 0; u16 D_801333D0 = 0; @@ -74,13 +89,10 @@ s32 D_801333EC = 0; // unused u8 D_801333F0 = 0; -u8 gAudioSEFlagSwapOff = 0; +u8 gAudioSfxSwapOff = 0; u8 D_801333F8 = 0; -extern SoundRequest sSoundRequests[0x100]; -extern Struct_800F8EA0 D_8016E270[7]; - void Audio_SetSoundBanksMute(u16 muteMask) { u8 bankId; @@ -94,38 +106,37 @@ void Audio_SetSoundBanksMute(u16 muteMask) { } } -void Audio_QueueSeqCmdMute(u8 arg0) { - D_801333D0 |= (1 << arg0); +void Audio_QueueSeqCmdMute(u8 channelIdx) { + D_801333D0 |= (1 << channelIdx); Audio_SetVolScale(0, 2, 0x40, 0xF); Audio_SetVolScale(3, 2, 0x40, 0xF); } -void Audio_ClearBGMMute(u8 arg0) { - D_801333D0 &= ((1 << arg0) ^ 0xFFFF); +void Audio_ClearBGMMute(u8 channelIdx) { + D_801333D0 &= ((1 << channelIdx) ^ 0xFFFF); if (D_801333D0 == 0) { Audio_SetVolScale(0, 2, 0x7F, 0xF); Audio_SetVolScale(3, 2, 0x7F, 0xF); } } -// a4 is often the same as freqScale. (u8)(*a4 * 127.0f) is sent to script on IO port 2 -void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 a2, f32* freqScale, f32* a4, s8* reverbAdd) { +void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* vol, s8* reverbAdd) { u8 i; SoundRequest* req; if (!gSoundBankMuted[SFX_BANK_SHIFT(sfxId)]) { req = &sSoundRequests[sSoundRequestWriteIndex]; - if (!gAudioSEFlagSwapOff) { + if (!gAudioSfxSwapOff) { for (i = 0; i < 10; i++) { - if (sfxId == gAudioSEFlagSwapSource[i]) { - if (gAudioSEFlagSwapMode[i] == 0) { // "SWAP" - sfxId = gAudioSEFlagSwapTarget[i]; + if (sfxId == gAudioSfxSwapSource[i]) { + if (gAudioSfxSwapMode[i] == 0) { // "SWAP" + sfxId = gAudioSfxSwapTarget[i]; } else { // "ADD" - req->sfxId = gAudioSEFlagSwapTarget[i]; + req->sfxId = gAudioSfxSwapTarget[i]; req->pos = pos; - req->unk_8 = a2; + req->token = token; req->freqScale = freqScale; - req->unk_10 = a4; + req->vol = vol; req->reverbAdd = reverbAdd; sSoundRequestWriteIndex++; req = &sSoundRequests[sSoundRequestWriteIndex]; @@ -136,9 +147,9 @@ void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 a2, f32* freqScale, f32* a } req->sfxId = sfxId; req->pos = pos; - req->unk_8 = a2; + req->token = token; req->freqScale = freqScale; - req->unk_10 = a4; + req->vol = vol; req->reverbAdd = reverbAdd; sSoundRequestWriteIndex++; } @@ -174,7 +185,7 @@ void Audio_RemoveMatchingSoundRequests(u8 aspect, SoundBankEntry* cmp) { } break; case 4: - if (req->unk_8 == cmp->unk_C && req->sfxId == cmp->sfxId) { + if (req->token == cmp->token && req->sfxId == cmp->sfxId) { remove = true; } break; @@ -221,7 +232,7 @@ void Audio_ProcessSoundRequest(void) { return; } if (gSoundBanks[bankId][index].sfxId == req->sfxId) { - count = D_80130594[D_801333CC][bankId]; + count = gUsedChannelsPerBank[gSfxChannelLayout][bankId]; } else { if (count == 0) { evictIndex = index; @@ -233,7 +244,7 @@ void Audio_ProcessSoundRequest(void) { evictImportance = gSoundParams[SFX_BANK_SHIFT(sfxId)][SFX_INDEX(sfxId)].importance; } count++; - if (count == D_80130594[D_801333CC][bankId]) { + if (count == gUsedChannelsPerBank[gSfxChannelLayout][bankId]) { if (gSoundParams[SFX_BANK_SHIFT(req->sfxId)][SFX_INDEX(req->sfxId)].importance >= evictImportance) { index = evictIndex; } else { @@ -241,23 +252,24 @@ void Audio_ProcessSoundRequest(void) { } } } - if (count == D_80130594[D_801333CC][bankId]) { + if (count == gUsedChannelsPerBank[gSfxChannelLayout][bankId]) { soundParams = &gSoundParams[SFX_BANK_SHIFT(req->sfxId)][SFX_INDEX(req->sfxId)]; if ((req->sfxId & 0xC00) || (soundParams->params & 4) || (index == evictIndex)) { - if ((gSoundBanks[bankId][index].sfxParams & 8) && gSoundBanks[bankId][index].unk_2A != 1) { - Audio_ClearBGMMute(gSoundBanks[bankId][index].unk_2E); + if ((gSoundBanks[bankId][index].sfxParams & 8) && + gSoundBanks[bankId][index].state != SFX_STATE_QUEUED) { + Audio_ClearBGMMute(gSoundBanks[bankId][index].channelIdx); } - gSoundBanks[bankId][index].unk_C = req->unk_8; + gSoundBanks[bankId][index].token = req->token; gSoundBanks[bankId][index].sfxId = req->sfxId; - gSoundBanks[bankId][index].unk_2A = 1; - gSoundBanks[bankId][index].unk_2B = 2; + gSoundBanks[bankId][index].state = SFX_STATE_QUEUED; + gSoundBanks[bankId][index].freshness = 2; gSoundBanks[bankId][index].freqScale = req->freqScale; - gSoundBanks[bankId][index].unk_14 = req->unk_10; + gSoundBanks[bankId][index].vol = req->vol; gSoundBanks[bankId][index].reverbAdd = req->reverbAdd; gSoundBanks[bankId][index].sfxParams = soundParams->params; gSoundBanks[bankId][index].sfxImportance = soundParams->importance; - } else if (gSoundBanks[bankId][index].unk_2A == 5) { - gSoundBanks[bankId][index].unk_2A = 4; + } else if (gSoundBanks[bankId][index].state == SFX_STATE_PLAYING_2) { + gSoundBanks[bankId][index].state = SFX_STATE_PLAYING_1; } index = 0; } @@ -266,93 +278,95 @@ void Audio_ProcessSoundRequest(void) { index = gSoundBanks[bankId][index].next; } } - if (gSoundBanks[bankId][D_8016E1A8[bankId]].next != 0xFF && index != 0) { - index = D_8016E1A8[bankId]; + if (gSoundBanks[bankId][sSoundBankFreeListStart[bankId]].next != 0xFF && index != 0) { + index = sSoundBankFreeListStart[bankId]; entry = &gSoundBanks[bankId][index]; entry->posX = &req->pos->x; entry->posY = &req->pos->y; entry->posZ = &req->pos->z; - entry->unk_C = req->unk_8; + entry->token = req->token; entry->freqScale = req->freqScale; - entry->unk_14 = req->unk_10; + entry->vol = req->vol; entry->reverbAdd = req->reverbAdd; soundParams = &gSoundParams[SFX_BANK_SHIFT(req->sfxId)][SFX_INDEX(req->sfxId)]; entry->sfxParams = soundParams->params; entry->sfxImportance = soundParams->importance; entry->sfxId = req->sfxId; - entry->unk_2A = 1; - entry->unk_2B = 2; - entry->prev = D_8016E1A0[bankId]; - gSoundBanks[bankId][D_8016E1A0[bankId]].next = D_8016E1A8[bankId]; - D_8016E1A0[bankId] = D_8016E1A8[bankId]; - D_8016E1A8[bankId] = gSoundBanks[bankId][D_8016E1A8[bankId]].next; - gSoundBanks[bankId][D_8016E1A8[bankId]].prev = 0xFF; + entry->state = SFX_STATE_QUEUED; + entry->freshness = 2; + entry->prev = sSoundBankListEnd[bankId]; + gSoundBanks[bankId][sSoundBankListEnd[bankId]].next = sSoundBankFreeListStart[bankId]; + sSoundBankListEnd[bankId] = sSoundBankFreeListStart[bankId]; + sSoundBankFreeListStart[bankId] = gSoundBanks[bankId][sSoundBankFreeListStart[bankId]].next; + gSoundBanks[bankId][sSoundBankFreeListStart[bankId]].prev = 0xFF; entry->next = 0xFF; } } -void func_800F7B54(u8 bankId, u8 bankIndex) { - SoundBankEntry* entry = &gSoundBanks[bankId][bankIndex]; +void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) { + SoundBankEntry* entry = &gSoundBanks[bankId][entryIndex]; u8 i; if (entry->sfxParams & 8) { - Audio_ClearBGMMute(entry->unk_2E); + Audio_ClearBGMMute(entry->channelIdx); } - if (bankIndex == D_8016E1A0[bankId]) { - D_8016E1A0[bankId] = entry->prev; + if (entryIndex == sSoundBankListEnd[bankId]) { + sSoundBankListEnd[bankId] = entry->prev; } else { gSoundBanks[bankId][entry->next].prev = entry->prev; } gSoundBanks[bankId][entry->prev].next = entry->next; - entry->next = D_8016E1A8[bankId]; + entry->next = sSoundBankFreeListStart[bankId]; entry->prev = 0xFF; - gSoundBanks[bankId][D_8016E1A8[bankId]].prev = bankIndex; - D_8016E1A8[bankId] = bankIndex; - entry->unk_2A = 0; + gSoundBanks[bankId][sSoundBankFreeListStart[bankId]].prev = entryIndex; + sSoundBankFreeListStart[bankId] = entryIndex; + entry->state = SFX_STATE_EMPTY; - for (i = 0; i < D_80130578[D_801333CC][bankId]; i++) { - if (D_8016E1B8[bankId][i].unk_4 == bankIndex) { - D_8016E1B8[bankId][i].unk_4 = 0xFF; - i = D_80130578[D_801333CC][bankId]; + for (i = 0; i < gChannelsPerBank[gSfxChannelLayout][bankId]; i++) { + if (gActiveSounds[bankId][i].entryIndex == entryIndex) { + gActiveSounds[bankId][i].entryIndex = 0xFF; + i = gChannelsPerBank[gSfxChannelLayout][bankId]; } } } -void func_800F7CEC(u8 arg0) { - u8 phi_s3; - u8 spAE; - u8 phi_s4; +void Audio_ChooseActiveSounds(u8 bankId) { + u8 numChosenSounds; + u8 numChannels; + u8 entryIndex; u8 i; u8 j; - u8 phi_s0; + u8 k; u8 sfxImportance; - u8 phi_v1_5; - u8 temp2; + u8 needNewSound; + u8 chosenEntryIndex; u16 temp3; f32 tempf1; SoundBankEntry* entry; - Struct_800F7CEC sp84[3]; - Struct_800F7CEC* temp_s4_3; + ActiveSound chosenSounds[MAX_CHANNELS_PER_BANK]; + ActiveSound* activeSound; s32 pad; - phi_s3 = 0; - for (i = 0; i < 3; i++) { - sp84[i].priority = 0x7FFFFFFF; - sp84[i].unk_4 = 0xFF; + numChosenSounds = 0; + for (i = 0; i < MAX_CHANNELS_PER_BANK; i++) { + chosenSounds[i].priority = 0x7FFFFFFF; + chosenSounds[i].entryIndex = 0xFF; } - phi_s4 = gSoundBanks[arg0][0].next; - phi_s0 = 0; - while (phi_s4 != 0xFF) { - if ((1 == gSoundBanks[arg0][phi_s4].unk_2A) && (gSoundBanks[arg0][phi_s4].sfxId & 0xC00)) { - gSoundBanks[arg0][phi_s4].unk_2B--; - } else if (!(gSoundBanks[arg0][phi_s4].sfxId & 0xC00) && (gSoundBanks[arg0][phi_s4].unk_2A == 5)) { - Audio_QueueCmdS8((gSoundBanks[arg0][phi_s4].unk_2E << 8) | 0x6020000, 0); - func_800F7B54(arg0, phi_s4); + entryIndex = gSoundBanks[bankId][0].next; + k = 0; + while (entryIndex != 0xFF) { + if ((gSoundBanks[bankId][entryIndex].state == SFX_STATE_QUEUED) && + (gSoundBanks[bankId][entryIndex].sfxId & 0xC00)) { + gSoundBanks[bankId][entryIndex].freshness--; + } else if (!(gSoundBanks[bankId][entryIndex].sfxId & 0xC00) && + (gSoundBanks[bankId][entryIndex].state == SFX_STATE_PLAYING_2)) { + Audio_QueueCmdS8((gSoundBanks[bankId][entryIndex].channelIdx << 8) | 0x6020000, 0); + Audio_RemoveSoundBankEntry(bankId, entryIndex); } - if (gSoundBanks[arg0][phi_s4].unk_2B == 0) { - func_800F7B54(arg0, phi_s4); - } else if (gSoundBanks[arg0][phi_s4].unk_2A != 0) { - entry = &gSoundBanks[arg0][phi_s4]; + if (gSoundBanks[bankId][entryIndex].freshness == 0) { + Audio_RemoveSoundBankEntry(bankId, entryIndex); + } else if (gSoundBanks[bankId][entryIndex].state != SFX_STATE_EMPTY) { + entry = &gSoundBanks[bankId][entryIndex]; if (&D_801333D4.x == entry[0].posX) { entry->dist = 0.0f; @@ -369,122 +383,124 @@ void func_800F7CEC(u8 arg0) { osSyncPrintf(D_80133344, entry->sfxId, entry->posX, entry->posZ, *entry->posX, *entry->posY, *entry->posZ); } - temp3 = entry->sfxId; + temp3 = entry->sfxId; // fake entry->priority = (u32)entry->dist + (SQ(0xFF - sfxImportance) * SQ(76)) + temp3 - temp3; if (*entry->posZ < 0.0f) { entry->priority += (s32)(-*entry->posZ * 6.0f); } } if (entry->dist > SQ(1e5f)) { - if (entry->unk_2A == 4) { - Audio_QueueCmdS8((entry->unk_2E << 8) | 0x6020000, 0); + if (entry->state == SFX_STATE_PLAYING_1) { + Audio_QueueCmdS8((entry->channelIdx << 8) | 0x6020000, 0); if (entry->sfxId & 0xC00) { - func_800F7B54(arg0, phi_s4); - phi_s4 = phi_s0; + Audio_RemoveSoundBankEntry(bankId, entryIndex); + entryIndex = k; } } } else { - spAE = D_80130578[D_801333CC][arg0]; - for (i = 0; i < spAE; i++) { - if (sp84[i].priority >= entry->priority) { - if (phi_s3 < D_80130578[D_801333CC][arg0]) { - phi_s3++; + numChannels = gChannelsPerBank[gSfxChannelLayout][bankId]; + for (i = 0; i < numChannels; i++) { + if (chosenSounds[i].priority >= entry->priority) { + if (numChosenSounds < gChannelsPerBank[gSfxChannelLayout][bankId]) { + numChosenSounds++; } - for (j = spAE - 1; j > i; j--) { - sp84[j].priority = sp84[j - 1].priority; - sp84[j].unk_4 = sp84[j - 1].unk_4; + for (j = numChannels - 1; j > i; j--) { + chosenSounds[j].priority = chosenSounds[j - 1].priority; + chosenSounds[j].entryIndex = chosenSounds[j - 1].entryIndex; } - sp84[i].priority = entry->priority; - sp84[i].unk_4 = phi_s4; - i = spAE; // "break;" + chosenSounds[i].priority = entry->priority; + chosenSounds[i].entryIndex = entryIndex; + i = numChannels; // "break;" } } } - phi_s0 = phi_s4; + k = entryIndex; } - phi_s4 = gSoundBanks[arg0][phi_s0].next; + entryIndex = gSoundBanks[bankId][k].next; } - for (i = 0; i < phi_s3; i++) { - entry = &gSoundBanks[arg0][sp84[i].unk_4]; - if (entry->unk_2A == 1) { - entry->unk_2A = 2; - } else if (entry->unk_2A == 4) { - entry->unk_2A = 3; + for (i = 0; i < numChosenSounds; i++) { + entry = &gSoundBanks[bankId][chosenSounds[i].entryIndex]; + if (entry->state == SFX_STATE_QUEUED) { + entry->state = SFX_STATE_READY; + } else if (entry->state == SFX_STATE_PLAYING_1) { + entry->state = SFX_STATE_PLAYING_REFRESH; } } - spAE = D_80130578[D_801333CC][arg0]; - for (i = 0; i < spAE; i++) { - phi_v1_5 = 0; - temp_s4_3 = &D_8016E1B8[arg0][i]; + // Pick something to play for all channels. + numChannels = gChannelsPerBank[gSfxChannelLayout][bankId]; + for (i = 0; i < numChannels; i++) { + needNewSound = false; + activeSound = &gActiveSounds[bankId][i]; - if (temp_s4_3->unk_4 == 0xFF) { - phi_v1_5 = 1; + if (activeSound->entryIndex == 0xFF) { + needNewSound = true; } else { - entry = &gSoundBanks[arg0][temp_s4_3[0].unk_4]; - if (entry->unk_2A == 4) { + entry = &gSoundBanks[bankId][activeSound[0].entryIndex]; + if (entry->state == SFX_STATE_PLAYING_1) { if (entry->sfxId & 0xC00) { - func_800F7B54(arg0, temp_s4_3->unk_4); + Audio_RemoveSoundBankEntry(bankId, activeSound->entryIndex); } else { - entry->unk_2A = 1; + entry->state = SFX_STATE_QUEUED; } - phi_v1_5 = 1; - } else if (entry->unk_2A == 0) { - temp_s4_3->unk_4 = 0xFF; - phi_v1_5 = 1; + needNewSound = true; + } else if (entry->state == SFX_STATE_EMPTY) { + activeSound->entryIndex = 0xFF; + needNewSound = true; } else { - for (j = 0; j < spAE; j++) { - if (temp_s4_3->unk_4 == sp84[j].unk_4) { - sp84[j].unk_4 = 0xFF; - j = spAE; + // Sound is already playing as it should, nothing to do. + for (j = 0; j < numChannels; j++) { + if (activeSound->entryIndex == chosenSounds[j].entryIndex) { + chosenSounds[j].entryIndex = 0xFF; + j = numChannels; } } - phi_s3--; + numChosenSounds--; } } - if (phi_v1_5 == 1) { - for (j = 0; j < spAE; j++) { - temp2 = sp84[j].unk_4; - if ((temp2 != 0xFF) && (gSoundBanks[arg0][temp2].unk_2A != 3)) { - for (phi_s0 = 0; phi_s0 < spAE; phi_s0++) { - if (temp2 == D_8016E1B8[arg0][phi_s0].unk_4) { - phi_v1_5 = 0; - phi_s0 = spAE; + if (needNewSound == true) { + for (j = 0; j < numChannels; j++) { + chosenEntryIndex = chosenSounds[j].entryIndex; + if ((chosenEntryIndex != 0xFF) && + (gSoundBanks[bankId][chosenEntryIndex].state != SFX_STATE_PLAYING_REFRESH)) { + for (k = 0; k < numChannels; k++) { + if (chosenEntryIndex == gActiveSounds[bankId][k].entryIndex) { + needNewSound = false; + k = numChannels; // "break;" } } - if (phi_v1_5 == 1) { - temp_s4_3->unk_4 = temp2; - - sp84[j].unk_4 = 0xFF; - - j = spAE + 1; - phi_s3--; + if (needNewSound == true) { + activeSound->entryIndex = chosenEntryIndex; + chosenSounds[j].entryIndex = 0xFF; + j = numChannels + 1; + numChosenSounds--; } } } - if (j == spAE) { - temp_s4_3->unk_4 = 0xFF; + if (j == numChannels) { + // nothing found + activeSound->entryIndex = 0xFF; } } } } -void func_800F8480(u8 bankId) { - u8 bankIndex; - SequenceChannel* seqChannel; +void Audio_PlayActiveSounds(u8 bankId) { + u8 entryIndex; + SequenceChannel* channel; SoundBankEntry* entry; u8 i; - for (i = 0; i < D_80130578[D_801333CC][bankId]; i++) { - bankIndex = D_8016E1B8[bankId][i].unk_4; - if (bankIndex != 0xFF) { - entry = &gSoundBanks[bankId][bankIndex]; - seqChannel = gAudioContext.seqPlayers[2].channels[D_8016E260]; - if (entry->unk_2A == 2) { - entry->unk_2E = D_8016E260; + for (i = 0; i < gChannelsPerBank[gSfxChannelLayout][bankId]; i++) { + entryIndex = gActiveSounds[bankId][i].entryIndex; + if (entryIndex != 0xFF) { + entry = &gSoundBanks[bankId][entryIndex]; + channel = gAudioContext.seqPlayers[2].channels[sCurSfxPlayerChannelIdx]; + if (entry->state == SFX_STATE_READY) { + entry->channelIdx = sCurSfxPlayerChannelIdx; if (entry->sfxParams & 8) { - Audio_QueueSeqCmdMute(D_8016E260); + Audio_QueueSeqCmdMute(sCurSfxPlayerChannelIdx); } if (entry->sfxParams & 0xC0) { switch (entry->sfxParams & 0xC0) { @@ -502,47 +518,48 @@ void func_800F8480(u8 bankId) { break; } } - Audio_SetSoundProperties(bankId, bankIndex, D_8016E260); - Audio_QueueCmdS8(0x06020000 | ((D_8016E260 & 0xFF) << 8), 1); - Audio_QueueCmdS8(0x06020000 | ((D_8016E260 & 0xFF) << 8) | 4, entry->sfxId & 0xFF); - if (D_80130570[bankId] != 0) { - Audio_QueueCmdS8(0x06020000 | ((D_8016E260 & 0xFF) << 8) | 5, (entry->sfxId & 0x100) >> 8); + Audio_SetSoundProperties(bankId, entryIndex, sCurSfxPlayerChannelIdx); + Audio_QueueCmdS8(0x06020000 | ((sCurSfxPlayerChannelIdx & 0xFF) << 8), 1); + Audio_QueueCmdS8(0x06020000 | ((sCurSfxPlayerChannelIdx & 0xFF) << 8) | 4, entry->sfxId & 0xFF); + if (gIsLargeSoundBank[bankId]) { + Audio_QueueCmdS8(0x06020000 | ((sCurSfxPlayerChannelIdx & 0xFF) << 8) | 5, + (entry->sfxId & 0x100) >> 8); } if (entry->sfxId & 0xC00) { - entry->unk_2A = 4; + entry->state = SFX_STATE_PLAYING_1; } else { - entry->unk_2A = 5; + entry->state = SFX_STATE_PLAYING_2; } - } else if ((u8)seqChannel->soundScriptIO[1] == 0xFF) { - func_800F7B54(bankId, bankIndex); - } else if (entry->unk_2A == 3) { - Audio_SetSoundProperties(bankId, bankIndex, D_8016E260); + } else if ((u8)channel->soundScriptIO[1] == 0xFF) { + Audio_RemoveSoundBankEntry(bankId, entryIndex); + } else if (entry->state == SFX_STATE_PLAYING_REFRESH) { + Audio_SetSoundProperties(bankId, entryIndex, sCurSfxPlayerChannelIdx); if (entry->sfxId & 0xC00) { - entry->unk_2A = 4; + entry->state = SFX_STATE_PLAYING_1; } else { - entry->unk_2A = 5; + entry->state = SFX_STATE_PLAYING_2; } } } - D_8016E260++; + sCurSfxPlayerChannelIdx++; } } -void func_800F87A0(u8 bankId) { +void Audio_StopSfxByBank(u8 bankId) { SoundBankEntry* entry; s32 pad; SoundBankEntry cmp; - u8 bankIndex = gSoundBanks[bankId][0].next; + u8 entryIndex = gSoundBanks[bankId][0].next; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[bankId][bankIndex]; - if (entry->unk_2A >= 3) { - Audio_QueueCmdS8(0x06020000 | ((entry->unk_2E & 0xFF) << 8), 0); + while (entryIndex != 0xFF) { + entry = &gSoundBanks[bankId][entryIndex]; + if (entry->state >= SFX_STATE_PLAYING_REFRESH) { + Audio_QueueCmdS8(0x06020000 | ((entry->channelIdx & 0xFF) << 8), 0); } - if (entry->unk_2A != 0) { - func_800F7B54(bankId, bankIndex); + if (entry->state != SFX_STATE_EMPTY) { + Audio_RemoveSoundBankEntry(bankId, entryIndex); } - bankIndex = gSoundBanks[bankId][0].next; + entryIndex = gSoundBanks[bankId][0].next; } cmp.sfxId = bankId << 12; Audio_RemoveMatchingSoundRequests(0, &cmp); @@ -550,26 +567,26 @@ void func_800F87A0(u8 bankId) { void func_800F8884(u8 bankId, Vec3f* pos) { SoundBankEntry* entry; - u8 bankIndex = gSoundBanks[bankId][0].next; - u8 bankIndex2 = 0; + u8 entryIndex = gSoundBanks[bankId][0].next; + u8 prevEntryIndex = 0; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[bankId][bankIndex]; + while (entryIndex != 0xFF) { + entry = &gSoundBanks[bankId][entryIndex]; if (entry->posX == &pos->x) { - if (entry->unk_2A >= 3) { - Audio_QueueCmdS8(0x06020000 | ((entry->unk_2E & 0xFF) << 8), 0); + if (entry->state >= SFX_STATE_PLAYING_REFRESH) { + Audio_QueueCmdS8(0x06020000 | ((entry->channelIdx & 0xFF) << 8), 0); } - if (entry->unk_2A != 0) { - func_800F7B54(bankId, bankIndex); + if (entry->state != SFX_STATE_EMPTY) { + Audio_RemoveSoundBankEntry(bankId, entryIndex); } } else { - bankIndex2 = bankIndex; + prevEntryIndex = entryIndex; } - bankIndex = gSoundBanks[bankId][bankIndex2].next; + entryIndex = gSoundBanks[bankId][prevEntryIndex].next; } } -void func_800F89A0(u8 bankId, Vec3f* pos) { +void Audio_StopSfxByPosAndBank(u8 bankId, Vec3f* pos) { SoundBankEntry cmp; func_800F8884(bankId, pos); @@ -578,7 +595,7 @@ void func_800F89A0(u8 bankId, Vec3f* pos) { Audio_RemoveMatchingSoundRequests(1, &cmp); } -void func_800F89E8(Vec3f* pos) { +void Audio_StopSfxByPos(Vec3f* pos) { u8 i; SoundBankEntry cmp; @@ -589,27 +606,27 @@ void func_800F89E8(Vec3f* pos) { Audio_RemoveMatchingSoundRequests(2, &cmp); } -void func_800F8A44(Vec3f* pos, u16 sfxId) { +void Audio_StopSfxByPosAndId(Vec3f* pos, u16 sfxId) { SoundBankEntry* entry; - u8 bankIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; - u8 bankIndex2 = 0; + u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; + u8 prevEntryIndex = 0; SoundBankEntry cmp; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[SFX_BANK(sfxId)][bankIndex]; + while (entryIndex != 0xFF) { + entry = &gSoundBanks[SFX_BANK(sfxId)][entryIndex]; if (entry->posX == &pos->x && entry->sfxId == sfxId) { - if (entry->unk_2A >= 3) { - Audio_QueueCmdS8(0x06020000 | ((entry->unk_2E & 0xFF) << 8), 0); + if (entry->state >= SFX_STATE_PLAYING_REFRESH) { + Audio_QueueCmdS8(0x06020000 | ((entry->channelIdx & 0xFF) << 8), 0); } - if (entry->unk_2A != 0) { - func_800F7B54(SFX_BANK(sfxId), bankIndex); + if (entry->state != SFX_STATE_EMPTY) { + Audio_RemoveSoundBankEntry(SFX_BANK(sfxId), entryIndex); } - bankIndex = 0xFF; + entryIndex = 0xFF; } else { - bankIndex2 = bankIndex; + prevEntryIndex = entryIndex; } - if (bankIndex != 0xFF) { - bankIndex = gSoundBanks[SFX_BANK(sfxId)][bankIndex2].next; + if (entryIndex != 0xFF) { + entryIndex = gSoundBanks[SFX_BANK(sfxId)][prevEntryIndex].next; } } cmp.posX = &pos->x; @@ -617,52 +634,52 @@ void func_800F8A44(Vec3f* pos, u16 sfxId) { Audio_RemoveMatchingSoundRequests(3, &cmp); } -void func_800F8BA0(u8 arg0, u16 sfxId) { +void Audio_StopSfxByTokenAndId(u8 token, u16 sfxId) { SoundBankEntry* entry; - u8 bankIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; - u8 bankIndex2 = 0; + u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; + u8 prevEntryIndex = 0; SoundBankEntry cmp; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[SFX_BANK(sfxId)][bankIndex]; - if (entry->unk_C == arg0 && entry->sfxId == sfxId) { - if (entry->unk_2A >= 3) { - Audio_QueueCmdS8(0x06020000 | ((entry->unk_2E & 0xFF) << 8), 0); + while (entryIndex != 0xFF) { + entry = &gSoundBanks[SFX_BANK(sfxId)][entryIndex]; + if (entry->token == token && entry->sfxId == sfxId) { + if (entry->state >= SFX_STATE_PLAYING_REFRESH) { + Audio_QueueCmdS8(0x06020000 | ((entry->channelIdx & 0xFF) << 8), 0); } - if (entry->unk_2A != 0) { - func_800F7B54(SFX_BANK(sfxId), bankIndex); + if (entry->state != SFX_STATE_EMPTY) { + Audio_RemoveSoundBankEntry(SFX_BANK(sfxId), entryIndex); } } else { - bankIndex2 = bankIndex; + prevEntryIndex = entryIndex; } - if (bankIndex != 0xFF) { - bankIndex = gSoundBanks[SFX_BANK(sfxId)][bankIndex2].next; + if (entryIndex != 0xFF) { + entryIndex = gSoundBanks[SFX_BANK(sfxId)][prevEntryIndex].next; } } - cmp.unk_C = arg0; + cmp.token = token; cmp.sfxId = sfxId; Audio_RemoveMatchingSoundRequests(4, &cmp); } -void Audio_StopSfx(u32 sfxId) { +void Audio_StopSfxById(u32 sfxId) { SoundBankEntry* entry; - u8 bankIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; - u8 bankIndex2 = 0; + u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; + u8 prevEntryIndex = 0; SoundBankEntry cmp; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[SFX_BANK(sfxId)][bankIndex]; + while (entryIndex != 0xFF) { + entry = &gSoundBanks[SFX_BANK(sfxId)][entryIndex]; if (entry->sfxId == sfxId) { - if (entry->unk_2A >= 3) { - Audio_QueueCmdS8(0x06020000 | ((entry->unk_2E & 0xFF) << 8), 0); + if (entry->state >= SFX_STATE_PLAYING_REFRESH) { + Audio_QueueCmdS8(0x06020000 | ((entry->channelIdx & 0xFF) << 8), 0); } - if (entry->unk_2A != 0) { - func_800F7B54(SFX_BANK(sfxId), bankIndex); + if (entry->state != SFX_STATE_EMPTY) { + Audio_RemoveSoundBankEntry(SFX_BANK(sfxId), entryIndex); } } else { - bankIndex2 = bankIndex; + prevEntryIndex = entryIndex; } - bankIndex = gSoundBanks[SFX_BANK(sfxId)][bankIndex2].next; + entryIndex = gSoundBanks[SFX_BANK(sfxId)][prevEntryIndex].next; } cmp.sfxId = sfxId; Audio_RemoveMatchingSoundRequests(5, &cmp); @@ -675,72 +692,72 @@ void Audio_ProcessSoundRequests(void) { } } -void func_800F8EA0(u8 arg0, u8 arg1, u16 arg2) { - if (arg2 == 0) { - arg2++; +void Audio_SetUnusedBankLerp(u8 bankId, u8 target, u16 delay) { + if (delay == 0) { + delay++; } - D_8016E270[arg0].unk_4 = arg1 / 127.0f; - D_8016E270[arg0].unk_C = arg2; - D_8016E270[arg0].unk_8 = ((D_8016E270[arg0].unk_0 - D_8016E270[arg0].unk_4) / arg2); + sUnusedBankLerp[bankId].target = target / 127.0f; + sUnusedBankLerp[bankId].remainingFrames = delay; + sUnusedBankLerp[bankId].step = ((sUnusedBankLerp[bankId].value - sUnusedBankLerp[bankId].target) / delay); } -void func_800F8F34(u8 arg0) { - if (D_8016E270[arg0].unk_C != 0) { - D_8016E270[arg0].unk_C--; - if (D_8016E270[arg0].unk_C != 0) { - D_8016E270[arg0].unk_0 -= D_8016E270[arg0].unk_8; +void Audio_StepUnusedBankLerp(u8 bankId) { + if (sUnusedBankLerp[bankId].remainingFrames != 0) { + sUnusedBankLerp[bankId].remainingFrames--; + if (sUnusedBankLerp[bankId].remainingFrames != 0) { + sUnusedBankLerp[bankId].value -= sUnusedBankLerp[bankId].step; } else { - D_8016E270[arg0].unk_0 = D_8016E270[arg0].unk_4; + sUnusedBankLerp[bankId].value = sUnusedBankLerp[bankId].target; } } } void func_800F8F88(void) { - u8 i; + u8 bankId; if (IS_SEQUENCE_CHANNEL_VALID(gAudioContext.seqPlayers[2].channels[0])) { - D_8016E260 = 0; - for (i = 0; i < ARRAY_COUNT(gSoundBanks); i++) { - func_800F7CEC(i); - func_800F8480(i); - func_800F8F34(i); + sCurSfxPlayerChannelIdx = 0; + for (bankId = 0; bankId < ARRAY_COUNT(gSoundBanks); bankId++) { + Audio_ChooseActiveSounds(bankId); + Audio_PlayActiveSounds(bankId); + Audio_StepUnusedBankLerp(bankId); } } } u8 Audio_IsSfxPlaying(u32 sfxId) { SoundBankEntry* entry; - u8 bankIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; + u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; - while (bankIndex != 0xFF) { - entry = &gSoundBanks[SFX_BANK(sfxId)][bankIndex]; + while (entryIndex != 0xFF) { + entry = &gSoundBanks[SFX_BANK(sfxId)][entryIndex]; if (entry->sfxId == sfxId) { return true; } - bankIndex = entry->next; + entryIndex = entry->next; } return false; } -void func_800F905C(void) { +void Audio_ResetSounds(void) { u8 bankId; u8 i; - u8 bankIndex; + u8 entryIndex; sSoundRequestWriteIndex = 0; sSoundRequestReadIndex = 0; D_801333D0 = 0; for (bankId = 0; bankId < ARRAY_COUNT(gSoundBanks); bankId++) { - D_8016E1A0[bankId] = 0; - D_8016E1A8[bankId] = 1; - D_8016E1B0[bankId] = 0; + sSoundBankListEnd[bankId] = 0; + sSoundBankFreeListStart[bankId] = 1; + sSoundBankUnused[bankId] = 0; gSoundBankMuted[bankId] = false; - D_8016E270[bankId].unk_0 = 1.0f; - D_8016E270[bankId].unk_C = 0; + sUnusedBankLerp[bankId].value = 1.0f; + sUnusedBankLerp[bankId].remainingFrames = 0; } for (bankId = 0; bankId < ARRAY_COUNT(gSoundBanks); bankId++) { - for (i = 0; i < 3; i++) { - D_8016E1B8[bankId][i].unk_4 = 0xFF; + for (i = 0; i < MAX_CHANNELS_PER_BANK; i++) { + gActiveSounds[bankId][i].entryIndex = 0xFF; } } for (bankId = 0; bankId < ARRAY_COUNT(gSoundBanks); bankId++) { @@ -755,9 +772,9 @@ void func_800F905C(void) { } if (D_801333F8 == 0) { for (bankId = 0; bankId < 10; bankId++) { - gAudioSEFlagSwapSource[bankId] = 0; - gAudioSEFlagSwapTarget[bankId] = 0; - gAudioSEFlagSwapMode[bankId] = 0; + gAudioSfxSwapSource[bankId] = 0; + gAudioSfxSwapTarget[bankId] = 0; + gAudioSfxSwapMode[bankId] = 0; } D_801333F8++; } diff --git a/src/code/code_800F9280.c b/src/code/code_800F9280.c index ca3884b533..f6eddd4a6f 100644 --- a/src/code/code_800F9280.c +++ b/src/code/code_800F9280.c @@ -9,56 +9,55 @@ extern u8 sSeqCmdRdPos; extern u8 sSeqCmdWrPos; extern u8 D_80133408; extern u8 D_80133418; -extern u8 D_801333CC; extern u8 D_80133410[]; // TODO: clean up these macros. They are similar to ones in code_800EC960.c but without casts. -#define Audio_StartSeq(seqIdx, fadeTimer, seqId) \ - Audio_QueueSeqCmd(0x00000000 | ((seqIdx) << 24) | ((fadeTimer) << 16) | (seqId)) -#define Audio_SeqCmdA(seqIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((seqIdx) << 24) | (a)) -#define Audio_SeqCmdB30(seqIdx, a, b) Audio_QueueSeqCmd(0xB0003000 | ((seqIdx) << 24) | ((a) << 16) | (b)) -#define Audio_SeqCmdB40(seqIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((seqIdx) << 24) | ((a) << 16) | (b)) -#define Audio_SeqCmd3(seqIdx, a) Audio_QueueSeqCmd(0x30000000 | ((seqIdx) << 24) | (a)) -#define Audio_SeqCmd5(seqIdx, a, b) Audio_QueueSeqCmd(0x50000000 | ((seqIdx) << 24) | ((a) << 16) | (b)) -#define Audio_SeqCmd4(seqIdx, a, b) Audio_QueueSeqCmd(0x40000000 | ((seqIdx) << 24) | ((a) << 16) | (b)) -#define Audio_SetVolScaleNow(seqIdx, volFadeTimer, volScale) \ - Audio_ProcessSeqCmd(0x40000000 | ((u8)seqIdx << 24) | ((u8)volFadeTimer << 16) | ((u8)(volScale * 127.0f))); +#define Audio_StartSeq(playerIdx, fadeTimer, seqId) \ + Audio_QueueSeqCmd(0x00000000 | ((playerIdx) << 24) | ((fadeTimer) << 16) | (seqId)) +#define Audio_SeqCmdA(playerIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((playerIdx) << 24) | (a)) +#define Audio_SeqCmdB30(playerIdx, a, b) Audio_QueueSeqCmd(0xB0003000 | ((playerIdx) << 24) | ((a) << 16) | (b)) +#define Audio_SeqCmdB40(playerIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((playerIdx) << 24) | ((a) << 16) | (b)) +#define Audio_SeqCmd3(playerIdx, a) Audio_QueueSeqCmd(0x30000000 | ((playerIdx) << 24) | (a)) +#define Audio_SeqCmd5(playerIdx, a, b) Audio_QueueSeqCmd(0x50000000 | ((playerIdx) << 24) | ((a) << 16) | (b)) +#define Audio_SeqCmd4(playerIdx, a, b) Audio_QueueSeqCmd(0x40000000 | ((playerIdx) << 24) | ((a) << 16) | (b)) +#define Audio_SetVolScaleNow(playerIdx, volFadeTimer, volScale) \ + Audio_ProcessSeqCmd(0x40000000 | ((u8)playerIdx << 24) | ((u8)volFadeTimer << 16) | ((u8)(volScale * 127.0f))); -void func_800F9280(u8 seqIdx, u8 seqId, u8 arg2, u16 fadeTimer) { +void func_800F9280(u8 playerIdx, u8 seqId, u8 arg2, u16 fadeTimer) { u8 i; u16 dur; s32 pad; - if (D_80133408 == 0 || seqIdx == 2) { + if (D_80133408 == 0 || playerIdx == 2) { arg2 &= 0x7F; if (arg2 == 0x7F) { dur = (fadeTimer >> 3) * 60 * gAudioContext.audioBufferParameters.updatesPerFrame; - Audio_QueueCmdS32(0x85000000 | _SHIFTL(seqIdx, 16, 8) | _SHIFTL(seqId, 8, 8), dur); + Audio_QueueCmdS32(0x85000000 | _SHIFTL(playerIdx, 16, 8) | _SHIFTL(seqId, 8, 8), dur); } else { - Audio_QueueCmdS32(0x82000000 | _SHIFTL(seqIdx, 16, 8) | _SHIFTL(seqId, 8, 8), + Audio_QueueCmdS32(0x82000000 | _SHIFTL(playerIdx, 16, 8) | _SHIFTL(seqId, 8, 8), (fadeTimer * (u16)gAudioContext.audioBufferParameters.updatesPerFrame) / 4); } - D_8016E750[seqIdx].unk_254 = seqId | (arg2 << 8); - D_8016E750[seqIdx].unk_256 = seqId | (arg2 << 8); + D_8016E750[playerIdx].unk_254 = seqId | (arg2 << 8); + D_8016E750[playerIdx].unk_256 = seqId | (arg2 << 8); - if (D_8016E750[seqIdx].volCur != 1.0f) { - Audio_QueueCmdF32(0x41000000 | _SHIFTL(seqIdx, 16, 8), D_8016E750[seqIdx].volCur); + if (D_8016E750[playerIdx].volCur != 1.0f) { + Audio_QueueCmdF32(0x41000000 | _SHIFTL(playerIdx, 16, 8), D_8016E750[playerIdx].volCur); } - D_8016E750[seqIdx].unk_28 = 0; - D_8016E750[seqIdx].unk_18 = 0; - D_8016E750[seqIdx].unk_14 = 0; + D_8016E750[playerIdx].unk_28 = 0; + D_8016E750[playerIdx].unk_18 = 0; + D_8016E750[playerIdx].unk_14 = 0; for (i = 0; i < 0x10; i++) { - D_8016E750[seqIdx].unk_50[i].unk_00 = 1.0f; - D_8016E750[seqIdx].unk_50[i].unk_0C = 0; - D_8016E750[seqIdx].unk_50[i].unk_10 = 1.0f; - D_8016E750[seqIdx].unk_50[i].unk_1C = 0; + D_8016E750[playerIdx].unk_50[i].unk_00 = 1.0f; + D_8016E750[playerIdx].unk_50[i].unk_0C = 0; + D_8016E750[playerIdx].unk_50[i].unk_10 = 1.0f; + D_8016E750[playerIdx].unk_50[i].unk_1C = 0; } - D_8016E750[seqIdx].unk_250 = 0; - D_8016E750[seqIdx].unk_252 = 0; + D_8016E750[playerIdx].unk_250 = 0; + D_8016E750[playerIdx].unk_252 = 0; } } @@ -102,7 +101,7 @@ void Audio_ProcessSeqCmd(u32 cmd) { u8 spec; u8 op; u8 subOp; - u8 seqIdx; + u8 playerIdx; u8 seqId; u8 seqArgs; u8 found; @@ -119,7 +118,7 @@ void Audio_ProcessSeqCmd(u32 cmd) { } op = cmd >> 28; - seqIdx = (cmd & 0xF000000) >> 24; + playerIdx = (cmd & 0xF000000) >> 24; switch (op) { case 0x0: @@ -127,15 +126,15 @@ void Audio_ProcessSeqCmd(u32 cmd) { seqId = cmd & 0xFF; seqArgs = (cmd & 0xFF00) >> 8; fadeTimer = (cmd & 0xFF0000) >> 13; - if ((D_8016E750[seqIdx].unk_260 == 0) && (seqArgs < 0x80)) { - func_800F9280(seqIdx, seqId, seqArgs, fadeTimer); + if ((D_8016E750[playerIdx].unk_260 == 0) && (seqArgs < 0x80)) { + func_800F9280(playerIdx, seqId, seqArgs, fadeTimer); } break; case 0x1: // disable seq player fadeTimer = (cmd & 0xFF0000) >> 13; - func_800F9474(seqIdx, fadeTimer); + func_800F9474(playerIdx, fadeTimer); break; case 0x2: @@ -144,35 +143,35 @@ void Audio_ProcessSeqCmd(u32 cmd) { seqArgs = (cmd & 0xFF00) >> 8; fadeTimer = (cmd & 0xFF0000) >> 13; new_var = seqArgs; - for (i = 0; i < D_8016E348[seqIdx]; i++) { - if (D_8016E320[seqIdx][i].unk_0 == seqId) { + for (i = 0; i < D_8016E348[playerIdx]; i++) { + if (D_8016E320[playerIdx][i].unk_0 == seqId) { if (i == 0) { - func_800F9280(seqIdx, seqId, seqArgs, fadeTimer); + func_800F9280(playerIdx, seqId, seqArgs, fadeTimer); } return; } } - found = D_8016E348[seqIdx]; - for (i = 0; i < D_8016E348[seqIdx]; i++) { - if (D_8016E320[seqIdx][i].unk_1 <= new_var) { + found = D_8016E348[playerIdx]; + for (i = 0; i < D_8016E348[playerIdx]; i++) { + if (D_8016E320[playerIdx][i].unk_1 <= new_var) { found = i; - i = D_8016E348[seqIdx]; // "break;" + i = D_8016E348[playerIdx]; // "break;" } } - if (D_8016E348[seqIdx] < 5) { - D_8016E348[seqIdx]++; + if (D_8016E348[playerIdx] < 5) { + D_8016E348[playerIdx]++; } - for (i = D_8016E348[seqIdx] - 1; i != found; i--) { - D_8016E320[seqIdx][i].unk_1 = D_8016E320[seqIdx][i - 1].unk_1; - D_8016E320[seqIdx][i].unk_0 = D_8016E320[seqIdx][i - 1].unk_0; + for (i = D_8016E348[playerIdx] - 1; i != found; i--) { + D_8016E320[playerIdx][i].unk_1 = D_8016E320[playerIdx][i - 1].unk_1; + D_8016E320[playerIdx][i].unk_0 = D_8016E320[playerIdx][i - 1].unk_0; } - D_8016E320[seqIdx][found].unk_1 = seqArgs; - D_8016E320[seqIdx][found].unk_0 = seqId; + D_8016E320[playerIdx][found].unk_1 = seqArgs; + D_8016E320[playerIdx][found].unk_0 = seqId; if (found == 0) { - func_800F9280(seqIdx, seqId, seqArgs, fadeTimer); + func_800F9280(playerIdx, seqId, seqArgs, fadeTimer); } break; @@ -181,26 +180,26 @@ void Audio_ProcessSeqCmd(u32 cmd) { seqId = cmd & 0xFF; fadeTimer = (cmd & 0xFF0000) >> 13; - found = D_8016E348[seqIdx]; - for (i = 0; i < D_8016E348[seqIdx]; i++) { - if (D_8016E320[seqIdx][i].unk_0 == seqId) { + found = D_8016E348[playerIdx]; + for (i = 0; i < D_8016E348[playerIdx]; i++) { + if (D_8016E320[playerIdx][i].unk_0 == seqId) { found = i; - i = D_8016E348[seqIdx]; // "break;" + i = D_8016E348[playerIdx]; // "break;" } } - if (found != D_8016E348[seqIdx]) { - for (i = found; i < D_8016E348[seqIdx] - 1; i++) { - D_8016E320[seqIdx][i].unk_1 = D_8016E320[seqIdx][i + 1].unk_1; - D_8016E320[seqIdx][i].unk_0 = D_8016E320[seqIdx][i + 1].unk_0; + if (found != D_8016E348[playerIdx]) { + for (i = found; i < D_8016E348[playerIdx] - 1; i++) { + D_8016E320[playerIdx][i].unk_1 = D_8016E320[playerIdx][i + 1].unk_1; + D_8016E320[playerIdx][i].unk_0 = D_8016E320[playerIdx][i + 1].unk_0; } - D_8016E348[seqIdx]--; + D_8016E348[playerIdx]--; } if (found == 0) { - func_800F9474(seqIdx, fadeTimer); - if (D_8016E348[seqIdx] != 0) { - func_800F9280(seqIdx, D_8016E320[seqIdx][0].unk_0, D_8016E320[seqIdx][0].unk_1, fadeTimer); + func_800F9474(playerIdx, fadeTimer); + if (D_8016E348[playerIdx] != 0) { + func_800F9280(playerIdx, D_8016E320[playerIdx][0].unk_0, D_8016E320[playerIdx][0].unk_1, fadeTimer); } } break; @@ -212,10 +211,11 @@ void Audio_ProcessSeqCmd(u32 cmd) { if (duration == 0) { duration++; } - D_8016E750[seqIdx].volTarget = (f32)val / 127.0f; - if (D_8016E750[seqIdx].volCur != D_8016E750[seqIdx].volTarget) { - D_8016E750[seqIdx].unk_08 = (D_8016E750[seqIdx].volCur - D_8016E750[seqIdx].volTarget) / (f32)duration; - D_8016E750[seqIdx].unk_0C = duration; + D_8016E750[playerIdx].volTarget = (f32)val / 127.0f; + if (D_8016E750[playerIdx].volCur != D_8016E750[playerIdx].volTarget) { + D_8016E750[playerIdx].unk_08 = + (D_8016E750[playerIdx].volCur - D_8016E750[playerIdx].volTarget) / (f32)duration; + D_8016E750[playerIdx].unk_0C = duration; } break; @@ -228,11 +228,12 @@ void Audio_ProcessSeqCmd(u32 cmd) { } freqScale = (f32)val / 1000.0f; for (i = 0; i < 16; i++) { - D_8016E750[seqIdx].unk_50[i].unk_14 = freqScale; - D_8016E750[seqIdx].unk_50[i].unk_1C = duration; - D_8016E750[seqIdx].unk_50[i].unk_18 = (D_8016E750[seqIdx].unk_50[i].unk_10 - freqScale) / (f32)duration; + D_8016E750[playerIdx].unk_50[i].unk_14 = freqScale; + D_8016E750[playerIdx].unk_50[i].unk_1C = duration; + D_8016E750[playerIdx].unk_50[i].unk_18 = + (D_8016E750[playerIdx].unk_50[i].unk_10 - freqScale) / (f32)duration; } - D_8016E750[seqIdx].unk_250 = 0xFFFF; + D_8016E750[playerIdx].unk_250 = 0xFFFF; break; case 0xD: @@ -244,11 +245,11 @@ void Audio_ProcessSeqCmd(u32 cmd) { duration++; } freqScale = (f32)val / 1000.0f; - D_8016E750[seqIdx].unk_50[chanIdx].unk_14 = freqScale; - D_8016E750[seqIdx].unk_50[chanIdx].unk_18 = - (D_8016E750[seqIdx].unk_50[chanIdx].unk_10 - freqScale) / (f32)duration; - D_8016E750[seqIdx].unk_50[chanIdx].unk_1C = duration; - D_8016E750[seqIdx].unk_250 |= 1 << chanIdx; + D_8016E750[playerIdx].unk_50[chanIdx].unk_14 = freqScale; + D_8016E750[playerIdx].unk_50[chanIdx].unk_18 = + (D_8016E750[playerIdx].unk_50[chanIdx].unk_10 - freqScale) / (f32)duration; + D_8016E750[playerIdx].unk_50[chanIdx].unk_1C = duration; + D_8016E750[playerIdx].unk_250 |= 1 << chanIdx; break; case 0x6: @@ -259,13 +260,13 @@ void Audio_ProcessSeqCmd(u32 cmd) { if (duration == 0) { duration++; } - D_8016E750[seqIdx].unk_50[chanIdx].unk_04 = (f32)val / 127.0f; - if (D_8016E750[seqIdx].unk_50[chanIdx].unk_00 != D_8016E750[seqIdx].unk_50[chanIdx].unk_04) { - D_8016E750[seqIdx].unk_50[chanIdx].unk_08 = - (D_8016E750[seqIdx].unk_50[chanIdx].unk_00 - D_8016E750[seqIdx].unk_50[chanIdx].unk_04) / + D_8016E750[playerIdx].unk_50[chanIdx].unk_04 = (f32)val / 127.0f; + if (D_8016E750[playerIdx].unk_50[chanIdx].unk_00 != D_8016E750[playerIdx].unk_50[chanIdx].unk_04) { + D_8016E750[playerIdx].unk_50[chanIdx].unk_08 = + (D_8016E750[playerIdx].unk_50[chanIdx].unk_00 - D_8016E750[playerIdx].unk_50[chanIdx].unk_04) / (f32)duration; - D_8016E750[seqIdx].unk_50[chanIdx].unk_0C = duration; - D_8016E750[seqIdx].unk_252 |= 1 << chanIdx; + D_8016E750[playerIdx].unk_50[chanIdx].unk_0C = duration; + D_8016E750[playerIdx].unk_252 |= 1 << chanIdx; } break; @@ -273,7 +274,7 @@ void Audio_ProcessSeqCmd(u32 cmd) { // set global io port port = (cmd & 0xFF0000) >> 16; val = cmd & 0xFF; - Audio_QueueCmdS8(0x46000000 | _SHIFTL(seqIdx, 16, 8) | _SHIFTL(port, 0, 8), val); + Audio_QueueCmdS8(0x46000000 | _SHIFTL(playerIdx, 16, 8) | _SHIFTL(port, 0, 8), val); break; case 0x8: @@ -281,15 +282,15 @@ void Audio_ProcessSeqCmd(u32 cmd) { chanIdx = (cmd & 0xF00) >> 8; port = (cmd & 0xFF0000) >> 16; val = cmd & 0xFF; - if ((D_8016E750[seqIdx].unk_258 & (1 << chanIdx)) == 0) { - Audio_QueueCmdS8(0x06000000 | _SHIFTL(seqIdx, 16, 8) | _SHIFTL(chanIdx, 8, 8) | _SHIFTL(port, 0, 8), + if ((D_8016E750[playerIdx].unk_258 & (1 << chanIdx)) == 0) { + Audio_QueueCmdS8(0x06000000 | _SHIFTL(playerIdx, 16, 8) | _SHIFTL(chanIdx, 8, 8) | _SHIFTL(port, 0, 8), val); } break; case 0x9: // set channel mask for command 0x8 - D_8016E750[seqIdx].unk_258 = cmd & 0xFFFF; + D_8016E750[playerIdx].unk_258 = cmd & 0xFFFF; break; case 0xA: @@ -297,36 +298,36 @@ void Audio_ProcessSeqCmd(u32 cmd) { channelMask = cmd & 0xFFFF; if (channelMask != 0) { // with channel mask channelMask... - Audio_QueueCmdU16(0x90000000 | _SHIFTL(seqIdx, 16, 8), channelMask); + Audio_QueueCmdU16(0x90000000 | _SHIFTL(playerIdx, 16, 8), channelMask); // stop channels - Audio_QueueCmdS8(0x08000000 | _SHIFTL(seqIdx, 16, 8) | 0xFF00, 1); + Audio_QueueCmdS8(0x08000000 | _SHIFTL(playerIdx, 16, 8) | 0xFF00, 1); } if ((channelMask ^ 0xFFFF) != 0) { // with channel mask ~channelMask... - Audio_QueueCmdU16(0x90000000 | _SHIFTL(seqIdx, 16, 8), (channelMask ^ 0xFFFF)); + Audio_QueueCmdU16(0x90000000 | _SHIFTL(playerIdx, 16, 8), (channelMask ^ 0xFFFF)); // unstop channels - Audio_QueueCmdS8(0x08000000 | _SHIFTL(seqIdx, 16, 8) | 0xFF00, 0); + Audio_QueueCmdS8(0x08000000 | _SHIFTL(playerIdx, 16, 8) | 0xFF00, 0); } break; case 0xB: // update tempo - D_8016E750[seqIdx].unk_14 = cmd; + D_8016E750[playerIdx].unk_14 = cmd; break; case 0xC: // start sequence with setup commands subOp = (cmd & 0xF00000) >> 20; if (subOp != 0xF) { - if (D_8016E750[seqIdx].unk_4D < 7) { - found = D_8016E750[seqIdx].unk_4D++; + if (D_8016E750[playerIdx].unk_4D < 7) { + found = D_8016E750[playerIdx].unk_4D++; if (found < 8) { - D_8016E750[seqIdx].unk_2C[found] = cmd; - D_8016E750[seqIdx].unk_4C = 2; + D_8016E750[playerIdx].unk_2C[found] = cmd; + D_8016E750[playerIdx].unk_4C = 2; } } } else { - D_8016E750[seqIdx].unk_4D = 0; + D_8016E750[playerIdx].unk_4D = 0; } break; @@ -348,7 +349,7 @@ void Audio_ProcessSeqCmd(u32 cmd) { case 0xF: // change spec spec = cmd & 0xFF; - D_801333CC = (cmd & 0xFF00) >> 8; + gSfxChannelLayout = (cmd & 0xFF00) >> 8; oldSpec = gAudioSpecId; gAudioSpecId = spec; func_800E5F88(spec); @@ -403,21 +404,21 @@ void func_800FA18C(u8 arg0, u8 arg1) { } } -void Audio_SetVolScale(u8 seqIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer) { +void Audio_SetVolScale(u8 playerIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer) { f32 volScale; u8 i; - D_8016E750[seqIdx].volScales[scaleIdx] = targetVol & 0x7F; + D_8016E750[playerIdx].volScales[scaleIdx] = targetVol & 0x7F; if (volFadeTimer != 0) { - D_8016E750[seqIdx].fadeVolUpdate = 1; - D_8016E750[seqIdx].volFadeTimer = volFadeTimer; + D_8016E750[playerIdx].fadeVolUpdate = 1; + D_8016E750[playerIdx].volFadeTimer = volFadeTimer; } else { for (i = 0, volScale = 1.0f; i < 4; i++) { - volScale *= D_8016E750[seqIdx].volScales[i] / 127.0f; + volScale *= D_8016E750[playerIdx].volScales[i] / 127.0f; } - Audio_SetVolScaleNow(seqIdx, volFadeTimer, volScale); + Audio_SetVolScaleNow(playerIdx, volFadeTimer, volScale); } } @@ -432,7 +433,7 @@ void func_800FA3DC(void) { u8 temp_s0_3; u8 temp_a3_3; s32 pad[3]; - u32 sp70; + u32 dummy; f32 phi_f0; u8 phi_t0; u8 i; @@ -441,7 +442,7 @@ void func_800FA3DC(void) { for (i = 0; i < 4; i++) { if (D_8016E750[i].unk_260 != 0) { - switch (func_800E5E20(&sp70)) { + switch (func_800E5E20(&dummy)) { case 1: case 2: case 3: @@ -624,13 +625,13 @@ void func_800FA3DC(void) { break; case 14: if (temp_a3_3 & 1) { - Audio_QueueCmdS32(0xE3000000, 0); + Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE); } if (temp_a3_3 & 2) { - Audio_QueueCmdS32(0xE3000000, 1); + Audio_QueueCmdS32(0xE3000000, FONT_TABLE); } if (temp_a3_3 & 4) { - Audio_QueueCmdS32(0xE3000000, 2); + Audio_QueueCmdS32(0xE3000000, SAMPLE_TABLE); } break; case 9: @@ -653,13 +654,13 @@ u8 func_800FAD34(void) { if (D_80133418 == 1) { if (func_800E5EDC() == 1) { D_80133418 = 0; - Audio_QueueCmdS8(0x46020000, D_801333CC); + Audio_QueueCmdS8(0x46020000, gSfxChannelLayout); func_800F7170(); } } else if (D_80133418 == 2) { while (func_800E5EDC() != 1) {} D_80133418 = 0; - Audio_QueueCmdS8(0x46020000, D_801333CC); + Audio_QueueCmdS8(0x46020000, gSfxChannelLayout); func_800F7170(); } } diff --git a/src/code/fault.c b/src/code/fault.c index aaf9237b28..52fe378f2a 100644 --- a/src/code/fault.c +++ b/src/code/fault.c @@ -51,7 +51,7 @@ void Fault_ClientProcessThread(void* arg) { } if (ctx->queue != NULL) { - osSendMesg(ctx->queue, ctx->msg, 1); + osSendMesg(ctx->queue, ctx->msg, OS_MESG_BLOCK); } } @@ -81,7 +81,7 @@ void Fault_ProcessClientContext(FaultClientContext* ctx) { while (true) { osSetTimer(&timer, OS_USEC_TO_CYCLES(1000000), 0, &queue, (OSMesg)timerMsgVal); - osRecvMesg(&queue, &recMsg, 1); + osRecvMesg(&queue, &recMsg, OS_MESG_BLOCK); if (recMsg != (OSMesg)666) { break; @@ -957,7 +957,7 @@ void Fault_ThreadEntry(void* arg) { while (true) { do { - osRecvMesg(&sFaultStructPtr->queue, &msg, 1); + osRecvMesg(&sFaultStructPtr->queue, &msg, OS_MESG_BLOCK); if (msg == (OSMesg)1) { sFaultStructPtr->msgId = 1; diff --git a/src/code/sched.c b/src/code/sched.c index ef582449c2..f3a14893e3 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -87,7 +87,7 @@ void Sched_HandleReset(SchedContext* sc) { if (sc->curRDPTask != NULL) { LOG_TIME("(((u64)(now - rdp_start_time)*(1000000LL/15625LL))/((62500000LL*3/4)/15625LL))", OS_CYCLES_TO_USEC(now - sRDPStartTime), "../sched.c", 431); - osSendMesg(&sc->interruptQ, RDP_DONE_MSG, 0); + osSendMesg(&sc->interruptQ, RDP_DONE_MSG, OS_MESG_NOBLOCK); } } } diff --git a/src/code/z_actor.c b/src/code/z_actor.c index e3cf906808..fdd8bfd438 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -2837,7 +2837,7 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, GlobalContext* globalC actorCtx->targetCtx.unk_90 = NULL; } - func_800F89E8(&actor->projectedPos); + Audio_StopSfxByPos(&actor->projectedPos); Actor_Destroy(actor, globalCtx); newHead = Actor_RemoveFromCategory(globalCtx, actorCtx, actor); diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 7a11ae2125..e227249035 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -7129,7 +7129,7 @@ s32 Camera_CheckWater(Camera* camera) { camera->unk_150 = 0x50; } - func_800F6828(0x20); + Audio_SetExtraFilter(0x20); if (PREG(81)) { Quake_RemoveFromIdx(*quakeId); @@ -7164,7 +7164,7 @@ s32 Camera_CheckWater(Camera* camera) { camera->unk_150 = 0; camera->unk_152 = 0; } - func_800F6828(0); + Audio_SetExtraFilter(0); } //! @bug: doesn't always return a value, but sometimes does. } diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c index decc148f0f..274a93e3ff 100644 --- a/src/code/z_effect_soft_sprite.c +++ b/src/code/z_effect_soft_sprite.c @@ -62,11 +62,11 @@ void EffectSs_ClearAll(GlobalContext* globalCtx) { void EffectSs_Delete(EffectSs* effectSs) { if (effectSs->flags & 2) { - func_800F89E8(&effectSs->pos); + Audio_StopSfxByPos(&effectSs->pos); } if (effectSs->flags & 4) { - func_800F89E8(&effectSs->vec); + Audio_StopSfxByPos(&effectSs->vec); } EffectSs_Reset(effectSs); diff --git a/src/code/z_play.c b/src/code/z_play.c index 628dbaf14e..0807d91a72 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -205,7 +205,7 @@ void Gameplay_Init(GameState* thisx) { GameState_Realloc(&globalCtx->state, 0x1D4790); KaleidoManager_Init(globalCtx); View_Init(&globalCtx->view, gfxCtx); - func_800F6828(0); + Audio_SetExtraFilter(0); Quake_Init(); for (i = 0; i < 4; i++) { @@ -402,7 +402,7 @@ void Gameplay_Init(GameState* thisx) { if (dREG(95) != 0) { D_8012D1F0 = D_801614D0; osSyncPrintf("\nkawauso_data=[%x]", D_8012D1F0); - DmaMgr_DMARomToRam(0x03FEB000, (u32)D_8012D1F0, sizeof(D_801614D0)); + DmaMgr_DmaRomToRam(0x03FEB000, (u32)D_8012D1F0, sizeof(D_801614D0)); } } diff --git a/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c b/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c index b19c1579cf..cef646156c 100644 --- a/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c +++ b/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c @@ -72,7 +72,7 @@ void BgHakaShip_Destroy(Actor* thisx, GlobalContext* globalCtx) { BgHakaShip* this = THIS; DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); - func_800F89E8(&this->bellSoundPos); + Audio_StopSfxByPos(&this->bellSoundPos); } void BgHakaShip_ChildUpdatePosition(BgHakaShip* this, GlobalContext* globalCtx) { diff --git a/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c b/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c index 904c5c3ca0..cd6a6eefc3 100644 --- a/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c +++ b/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c @@ -200,7 +200,7 @@ void BgHakaTrap_Destroy(Actor* thisx, GlobalContext* globalCtx) { Collider_DestroyCylinder(globalCtx, &this->colliderCylinder); } - func_800F89E8(&this->unk_16C); + Audio_StopSfxByPos(&this->unk_16C); } void func_8087FFC0(BgHakaTrap* this, GlobalContext* globalCtx) { diff --git a/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c b/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c index 3d7f41845b..b8fff6b70f 100644 --- a/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c +++ b/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c @@ -112,7 +112,7 @@ void BgHidanRock_Destroy(Actor* thisx, GlobalContext* globalCtx) { DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); Collider_DestroyCylinder(globalCtx, &this->collider); - func_800F89E8(&this->unk_170); + Audio_StopSfxByPos(&this->unk_170); } void func_8088B24C(BgHidanRock* this) { diff --git a/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c b/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c index 2c056d7229..5eb506a079 100644 --- a/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c +++ b/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c @@ -335,7 +335,7 @@ void BgYdanSp_FloorWebIdle(BgYdanSp* this, GlobalContext* globalCtx) { if (this->unk16C > 3.0f) { Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WEB_VIBRATION); } else { - Audio_StopSfx(NA_SE_EV_WEB_VIBRATION); + Audio_StopSfxById(NA_SE_EV_WEB_VIBRATION); } } BgYdanSp_UpdateFloorWebCollision(this); diff --git a/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c b/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c index abf0750a51..d9d6069ddb 100644 --- a/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c +++ b/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c @@ -688,7 +688,7 @@ void BossFd2_Death(BossFd2* this, GlobalContext* globalCtx) { if ((this->work[FD2_HOLE_COUNTER] == 1) || (this->work[FD2_HOLE_COUNTER] == 40)) { this->work[FD2_SCREAM_TIMER] = 20; if (this->work[FD2_HOLE_COUNTER] == 40) { - Audio_StopSfx(NA_SE_EN_VALVAISA_DEAD); + Audio_StopSfxById(NA_SE_EN_VALVAISA_DEAD); } Audio_PlayActorSound2(&this->actor, NA_SE_EN_VALVAISA_DAMAGE2); diff --git a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index 6f388856f0..7ec93d3a12 100644 --- a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -1022,11 +1022,11 @@ void func_808FFCFC(BossGanon2* this, GlobalContext* globalCtx) { ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) < 0x2800) { this->unk_311 = false; func_80900580(this, globalCtx); - Audio_StopSfx(NA_SE_EN_MGANON_UNARI); + Audio_StopSfxById(NA_SE_EN_MGANON_UNARI); } else if ((this->actor.bgCheckFlags & 8) && func_808FFA24(this, globalCtx)) { this->unk_311 = false; func_80900580(this, globalCtx); - Audio_StopSfx(NA_SE_EN_MGANON_UNARI); + Audio_StopSfxById(NA_SE_EN_MGANON_UNARI); } } @@ -1889,12 +1889,12 @@ void func_80902524(BossGanon2* this, GlobalContext* globalCtx) { func_809000A0(this, globalCtx); Audio_PlayActorSound2(&this->actor, NA_SE_EN_FANTOM_HIT_THUNDER); Audio_PlayActorSound2(&this->actor, NA_SE_EN_MGANON_DAMAGE); - Audio_StopSfx(NA_SE_EN_MGANON_UNARI); + Audio_StopSfxById(NA_SE_EN_MGANON_UNARI); } else if ((this->actionFunc == func_80900890) && (acHitInfo->toucher.dmgFlags & 0x9000200)) { this->unk_316 = 60; this->unk_342 = 5; Audio_PlayActorSound2(&this->actor, NA_SE_EN_MGANON_DAMAGE); - Audio_StopSfx(NA_SE_EN_MGANON_UNARI); + Audio_StopSfxById(NA_SE_EN_MGANON_UNARI); this->actor.colChkInfo.health -= 2; temp_v0_4 = this->actor.colChkInfo.health; if (temp_v0_4 < 0x15 && this->unk_334 == 0) { @@ -1920,7 +1920,7 @@ void func_80902524(BossGanon2* this, GlobalContext* globalCtx) { this->unk_344 = 0x32; this->unk_342 = 5; Audio_PlayActorSound2(&this->actor, NA_SE_EN_MGANON_DAMAGE); - Audio_StopSfx(NA_SE_EN_MGANON_UNARI); + Audio_StopSfxById(NA_SE_EN_MGANON_UNARI); phi_v1_2 = 1; if (acHitInfo->toucher.dmgFlags & 0x9000200) { if (acHitInfo->toucher.dmgFlags & 0x8000000) { diff --git a/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c index 2131c012c6..fabe83577f 100644 --- a/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c +++ b/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c @@ -1837,7 +1837,7 @@ void BossGoma_UpdateHit(BossGoma* this, GlobalContext* globalCtx) { } else if (this->actionFunc != BossGoma_FloorStunned && this->patienceTimer != 0 && (acHitInfo->toucher.dmgFlags & 0x00000005)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOMA_DAM2); - Audio_StopSfx(NA_SE_EN_GOMA_CRY1); + Audio_StopSfxById(NA_SE_EN_GOMA_CRY1); this->invincibilityFrames = 10; BossGoma_SetupFloorStunned(this); this->sfxFaintTimer = 100; diff --git a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c index 9550f2f051..d61506d2a0 100644 --- a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c +++ b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c @@ -2262,7 +2262,7 @@ void BossMo_UpdateTent(Actor* thisx, GlobalContext* globalCtx) { this->actor.draw = NULL; if (this->tent2KillTimer > 20) { Actor_Kill(&this->actor); - func_800F89E8(&this->tentTipPos); + Audio_StopSfxByPos(&this->tentTipPos); sMorphaTent2 = NULL; } return; diff --git a/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c b/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c index 55940d54c9..38f060391d 100644 --- a/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c +++ b/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c @@ -342,7 +342,7 @@ void BossSst_Destroy(Actor* thisx, GlobalContext* globalCtx) { Collider_DestroyJntSph(globalCtx, &this->colliderJntSph); Collider_DestroyCylinder(globalCtx, &this->colliderCyl); - func_800F89E8(&this->center); + Audio_StopSfxByPos(&this->center); } void BossSst_HeadSetupLurk(BossSst* this) { diff --git a/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c b/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c index b9240954ce..e4fb4e2dcf 100644 --- a/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c +++ b/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c @@ -338,7 +338,7 @@ void EnDivingGame_SetupRupeeThrow(EnDivingGame* this, GlobalContext* globalCtx) void EnDivingGame_RupeeThrow(EnDivingGame* this, GlobalContext* globalCtx) { SkelAnime_Update(&this->skelAnime); if (func_800C0DB4(globalCtx, &this->actor.projectedPos)) { - func_800F6828(0); + Audio_SetExtraFilter(0); } if (this->subCamId != 0) { Math_ApproachF(&this->camEye.x, this->unk_2D0.x, this->unk_2DC.x, this->unk_2E8.x * this->unk_318); diff --git a/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c b/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c index 324e6d90bc..ba3a56d831 100644 --- a/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c +++ b/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c @@ -244,7 +244,7 @@ void EnDntNomal_TargetWait(EnDntNomal* this, GlobalContext* globalCtx) { scorePos.y = this->actor.world.pos.y + 20.0f; scorePos.z = this->actor.world.pos.z; EffectSsExtra_Spawn(globalCtx, &scorePos, &scoreVel, &scoreAccel, 4, 2); - Audio_StopSfx(NA_SE_SY_TRE_BOX_APPEAR); + Audio_StopSfxById(NA_SE_SY_TRE_BOX_APPEAR); func_80078884(NA_SE_SY_TRE_BOX_APPEAR); // "Big hit" osSyncPrintf(VT_FGCOL(CYAN) "☆☆☆☆☆ 大当り ☆☆☆☆☆ %d\n" VT_RST, this->hitCounter); diff --git a/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c index 287e8a6634..54cd6a1232 100644 --- a/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c +++ b/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c @@ -838,7 +838,7 @@ void EnGeldB_SetupSlash(EnGeldB* this) { this->action = GELDB_SLASH; this->spinAttackState = 0; this->actor.speedXZ = 0.0f; - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_GERUDOFT_BREATH); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_GERUDOFT_BREATH); EnGeldB_SetupAction(this, EnGeldB_Slash); } @@ -1363,7 +1363,7 @@ void EnGeldB_CollisionCheck(EnGeldB* this, GlobalContext* globalCtx) { if (this->actor.colChkInfo.damageEffect != GELDB_DMG_UNK_6) { this->damageEffect = this->actor.colChkInfo.damageEffect; Actor_SetDropFlag(&this->actor, &this->bodyCollider.info, 1); - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_GERUDOFT_BREATH); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_GERUDOFT_BREATH); if ((this->actor.colChkInfo.damageEffect == GELDB_DMG_STUN) || (this->actor.colChkInfo.damageEffect == GELDB_DMG_FREEZE)) { if (this->action != GELDB_STUNNED) { diff --git a/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/src/overlays/actors/ovl_En_Go2/z_en_go2.c index db5ce3b901..280459b81e 100644 --- a/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -506,12 +506,12 @@ s16 EnGo2_GetStateGoronCityLink(GlobalContext* globalCtx, EnGo2* this) { if (globalCtx->msgCtx.choiceIndex == 0) { this->actor.textId = gSaveContext.infTable[16] & 0x800 ? 0x3033 : 0x3035; if (this->actor.textId == 0x3035) { - Audio_StopSfx(0x39EB); + Audio_StopSfxById(NA_SE_EN_GOLON_CRY); } } else { this->actor.textId = gSaveContext.infTable[16] & 0x800 ? 0x3036 : 0x3033; if (this->actor.textId == 0x3036) { - Audio_StopSfx(0x39EB); + Audio_StopSfxById(NA_SE_EN_GOLON_CRY); } } func_8010B720(globalCtx, this->actor.textId); diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index ccc4df1e71..561e36eff7 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -899,7 +899,7 @@ void EnHorse_Destroy(Actor* thisx, GlobalContext* globalCtx) { EnHorse* this = THIS; if (this->stateFlags & ENHORSE_DRAW) { - func_800F89E8(&this->unk_21C); + Audio_StopSfxByPos(&this->unk_21C); } func_800A6888(globalCtx, &this->skin); Collider_DestroyCylinder(globalCtx, &this->cyl1); diff --git a/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c b/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c index 2ce394e772..538a203fa4 100644 --- a/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c +++ b/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c @@ -699,7 +699,7 @@ void EnPoField_SoulInteract(EnPoField* this, GlobalContext* globalCtx) { } if (func_8010BDBC(&globalCtx->msgCtx) == 4) { if (func_80106BC8(globalCtx) != 0) { - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); if (globalCtx->msgCtx.choiceIndex == 0) { if (Inventory_HasEmptyBottle()) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_PO_BIG_GET); diff --git a/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/src/overlays/actors/ovl_En_Poh/z_en_poh.c index b44c945b14..4209559c43 100644 --- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c +++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c @@ -443,7 +443,7 @@ void EnPoh_Talk(EnPoh* this, GlobalContext* globalCtx) { void func_80ADE950(EnPoh* this, s32 arg1) { if (arg1) { - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); Audio_PlayActorSound2(&this->actor, NA_SE_EN_PO_LAUGH); } this->actionFunc = func_80AE009C; @@ -816,7 +816,7 @@ void EnPoh_TalkRegular(EnPoh* this, GlobalContext* globalCtx) { } if (func_8010BDBC(&globalCtx->msgCtx) == 4) { if (func_80106BC8(globalCtx) != 0) { - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_PO_BIG_CRY - SFX_FLAG); if (globalCtx->msgCtx.choiceIndex == 0) { if (Inventory_HasEmptyBottle()) { this->actor.textId = 0x5008; diff --git a/src/overlays/actors/ovl_En_Test/z_en_test.c b/src/overlays/actors/ovl_En_Test/z_en_test.c index 0e35d4830d..d361988395 100644 --- a/src/overlays/actors/ovl_En_Test/z_en_test.c +++ b/src/overlays/actors/ovl_En_Test/z_en_test.c @@ -894,7 +894,7 @@ void func_80860F84(EnTest* this, GlobalContext* globalCtx) { void EnTest_SetupSlashDown(EnTest* this) { Animation_PlayOnce(&this->skelAnime, &gStalfosDownSlashAnim); - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); this->swordCollider.base.atFlags &= ~AT_BOUNCED; this->unk_7C8 = 0x10; this->actor.speedXZ = 0.0f; @@ -1076,7 +1076,7 @@ void EnTest_JumpBack(EnTest* this, GlobalContext* globalCtx) { void EnTest_SetupJumpslash(EnTest* this) { Animation_PlayOnce(&this->skelAnime, &gStalfosJumpAnim); - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); this->timer = 0; this->unk_7C8 = 0x17; this->actor.velocity.y = 10.0f; @@ -1669,7 +1669,7 @@ void EnTest_UpdateDamage(EnTest* this, GlobalContext* globalCtx) { this->unk_7DC = player->unk_845; this->actor.world.rot.y = this->actor.yawTowardsPlayer; Actor_SetDropFlag(&this->actor, &this->bodyCollider.info, false); - func_800F8A44(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); + Audio_StopSfxByPosAndId(&this->actor.projectedPos, NA_SE_EN_STAL_WARAU); if ((this->actor.colChkInfo.damageEffect == STALFOS_DMGEFF_STUN) || (this->actor.colChkInfo.damageEffect == STALFOS_DMGEFF_FREEZE) || diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c index 752bd2a103..f1b3d30c38 100644 --- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c +++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c @@ -404,7 +404,7 @@ void EnViewer_UpdateImpl(EnViewer* this, GlobalContext* globalCtx) { break; } } else { - func_800F67A0(0); + Audio_SetBaseFilter(0); switch (this->state) { case 0: Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_opening_demo1_Anim_00504C, 1.0f); diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c index 51eb30d627..77c821238f 100644 --- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c +++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c @@ -307,7 +307,7 @@ void EnWallmas_WaitToDrop(EnWallmas* this, GlobalContext* globalCtx) { if ((player->stateFlags1 & 0x100000) || (player->stateFlags1 & 0x8000000) || !(player->actor.bgCheckFlags & 1) || ((this->actor.params == 1) && (320.0f < Math_Vec3f_DistXZ(&this->actor.home.pos, playerPos)))) { - Audio_StopSfx(NA_SE_EN_FALL_AIM); + Audio_StopSfxById(NA_SE_EN_FALL_AIM); this->timer = 0x82; } diff --git a/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c b/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c index 76163bf0fb..3b8c3c713c 100644 --- a/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c +++ b/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c @@ -177,7 +177,7 @@ void func_80B42F74(EnYabusameMark* this, GlobalContext* globalCtx) { func_800F5C64(NA_BGM_ITEM_GET | 0x900); } if (scoreIndex == 1) { - Audio_StopSfx(NA_SE_SY_TRE_BOX_APPEAR); + Audio_StopSfxById(NA_SE_SY_TRE_BOX_APPEAR); func_80078884(NA_SE_SY_TRE_BOX_APPEAR); } if (scoreIndex == 0) { diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index a2982c5cc4..fb65f194a4 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -1292,7 +1292,7 @@ void func_808326F0(Player* this) { s32 i; for (i = 0; i < 4; i++) { - Audio_StopSfx((u16)(*entry + this->ageProperties->unk_92)); + Audio_StopSfxById((u16)(*entry + this->ageProperties->unk_92)); entry++; } } @@ -5540,10 +5540,10 @@ void func_8083D36C(GlobalContext* globalCtx, Player* this) { void func_8083D53C(GlobalContext* globalCtx, Player* this) { if (this->actor.yDistToWater < this->ageProperties->unk_2C) { - func_800F67A0(0); + Audio_SetBaseFilter(0); this->unk_840 = 0; } else { - func_800F67A0(32); + Audio_SetBaseFilter(0x20); if (this->unk_840 < 300) { this->unk_840++; }