From e94d99d79e78a97e5b7e0cb46c98aa1e28e5feb7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 26 Feb 2025 15:45:26 -0500 Subject: [PATCH] PC Speaker: fix it --- src/engine/platform/pcspkr.cpp | 37 ++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 675c670af0..bc55ae4021 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -194,31 +194,47 @@ const char** DivPlatformPCSpeaker::getRegisterSheet() { void DivPlatformPCSpeaker::acquire_unfilt(blip_buffer_t** bb, size_t off, size_t len) { int out=0; + int freq1=freq+1; + int timeToNextToggle=0; if (on) { // just in case + if (pos>freq1) { + pos=freq1; + } + if (pos>(freq>>1)) { + posToggle=true; + timeToNextToggle=pos-(freq>>1); + } else { + posToggle=false; + timeToNextToggle=pos; + } out=(posToggle && !isMuted[0])?32767:0; blip_add_delta(bb[0],off,out-oldOut); oldOut=out; if (freq>=1) { - if (pos>freq) pos=freq; size_t boff=off; size_t i=len; while (true) { - if ((int)i(freq>>1)) { + posToggle=true; + timeToNextToggle=pos-(freq>>1); + } else { + posToggle=false; + timeToNextToggle=pos; + } out=(posToggle && !isMuted[0])?32767:0; blip_add_delta(bb[0],boff,out-oldOut); oldOut=out; - if (freq&1) { - pos=(freq>>1)+(posToggle?1:0); - } else { - pos=freq>>1; - } } } } else { @@ -396,7 +412,6 @@ void DivPlatformPCSpeaker::tick(bool sysTick) { } if (freq!=chan[i].freq && resetPhase) { pos=0; - posToggle=false; } freq=chan[i].freq; if (chan[i].keyOn) chan[i].keyOn=false;