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"
This commit is contained in:
Isaac0-dev 2026-05-16 11:14:09 +10:00 committed by GitHub
parent 967d120505
commit 8da31e6199
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 1 deletions

View file

@ -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(&note->listItem);
audio_list_push_back(&gNoteFreeLists.disabled, &note->listItem);
}

View file

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