PC Speaker: fix it
This commit is contained in:
parent
d935d3c6d1
commit
e94d99d79e
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue