blip_buf clock<rate bug workaround, part 3

issue #1055
This commit is contained in:
tildearrow 2023-04-16 14:41:12 -05:00
parent 73204b5378
commit a10d5cb96b
2 changed files with 32 additions and 5 deletions

View File

@ -147,7 +147,24 @@ void DivDispatchContainer::grow(size_t size) {
void DivDispatchContainer::acquire(size_t offset, size_t count) {
CHECK_MISSING_BUFS;
if (rateMul) {
//logV("req: from %d to %d",offset,offset+count-1);
offset+=runPosSub;
size_t oldCount=count;
runPosSub=(runPosSub+oldCount)&((1<<rateMul)-1);
count+=runPosSub;
offset>>=rateMul;
count>>=rateMul;
if (offset!=0 && offset!=lastCount) {
logW("Shit!");
}
lastCount=offset+count;
logV("got: from %d to %d",offset,offset+count-1);
}
for (int i=0; i<DIV_MAX_OUTPUTS; i++) {
if (i>=outs) {
@ -189,7 +206,7 @@ void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size)
if (bbIn[i]==NULL) continue;
if (bb[i]==NULL) continue;
int s=0;
for (size_t j=0; j<runtotal; j+=step) {
for (size_t j=fillSub; j<runtotal; j+=step) {
temp[i]=bbIn[i][s++];
blip_add_delta_fast(bb[i],j,temp[i]-prevSample[i]);
prevSample[i]=temp[i];
@ -200,7 +217,7 @@ void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size)
if (bbIn[i]==NULL) continue;
if (bb[i]==NULL) continue;
int s=0;
for (size_t j=0; j<runtotal; j+=step) {
for (size_t j=fillSub; j<runtotal; j+=step) {
temp[i]=bbIn[i][s++];
blip_add_delta(bb[i],j,temp[i]-prevSample[i]);
prevSample[i]=temp[i];
@ -208,6 +225,10 @@ void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size)
}
}
if (rateMul) {
fillSub=(fillSub+runtotal)&((1<<rateMul)-1);
}
for (int i=0; i<outs; i++) {
if (bbOut[i]==NULL) continue;
if (bb[i]==NULL) continue;
@ -228,6 +249,10 @@ void DivDispatchContainer::clear() {
prevSample[i]=0;
}
runPosSub=0;
fillSub=0;
lastCount=0;
if (dispatch->getDCOffRequired()) {
dcOffCompensation=true;
}

View File

@ -184,13 +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;
unsigned char rateMul, runPosSub, fillSub;
double rateMemory;
void setRates(double gotRate);
@ -209,10 +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));