blip_buf clock<rate bug workaround, part 1
issue #1055 now I gotta think of a strategy for dispatch
This commit is contained in:
parent
5b154c2ddf
commit
f1c6cd5097
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue