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);