diff --git a/CHANGES b/CHANGES index f57d8dade..540b564a8 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 0.8.1: (Future) Emulation fixes: + - GB Serialize: Fix timing bug loading channel 4 timing - GBA Memory: Misaligned SRAM writes are ignored - GBA Serialize: Fix serializing DMA transfer register - GBA Serialize: Fix audio DMA timing deserialization diff --git a/src/gb/audio.c b/src/gb/audio.c index 63af6bc1a..4bc5fa351 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -1078,9 +1078,13 @@ void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGSt LOAD_32LE(audio->ch4.lastEvent, 0, &state->ch4.lastEvent); LOAD_32LE(when, 0, &state->ch4.nextEvent); if (audio->ch4.envelope.dead < 2 && audio->playingCh4) { - if (when - audio->ch4.lastEvent > (uint32_t) audio->sampleInterval) { + if (!audio->ch4.lastEvent) { // Back-compat: fake this value - audio->ch4.lastEvent = when - audio->sampleInterval; + uint32_t currentTime = mTimingCurrentTime(audio->timing); + int32_t cycles = audio->ch4.ratio ? 2 * audio->ch4.ratio : 1; + cycles <<= audio->ch4.frequency; + cycles *= 8 * audio->timingFactor; + audio->ch4.lastEvent = currentTime + (when & (cycles - 1)) - cycles; } mTimingSchedule(audio->timing, &audio->ch4Event, when); }