From 8da31e61996ae1c59b2d31e48136286d9af7b0f2 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Sat, 16 May 2026 11:14:09 +1000 Subject: [PATCH] fix audio engine crash from reloading banks that are already loaded (#1232) * fix audio engine crash from reloading banks that are already loaded * only promote banks that are "discardable" --- src/audio/heap.c | 7 +++++++ src/audio/load.c | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/audio/heap.c b/src/audio/heap.c index 8390cbda7..83c46c373 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -228,6 +228,13 @@ void discard_bank(s32 bankId) { note->parentLayer->finished = TRUE; } note_disable(note); + + // Reset sample state + note->sound = NULL; + note->samplePosInt = 0; + note->samplePosFrac = 0; + note->sampleDmaIndex = 0; + audio_list_remove(¬e->listItem); audio_list_push_back(&gNoteFreeLists.disabled, ¬e->listItem); } diff --git a/src/audio/load.c b/src/audio/load.c index 3e27fbf66..38737481a 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -1591,7 +1591,15 @@ void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) { if (smlua_audio_utils_override(seqId, &bankId, &sequenceData)) { sequence_player_disable(seqPlayer); seqPlayer->defaultBank[0] = bankId; - if (!bank_load_immediate(bankId, 0)) { return; } + + // Check if the bank is already loaded in the temporary cache + if (get_bank_or_seq(&gBankLoadedPool, 0, bankId) == NULL) { + if (!bank_load_immediate(bankId, 0)) { return; } + } else if (gBankLoadStatus[bankId] == SOUND_LOAD_STATUS_DISCARDABLE) { + // This bank is still available, so just mark it as loaded again + gBankLoadStatus[bankId] = SOUND_LOAD_STATUS_COMPLETE; + } + seqPlayer->seqId = seqId; gSeqLoadStatus[seqId] = SOUND_LOAD_STATUS_COMPLETE; init_sequence_player(player);