From 7c4a7796f892f7349a23d4595983292fe2860248 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 30 Jan 2023 00:21:18 -0800 Subject: [PATCH] GBA Audio: Fix improperly deserializing GB audio registers (fixes #2793) --- CHANGES | 1 + src/gb/audio.c | 2 ++ src/gba/audio.c | 10 ++++++++++ src/gba/io.c | 4 ++-- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 5a0a63fc5..1b9bbaf73 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 0.10.2: (Future) Emulation fixes: + - GBA Audio: Fix improperly deserializing GB audio registers (fixes mgba.io/i/2793) - GBA Memory: Make VRAM access stalls only apply to BG RAM Other fixes: - Core: Allow sending thread requests to a crashed core (fixes mgba.io/i/2784) diff --git a/src/gb/audio.c b/src/gb/audio.c index d2d6a9260..078f93358 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -1089,6 +1089,8 @@ void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGSt audio->ch4.lastEvent = currentTime + (when & (cycles - 1)) - cycles; } } + audio->ch4.nSamples = 0; + audio->ch4.samples = 0; } void GBAudioSerialize(const struct GBAudio* audio, struct GBSerializedState* state) { diff --git a/src/gba/audio.c b/src/gba/audio.c index 5d7dd347b..226fa7c25 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -506,6 +506,16 @@ void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* void GBAAudioDeserialize(struct GBAAudio* audio, const struct GBASerializedState* state) { GBAudioPSGDeserialize(&audio->psg, &state->audio.psg, &state->audio.flags); + uint16_t reg; + LOAD_16(reg, REG_SOUND1CNT_X, state->io); + GBAIOWrite(audio->p, REG_SOUND1CNT_X, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND2CNT_HI, state->io); + GBAIOWrite(audio->p, REG_SOUND2CNT_HI, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND3CNT_X, state->io); + GBAIOWrite(audio->p, REG_SOUND3CNT_X, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND4CNT_HI, state->io); + GBAIOWrite(audio->p, REG_SOUND4CNT_HI, reg & 0x7FFF); + LOAD_32(audio->chA.internalSample, 0, &state->audio.internalA); LOAD_32(audio->chB.internalSample, 0, &state->audio.internalB); memcpy(audio->chA.samples, state->samples.chA, sizeof(audio->chA.samples)); diff --git a/src/gba/io.c b/src/gba/io.c index ca0cbe5b5..4648c9833 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -296,8 +296,8 @@ static const int _isWSpecialRegister[REG_INTERNAL_MAX >> 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Audio - 1, 1, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,