From 1c41e1e051803344f1e854f4da23c9cfa470f60b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 19 Jun 2023 22:32:27 -0700 Subject: [PATCH] GBA Audio: Fix sample timing drifting when changing sample interval --- CHANGES | 1 + src/gba/audio.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 3dd20b6c3..189ca1c3b 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ Emulation fixes: - GB Serialize: Add missing Pocket Cam state to savestates - GB SIO: Disabling SIO should cancel pending transfers (fixes mgba.io/i/2537) - GB Video: Implement DMG-style sprite ordering + - GBA Audio: Fix sample timing drifting when changing sample interval - GBA BIOS: Fix clobbering registers with word-sized CpuSet - GBA Video: Disable BG target 1 blending when OBJ blending (fixes mgba.io/i/2722) Other fixes: diff --git a/src/gba/audio.c b/src/gba/audio.c index 9cbf1dc24..ed4ea8474 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -253,11 +253,16 @@ void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value) { + GBAAudioSample(audio, mTimingCurrentTime(&audio->p->timing)); audio->soundbias = value; int32_t oldSampleInterval = audio->sampleInterval; audio->sampleInterval = 0x200 >> GBARegisterSOUNDBIASGetResolution(value); - if (oldSampleInterval != audio->sampleInterval && audio->p->stream && audio->p->stream->audioRateChanged) { - audio->p->stream->audioRateChanged(audio->p->stream, GBA_ARM7TDMI_FREQUENCY / audio->sampleInterval); + if (oldSampleInterval != audio->sampleInterval) { + audio->lastSample += oldSampleInterval * audio->sampleIndex; + audio->sampleIndex = 0; + if (audio->p->stream && audio->p->stream->audioRateChanged) { + audio->p->stream->audioRateChanged(audio->p->stream, GBA_ARM7TDMI_FREQUENCY / audio->sampleInterval); + } } }