PC speaker: fix chan osc in real output

This commit is contained in:
tildearrow 2025-03-26 14:01:22 -05:00
parent a3a0acd871
commit c9e48fb17b

View file

@ -332,31 +332,62 @@ void DivPlatformPCSpeaker::beepFreq(int freq, int delay) {
} }
void DivPlatformPCSpeaker::acquire_real(blip_buffer_t** bb, size_t len) { void DivPlatformPCSpeaker::acquire_real(blip_buffer_t** bb, size_t len) {
//int out=0;
if (lastOn!=on || lastFreq!=freq) { if (lastOn!=on || lastFreq!=freq) {
lastOn=on; lastOn=on;
lastFreq=freq; lastFreq=freq;
beepFreq((on && !isMuted[0])?freq:0,parent->getBufferPos()); beepFreq((on && !isMuted[0])?freq:0,parent->getBufferPos());
} }
// TODO: direct chanOsc API! int out=0;
/* int freq1=freq+1;
for (size_t i=0; i<len; i++) { int timeToNextToggle=0;
oscBuf->begin(len);
if (on) { if (on) {
pos-=PCSPKR_DIVIDER; // just in case
if (pos>freq) pos=freq; if (pos>freq1) {
while (pos<0) { pos=freq1;
if (freq<1) { }
pos=1; if (pos>(freq>>1)) {
posToggle=true;
timeToNextToggle=pos-(freq>>1);
} else { } else {
pos+=freq; posToggle=false;
timeToNextToggle=pos;
} }
out=(posToggle && !isMuted[0])?32767:0;
oscBuf->putSample(0,out);
oldOut=out;
if (freq>=1) {
size_t boff=0;
size_t i=len;
while (true) {
if ((int)i<timeToNextToggle) {
pos-=i;
break;
} }
out=(pos>(freq>>1) && !isMuted[0])?32767:0; i-=timeToNextToggle;
boff+=timeToNextToggle;
pos-=timeToNextToggle;
if (pos<=0) {
pos=freq1;
}
if (pos>(freq>>1)) {
posToggle=true;
timeToNextToggle=pos-(freq>>1);
} else { } else {
posToggle=false;
timeToNextToggle=pos;
} }
//buf[0][i]=0; out=(posToggle && !isMuted[0])?32767:0;
oscBuf->putSample(boff,out);
oldOut=out;
} }
*/ }
} else {
out=0;
oscBuf->putSample(0,out);
oldOut=out;
}
oscBuf->end(len);
} }
void DivPlatformPCSpeaker::acquire(short** buf, size_t len) { void DivPlatformPCSpeaker::acquire(short** buf, size_t len) {