From 46b59268d384f634078352e93ad6a39b7673e6de Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 2 Jun 2022 23:26:15 -0700 Subject: [PATCH] GB Audio: Optimize channel 4 --- src/gb/audio.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/gb/audio.c b/src/gb/audio.c index b1a3f68dd..7a1fe60bf 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -568,13 +568,24 @@ void GBAudioRun(struct GBAudio* audio, int32_t timestamp, int channels) { int32_t last = 0; int32_t diff = timestamp - audio->ch4.lastEvent; + int samples = 0; + int positiveSamples = 0; + int lsb; + int coeff = 0x60; + if (!audio->ch4.power) { + coeff <<= 8; + } for (; last + cycles <= diff; last += cycles) { - int lsb = audio->ch4.lfsr & 1; - audio->ch4.sample = lsb * audio->ch4.envelope.currentVolume; - ++audio->ch4.nSamples; - audio->ch4.samples += audio->ch4.sample; + lsb = audio->ch4.lfsr & 1; audio->ch4.lfsr >>= 1; - audio->ch4.lfsr ^= (lsb * 0x60) << (audio->ch4.power ? 0 : 8); + audio->ch4.lfsr ^= lsb * coeff; + ++samples; + positiveSamples += lsb; + } + if (samples) { + audio->ch4.sample = lsb * audio->ch4.envelope.currentVolume; + audio->ch4.nSamples += samples; + audio->ch4.samples += positiveSamples * audio->ch4.envelope.currentVolume; } audio->ch4.lastEvent += last;