From b515214fbeed84fe5532740b10ac677d94fca2cb Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sat, 24 Dec 2016 18:33:45 -0800 Subject: [PATCH] GB Audio: Reoptimize channel 4 --- src/gb/audio.c | 24 +++++++++++++++--------- src/gba/audio.c | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/gb/audio.c b/src/gb/audio.c index 547ae49da..14f501096 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -873,15 +873,21 @@ static void _fadeChannel3(struct mTiming* timing, void* user, uint32_t cyclesLat static void _updateChannel4(struct mTiming* timing, void* user, uint32_t cyclesLate) { struct GBAudio* audio = user; struct GBAudioNoiseChannel* ch = &audio->ch4; - int lsb = ch->lfsr & 1; - ch->sample = lsb * 0x10 - 0x8; - ch->sample *= ch->envelope.currentVolume; - ch->lfsr >>= 1; - ch->lfsr ^= (lsb * 0x60) << (ch->power ? 0 : 8); - int cycles = ch->ratio ? 2 * ch->ratio : 1; - cycles <<= ch->frequency; - cycles *= 8; - mTimingSchedule(timing, &audio->ch4Event, audio->timingFactor * cycles - cyclesLate); + + int32_t baseCycles = ch->ratio ? 2 * ch->ratio : 1; + baseCycles <<= ch->frequency; + baseCycles *= 8 * audio->timingFactor; + int32_t cycles = 0; + + do { + int lsb = ch->lfsr & 1; + ch->sample = lsb * 0x10 - 0x8; + ch->sample *= ch->envelope.currentVolume; + ch->lfsr >>= 1; + ch->lfsr ^= (lsb * 0x60) << (ch->power ? 0 : 8); + cycles += baseCycles; + } while (cycles < audio->sampleInterval); + mTimingSchedule(timing, &audio->ch4Event, cycles - cyclesLate); } void GBAudioPSGSerialize(const struct GBAudio* audio, struct GBSerializedPSGState* state, uint32_t* flagsOut) { diff --git a/src/gba/audio.c b/src/gba/audio.c index 4194f3a78..9f01889ed 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -73,6 +73,7 @@ void GBAAudioReset(struct GBAAudio* audio) { audio->chBTimer = false; audio->enable = false; audio->sampleInterval = GBA_ARM7TDMI_FREQUENCY / audio->sampleRate; + audio->psg.sampleInterval = audio->sampleInterval; blip_clear(audio->psg.left); blip_clear(audio->psg.right);