diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index ca09d400b..69f49c12b 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -424,15 +424,14 @@ struct DivSamplePos { freq(0) {} }; -constexpr size_t OSCBUF_PREC=(sizeof(size_t)>=8)?32:16; +constexpr size_t OSCBUF_PREC=(sizeof(size_t)>=8)?16:16; constexpr size_t OSCBUF_MASK=(UINTMAX_C(1)<>OSCBUF_PREC); + unsigned short realPos=((needle+pos*rateMul)>>OSCBUF_PREC); if (val==-1) { data[realPos]=0xfffe; return; } - lastSample=val; + //lastSample=val; data[realPos]=val; } inline void begin(unsigned short len) { - size_t calc=(needleSub+len*rateMul)>>OSCBUF_PREC; - unsigned short start=needle; - unsigned short end=needle+calc; + size_t calc=(len*rateMul); + unsigned short start=needle>>16; + unsigned short end=(needle+calc)>>16; //logD("C %d %d %d",len,calc,rate); @@ -459,27 +458,22 @@ struct DivDispatchOscBuffer { //logE("ELS %d %d %d",end,start,calc); memset(&data[start],-1,(0x10000-start)*sizeof(short)); memset(data,-1,end*sizeof(short)); - data[needle]=lastSample; + //data[needle>>16]=lastSample; return; } - memset(&data[start],-1,calc*sizeof(short)); - data[needle]=lastSample; + memset(&data[start],-1,(end-start)*sizeof(short)); + //data[needle>>16]=lastSample; } inline void end(unsigned short len) { size_t calc=len*rateMul; - if (((calc&OSCBUF_MASK)+needleSub)>OSCBUF_MASK) { - calc+=UINTMAX_C(1)<>OSCBUF_PREC; - data[needle]=lastSample; + needle+=calc; + //data[needle>>16]=lastSample; } void reset() { memset(data,-1,65536*sizeof(short)); needle=0; readNeedle=0; followNeedle=0; - needleSub=0; lastSample=0; } void setRate(unsigned int r) { @@ -491,7 +485,6 @@ struct DivDispatchOscBuffer { DivDispatchOscBuffer(): rate(65536), rateMul(UINTMAX_C(1)<isRunning()) { short minLevel=32767; short maxLevel=-32768; - unsigned short needlePos=buf->needle; + unsigned short needlePos=buf->needle>>16; for (unsigned short i=needlePos-displaySize; i!=needlePos; i++) { short y=buf->data[i]; if (y==-1) continue; @@ -421,7 +421,7 @@ void FurnaceGUI::drawChanOsc() { if (fft_->relatedBuf!=NULL) { // prepare if (centerSettingReset) { - fft_->relatedBuf->readNeedle=fft_->relatedBuf->needle; + fft_->relatedBuf->readNeedle=fft_->relatedBuf->needle>>16; } // check FFT status existence @@ -465,7 +465,7 @@ void FurnaceGUI::drawChanOsc() { int displaySize=65536.0f*(fft->windowSize/1000.0f); int displaySize2=65536.0f*(fft->windowSize/500.0f); fft->loudEnough=false; - fft->needle=buf->needle; + fft->needle=buf->needle>>16; // first FFT int k=0;