diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index c30d7f231..b73aea2fd 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -86,9 +86,16 @@ void DivDispatchContainer::setRates(double gotRate) { int outs=dispatch->getOutputCount(); + int rate=dispatch->rate; + rateMul=0; + while (rateMul<8 && raterate,gotRate); + blip_set_rates(bb[i],rate,gotRate); } rateMemory=gotRate; } @@ -120,7 +127,13 @@ void DivDispatchContainer::grow(size_t size) { logE("not enough memory!"); \ return; \ } \ - blip_set_rates(bb[i],dispatch->rate,rateMemory); \ + int rate=dispatch->rate; \ + rateMul=0; \ + while (rateMul<8 && rate>=rateMul; + count>>=rateMul; + + if (offset!=0 && offset!=lastCount) { + logW("Shit! %d %d",offset,lastCount); + } + + lastCount=offset+count; + + //logV("got: from %d to %d",offset,offset+count-1); + } + for (int i=0; i=outs) { bbInMapped[i]=NULL; @@ -160,6 +192,8 @@ void DivDispatchContainer::flush(size_t count) { void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size) { CHECK_MISSING_BUFS; + int step=1<0) { dcOffCompensation=false; for (int i=0; igetDCOffRequired()) { dcOffCompensation=true; } diff --git a/src/engine/engine.h b/src/engine/engine.h index d31de903e..077daf5dc 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -184,12 +184,13 @@ struct DivNoteEvent { struct DivDispatchContainer { DivDispatch* dispatch; blip_buffer_t* bb[DIV_MAX_OUTPUTS]; - size_t bbInLen, runtotal, runLeft, runPos, lastAvail; + size_t bbInLen, runtotal, runLeft, runPos, lastAvail, lastCount; int temp[DIV_MAX_OUTPUTS], prevSample[DIV_MAX_OUTPUTS]; short* bbInMapped[DIV_MAX_OUTPUTS]; short* bbIn[DIV_MAX_OUTPUTS]; short* bbOut[DIV_MAX_OUTPUTS]; bool lowQuality, dcOffCompensation; + unsigned char rateMul, runPosSub, fillSub; double rateMemory; void setRates(double gotRate); @@ -208,8 +209,12 @@ struct DivDispatchContainer { runLeft(0), runPos(0), lastAvail(0), + lastCount(0), lowQuality(false), dcOffCompensation(false), + rateMul(0), + runPosSub(0), + fillSub(0), rateMemory(0.0) { memset(bb,0,DIV_MAX_OUTPUTS*sizeof(blip_buffer_t*)); memset(temp,0,DIV_MAX_OUTPUTS*sizeof(int));