diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 847824fd..12fe249f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2668,10 +2668,17 @@ void DivEngine::previewSampleNoLock(int sample, int note, int pStart, int pEnd) if (rate<=0) rate=song.sample[sample]->centerRate; } if (rate<100) rate=100; + double rateOrig=rate; + sPreview.rateMul=1; + while (sPreview.rateMul<0x40000000 && rate=0)?sPreview.pBegin:0; + sPreview.posSub=0; sPreview.sample=sample; sPreview.wave=-1; sPreview.dir=false; @@ -2696,10 +2703,17 @@ void DivEngine::previewWaveNoLock(int wave, int note) { blip_clear(samp_bb); double rate=song.wave[wave]->len*((song.tuning*0.0625)*pow(2.0,(double)(note+3)/12.0)); if (rate<100) rate=100; + double rateOrig=rate; + sPreview.rateMul=1; + while (sPreview.rateMul<0x40000000 && ratedata16[sPreview.pos]; - if (sPreview.dir) { - sPreview.pos--; - } else { - sPreview.pos++; + if (--sPreview.posSub<=0) { + sPreview.posSub=sPreview.rateMul; + if (sPreview.dir) { + sPreview.pos--; + } else { + sPreview.pos++; + } } } blip_add_delta(samp_bb,i,samp_temp-samp_prevSample); @@ -1649,8 +1652,11 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi } else { samp_temp=((MIN(wave->data[sPreview.pos],wave->max)<<14)/wave->max)-8192; } - if (++sPreview.pos>=wave->len) { - sPreview.pos=0; + if (--sPreview.posSub<=0) { + sPreview.posSub=sPreview.rateMul; + if (++sPreview.pos>=wave->len) { + sPreview.pos=0; + } } blip_add_delta(samp_bb,i,samp_temp-samp_prevSample); samp_prevSample=samp_temp;