From cdb0c4193b101ec7cb2955800b09e001a0bc9b84 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 25 Mar 2023 04:27:54 -0700 Subject: [PATCH] GBA Audio: Clear GB audio state when disabled --- CHANGES | 1 + src/gba/audio.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/CHANGES b/CHANGES index 0c7a5918b..3b8022655 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Features: Emulation fixes: - GB Video: Implement DMG-style sprite ordering - GBA Audio: Fix improperly deserializing GB audio registers (fixes mgba.io/i/2793) + - GBA Audio: Clear GB audio state when disabled - GBA Memory: Make VRAM access stalls only apply to BG RAM - GBA Overrides: Fix saving in PMD:RRT (JP) (fixes mgba.io/i/2862) - GBA SIO: Fix SIOCNT SI pin value after attaching player 2 (fixes mgba.io/i/2805) diff --git a/src/gba/audio.c b/src/gba/audio.c index 2c61aa1ce..83c20da7d 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -231,8 +231,22 @@ void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value) { + GBAAudioSample(audio, mTimingCurrentTime(&audio->p->timing)); audio->enable = GBAudioEnableGetEnable(value); GBAudioWriteNR52(&audio->psg, value); + if (!audio->enable) { + int i; + for (i = REG_SOUND1CNT_LO; i < REG_SOUNDCNT_HI; i += 2) { + audio->p->memory.io[i >> 1] = 0; + } + audio->psg.ch3.size = 0; + audio->psg.ch3.bank = 0; + audio->psg.ch3.volume = 0; + audio->volume = 0; + audio->volumeChA = 0; + audio->volumeChB = 0; + audio->p->memory.io[REG_SOUNDCNT_HI >> 1] &= 0xFF00; + } } void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value) {