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<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);
samp_prevSample=0;
sPreview.rate=rate;
sPreview.rate=rateOrig;
sPreview.pos=(sPreview.pBegin>=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 && rate<got.rate) {
sPreview.rateMul<<=1;
rate*=2.0;
}
blip_set_rates(samp_bb,rate,got.rate);
samp_prevSample=0;
sPreview.rate=rate;
sPreview.rate=rateOrig;
sPreview.pos=0;
sPreview.posSub=0;
sPreview.sample=-1;
sPreview.wave=wave;
sPreview.dir=false;

View File

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

View File

@ -1541,10 +1541,13 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
samp_temp=0;
} else {
samp_temp=s->data16[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;