diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index e885dbbb6..b38994ae4 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -31,7 +31,15 @@ void DivDispatchContainer::acquire(size_t offset, size_t count) { dispatch->acquire(bbIn[0],bbIn[1],offset,count); } -void DivDispatchContainer::fillBuf(size_t runtotal, size_t size) { +void DivDispatchContainer::flush(size_t count) { + blip_read_samples(bb[0],bbOut[0],count,0); + + if (dispatch->isStereo()) { + blip_read_samples(bb[1],bbOut[1],count,0); + } +} + +void DivDispatchContainer::fillBuf(size_t runtotal, size_t offset, size_t size) { if (lowQuality) { for (size_t i=0; i0) { + blip_read_samples(bb[0],bbOut[0]+offset,size,0); + /*if (totalRead<(int)size && totalRead>0) { for (size_t i=totalRead; iisStereo()) { blip_end_frame(bb[1],runtotal); - blip_read_samples(bb[1],bbOut[1],size,0); + blip_read_samples(bb[1],bbOut[1]+offset,size,0); } } diff --git a/src/engine/engine.h b/src/engine/engine.h index 3caa2d591..aa3dec8f2 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -114,7 +114,8 @@ struct DivDispatchContainer { void setRates(double gotRate); void setQuality(bool lowQual); void acquire(size_t offset, size_t count); - void fillBuf(size_t runtotal, size_t size); + void flush(size_t count); + void fillBuf(size_t runtotal, size_t offset, size_t size); void clear(); void init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, unsigned int flags); void quit(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index e8383d8d9..7721189e2 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -988,6 +988,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi } isBusy.lock(); + got.bufsize=size; + if (out!=NULL && ((sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) || (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size()))) { unsigned int samp_bbOff=0; unsigned int prevAvail=blip_samples_avail(samp_bb); @@ -1063,8 +1065,13 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi size_t runtotal[32]; size_t runLeft[32]; size_t runPos[32]; + size_t lastAvail[32]; for (int i=0; i0) { + disCont[i].flush(lastAvail[i]); + } + runtotal[i]=blip_clocks_needed(disCont[i].bb[0],size-lastAvail[i]); if (runtotal[i]>disCont[i].bbInLen) { delete disCont[i].bbIn[0]; delete disCont[i].bbIn[1]; @@ -1153,7 +1160,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi totalProcessed=size-(runLeftG>>MASTER_CLOCK_PREC); for (int i=0; i