From e9ec009836d9501909a519fc94b52d09c2ad6ddd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 7 Dec 2022 01:21:21 -0800 Subject: [PATCH] GB Audio: Fix channel 3 volume being changed between samples (fixes #1896) --- CHANGES | 1 + src/gb/audio.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/CHANGES b/CHANGES index 73b36504c..07d262ca1 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Features: - Debugger: Add range watchpoints Emulation fixes: - GB Audio: Fix channels 1/2 not playing when resetting volume (fixes mgba.io/i/2614) + - GB Audio: Fix channel 3 volume being changed between samples (fixes mgba.io/i/1896) - GB Serialize: Don't write BGP/OBP when loading SCGB state (fixes mgba.io/i/2694) - GB SIO: Further fix bidirectional transfer starting - GBA: Fix resetting key IRQ state (fixes mgba.io/i/2716) diff --git a/src/gb/audio.c b/src/gb/audio.c index 26675a983..516c6c663 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -269,6 +269,29 @@ void GBAudioWriteNR31(struct GBAudio* audio, uint8_t value) { void GBAudioWriteNR32(struct GBAudio* audio, uint8_t value) { GBAudioRun(audio, mTimingCurrentTime(audio->timing), 0x4); audio->ch3.volume = GBAudioRegisterBankVolumeGetVolumeGB(value); + + audio->ch3.sample = audio->ch3.wavedata8[audio->ch3.window >> 1]; + if (!(audio->ch3.window & 1)) { + audio->ch3.sample >>= 4; + } + audio->ch3.sample &= 0xF; + int volume; + switch (audio->ch3.volume) { + case 0: + volume = 4; + break; + case 1: + volume = 0; + break; + case 2: + volume = 1; + break; + default: + case 3: + volume = 2; + break; + } + audio->ch3.sample >>= volume; } void GBAudioWriteNR33(struct GBAudio* audio, uint8_t value) {