PC Speaker: fix it

This commit is contained in:
tildearrow 2025-02-26 15:45:26 -05:00
parent d935d3c6d1
commit e94d99d79e

View file

@ -194,31 +194,47 @@ const char** DivPlatformPCSpeaker::getRegisterSheet() {
void DivPlatformPCSpeaker::acquire_unfilt(blip_buffer_t** bb, size_t off, size_t len) { void DivPlatformPCSpeaker::acquire_unfilt(blip_buffer_t** bb, size_t off, size_t len) {
int out=0; int out=0;
int freq1=freq+1;
int timeToNextToggle=0;
if (on) { if (on) {
// just in case // 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; out=(posToggle && !isMuted[0])?32767:0;
blip_add_delta(bb[0],off,out-oldOut); blip_add_delta(bb[0],off,out-oldOut);
oldOut=out; oldOut=out;
if (freq>=1) { if (freq>=1) {
if (pos>freq) pos=freq;
size_t boff=off; size_t boff=off;
size_t i=len; size_t i=len;
while (true) { while (true) {
if ((int)i<pos) { if ((int)i<timeToNextToggle) {
pos-=i; pos-=i;
break; break;
} }
i-=pos; i-=timeToNextToggle;
boff+=pos; boff+=timeToNextToggle;
posToggle=!posToggle; pos-=timeToNextToggle;
if (pos<=0) {
pos=freq1;
}
if (pos>(freq>>1)) {
posToggle=true;
timeToNextToggle=pos-(freq>>1);
} else {
posToggle=false;
timeToNextToggle=pos;
}
out=(posToggle && !isMuted[0])?32767:0; out=(posToggle && !isMuted[0])?32767:0;
blip_add_delta(bb[0],boff,out-oldOut); blip_add_delta(bb[0],boff,out-oldOut);
oldOut=out; oldOut=out;
if (freq&1) {
pos=(freq>>1)+(posToggle?1:0);
} else {
pos=freq>>1;
}
} }
} }
} else { } else {
@ -396,7 +412,6 @@ void DivPlatformPCSpeaker::tick(bool sysTick) {
} }
if (freq!=chan[i].freq && resetPhase) { if (freq!=chan[i].freq && resetPhase) {
pos=0; pos=0;
posToggle=false;
} }
freq=chan[i].freq; freq=chan[i].freq;
if (chan[i].keyOn) chan[i].keyOn=false; if (chan[i].keyOn) chan[i].keyOn=false;