blip_buf clock<rate bug workaround, part 1

issue #1055
now I gotta think of a strategy for dispatch
This commit is contained in:
tildearrow 2023-04-13 18:11:10 -05:00
parent 5b154c2ddf
commit f1c6cd5097
3 changed files with 31 additions and 8 deletions

View File

@ -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<=0) rate=song.sample[sample]->centerRate;
} }
if (rate<100) rate=100; if (rate<100) rate=100;
double rateOrig=rate;
sPreview.rateMul=1;
while (sPreview.rateMul<0x40000000 && rate<got.rate) {
sPreview.rateMul<<=1;
rate*=2.0;
}
blip_set_rates(samp_bb,rate,got.rate); blip_set_rates(samp_bb,rate,got.rate);
samp_prevSample=0; samp_prevSample=0;
sPreview.rate=rate; sPreview.rate=rateOrig;
sPreview.pos=(sPreview.pBegin>=0)?sPreview.pBegin:0; sPreview.pos=(sPreview.pBegin>=0)?sPreview.pBegin:0;
sPreview.posSub=0;
sPreview.sample=sample; sPreview.sample=sample;
sPreview.wave=-1; sPreview.wave=-1;
sPreview.dir=false; sPreview.dir=false;
@ -2696,10 +2703,17 @@ void DivEngine::previewWaveNoLock(int wave, int note) {
blip_clear(samp_bb); blip_clear(samp_bb);
double rate=song.wave[wave]->len*((song.tuning*0.0625)*pow(2.0,(double)(note+3)/12.0)); double rate=song.wave[wave]->len*((song.tuning*0.0625)*pow(2.0,(double)(note+3)/12.0));
if (rate<100) rate=100; if (rate<100) rate=100;
double rateOrig=rate;
sPreview.rateMul=1;
while (sPreview.rateMul<0x40000000 && rate<got.rate) {
sPreview.rateMul<<=1;
rate*=2.0;
}
blip_set_rates(samp_bb,rate,got.rate); blip_set_rates(samp_bb,rate,got.rate);
samp_prevSample=0; samp_prevSample=0;
sPreview.rate=rate; sPreview.rate=rateOrig;
sPreview.pos=0; sPreview.pos=0;
sPreview.posSub=0;
sPreview.sample=-1; sPreview.sample=-1;
sPreview.wave=wave; sPreview.wave=wave;
sPreview.dir=false; sPreview.dir=false;

View File

@ -414,6 +414,7 @@ class DivEngine {
int wave; int wave;
int pos; int pos;
int pBegin, pEnd; int pBegin, pEnd;
int rateMul, posSub;
bool dir; bool dir;
SamplePreview(): SamplePreview():
rate(0.0), rate(0.0),
@ -422,6 +423,8 @@ class DivEngine {
pos(0), pos(0),
pBegin(-1), pBegin(-1),
pEnd(-1), pEnd(-1),
rateMul(1),
posSub(0),
dir(false) {} dir(false) {}
} sPreview; } sPreview;

View File

@ -1541,10 +1541,13 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
samp_temp=0; samp_temp=0;
} else { } else {
samp_temp=s->data16[sPreview.pos]; samp_temp=s->data16[sPreview.pos];
if (sPreview.dir) { if (--sPreview.posSub<=0) {
sPreview.pos--; sPreview.posSub=sPreview.rateMul;
} else { if (sPreview.dir) {
sPreview.pos++; sPreview.pos--;
} else {
sPreview.pos++;
}
} }
} }
blip_add_delta(samp_bb,i,samp_temp-samp_prevSample); 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 { } else {
samp_temp=((MIN(wave->data[sPreview.pos],wave->max)<<14)/wave->max)-8192; samp_temp=((MIN(wave->data[sPreview.pos],wave->max)<<14)/wave->max)-8192;
} }
if (++sPreview.pos>=wave->len) { if (--sPreview.posSub<=0) {
sPreview.pos=0; sPreview.posSub=sPreview.rateMul;
if (++sPreview.pos>=wave->len) {
sPreview.pos=0;
}
} }
blip_add_delta(samp_bb,i,samp_temp-samp_prevSample); blip_add_delta(samp_bb,i,samp_temp-samp_prevSample);
samp_prevSample=samp_temp; samp_prevSample=samp_temp;