From 10e60ec8c1e5b2b435ccdb4b070f88f0374b1978 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 1 Mar 2025 17:22:34 -0500 Subject: [PATCH] new chan osc, part 2 why is it jerky? --- src/engine/dispatch.h | 9 +++++---- src/engine/platform/pcspkr.cpp | 2 +- src/gui/chanOsc.cpp | 15 ++++++++++----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 91f430b4b..5c17d5f1b 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -439,7 +439,6 @@ struct DivDispatchOscBuffer { bool follow; short data[65536]; - // TODO: all of this inline void putSample(uintmax_t pos, short val) { unsigned short realPos=needle+((needleSub+pos*rateMul)>>OSCBUF_PREC); if (val==-1) { @@ -454,8 +453,10 @@ struct DivDispatchOscBuffer { unsigned short start=needle; unsigned short end=needle+calc; + //logD("C %d %d %d",len,calc,rate); + if (end=(OSCBUF_MASK+1UL)) { - needle++; + if (((calc&OSCBUF_MASK)+needleSub)>OSCBUF_MASK) { + calc+=1UL<>OSCBUF_PREC; diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index a41a18ead..1dec2dbdd 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -211,7 +211,7 @@ void DivPlatformPCSpeaker::acquire_unfilt(blip_buffer_t** bb, size_t off, size_t } out=(posToggle && !isMuted[0])?32767:0; blip_add_delta(bb[0],off,out-oldOut); - oscBuf->data[oscBuf->needle++]=out; + oscBuf->putSample(0,out); oldOut=out; if (freq>=1) { size_t boff=off; diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index ededa8646..127337d4f 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -474,9 +474,10 @@ void FurnaceGUI::drawChanOsc() { short lastSample=0; memset(fft->inBuf,0,FURNACE_FFT_SIZE*sizeof(double)); if (displaySize2data[(unsigned short)(fft->needle-displaySize2+((j*displaySize2)/(FURNACE_FFT_SIZE)))]; if (newData!=-1) lastSample=newData; + if (j<0) continue; fft->inBuf[j]=(double)lastSample/32768.0; if (fft->inBuf[j]>0.001 || fft->inBuf[j]<-0.001) fft->loudEnough=true; fft->inBuf[j]*=0.55-0.45*cos(M_PI*(double)j/(double)(FURNACE_FFT_SIZE>>1)); @@ -693,17 +694,19 @@ void FurnaceGUI::drawChanOsc() { } } } else { - String dStr=fmt::sprintf("DS: %d P: %d",displaySize,precision); + String dStr=fmt::sprintf("DS: %d P: %d\nMAX: %d",displaySize,precision,(short)((fft->needle+displaySize)-fft->relatedBuf->needle)); dl->AddText(inRect.Min,0xffffffff,dStr.c_str()); if (displaySizedata[(unsigned short)(fft->needle+(j*displaySize/precision))]; if (y_s!=-1) { y=(float)y_s/32768.0f; + if (j<0) continue; if (minLevel>y) minLevel=y; if (maxLevel0.5f) yOut=0.5f; @@ -712,16 +715,18 @@ void FurnaceGUI::drawChanOsc() { } } else { float y=0; - int k=0; - for (unsigned short j=fft->needle; j!=fft->needle+displaySize; j++, k++) { + int k=-2048; + for (unsigned short j=fft->needle-2048; j!=fft->needle+displaySize; j++, k++) { const short y_s=buf->data[j]; const int kTex=(k*precision)/displaySize; if (kTex>=precision) break; if (y_s!=-1) { y=(float)y_s/32768.0f; + if (k<0) continue; if (minLevel>y) minLevel=y; if (maxLevel0.5f) yOut=0.5f;