From 01f6e8f9636d0a41303b91b4272434ce070af569 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 12 Jan 2023 03:31:43 -0500 Subject: [PATCH] make patchbay effective on samplepreview/metronome --- src/engine/engine.cpp | 8 ++ src/engine/engine.h | 4 + src/engine/playback.cpp | 273 ++++++++++++++++++++-------------------- 3 files changed, 148 insertions(+), 137 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 6ab8f6480..f35afd424 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4435,6 +4435,9 @@ bool DivEngine::init() { samp_bbIn=new short[32768]; samp_bbInLen=32768; + + metroBuf=new float[8192]; + metroBufLen=8192; blip_set_rates(samp_bb,44100,got.rate); @@ -4480,6 +4483,11 @@ bool DivEngine::quit() { for (int i=0; i=0 && sPreview.sample<(int)song.sample.size()) || (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size()))) { + if ((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); if (prevAvail>size) prevAvail=size; @@ -1590,134 +1590,144 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi blip_end_frame(samp_bb,prevtotal); blip_read_samples(samp_bb,samp_bbOut+samp_bbOff,size-samp_bbOff,0); - for (size_t i=0; i0) { + disCont[i].flush(disCont[i].lastAvail); + } + if (sizedisCont[i].bbInLen) { + logD("growing dispatch %d bbIn to %d",i,disCont[i].runtotal+256); + disCont[i].grow(disCont[i].runtotal+256); + } + disCont[i].runLeft=disCont[i].runtotal; + disCont[i].runPos=0; + } + + if (metroTickLen>MASTER_CLOCK_PREC); + logD("last loop pos: %d for a size of %d and runLeftG of %d",lastLoopPos,size,runLeftG); + totalLoops++; + if (remainingLoops>0) { + remainingLoops--; + if (!remainingLoops) { + logI("end of song!"); + remainingLoops=-1; + playing=false; + freelance=false; + extValuePresent=false; + break; + } + } } - if (++oscWritePos>=32768) oscWritePos=0; - } - oscSize=size; - } - isBusy.unlock(); - return; - } - - // logic starts here - for (int i=0; i0) { - disCont[i].flush(disCont[i].lastAvail); - } - if (sizedisCont[i].bbInLen) { - logD("growing dispatch %d bbIn to %d",i,disCont[i].runtotal+256); - disCont[i].grow(disCont[i].runtotal+256); - } - disCont[i].runLeft=disCont[i].runtotal; - disCont[i].runPos=0; - } - - if (metroTickLen>MASTER_CLOCK_PREC); - logD("last loop pos: %d for a size of %d and runLeftG of %d",lastLoopPos,size,runLeftG); - totalLoops++; - if (remainingLoops>0) { - remainingLoops--; - if (!remainingLoops) { - logI("end of song!"); - remainingLoops=-1; - playing=false; - freelance=false; - extValuePresent=false; - break; + if (pendingMetroTick) { + unsigned int realPos=size-(runLeftG>>MASTER_CLOCK_PREC); + if (realPos>=size) realPos=size-1; + metroTick[realPos]=pendingMetroTick; + pendingMetroTick=0; + } + } else { + // 3. tick the clock and fill buffers as needed + if (cycles>MASTER_CLOCK_PREC); - if (realPos>=size) realPos=size-1; - metroTick[realPos]=pendingMetroTick; - pendingMetroTick=0; - } - } else { - // 3. tick the clock and fill buffers as needed - if (cycles=(int)size) { + logE("hang detected! stopping! at %d seconds %d micro",totalSeconds,totalTicks); + freelance=false; + playing=false; + extValuePresent=false; + } + totalProcessed=size-(runLeftG>>MASTER_CLOCK_PREC); + + for (int i=0; i=(int)size) { - logE("hang detected! stopping! at %d seconds %d micro",totalSeconds,totalTicks); - freelance=false; - playing=false; - extValuePresent=false; - } - totalProcessed=size-(runLeftG>>MASTER_CLOCK_PREC); + memset(metroBuf,0,metroBufLen*sizeof(float)); - for (int i=0; i0.0f) { + for (int j=0; j=1) metroPos--; } - disCont[i].fillBuf(disCont[i].runtotal,disCont[i].lastAvail,size-disCont[i].lastAvail); } // resolve patchbay @@ -1738,7 +1748,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi if (destSubPort>=outChans) continue; // chip outputs - if (srcPortSetgetOutputCount()) { float vol=song.systemVol[srcPortSet]*disCont[srcPortSet].dispatch->getPostAmp()*song.masterVol; @@ -1761,6 +1771,16 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi out[destSubPort][j]+=((float)disCont[srcPortSet].bbOut[srcSubPort][j]/32768.0)*vol; } } + } else if (srcPortSet==0xffd) { + // sample preview + for (size_t j=0; j0.0f) { - for (int j=0; j=1) metroPos--; - } - for (unsigned int i=0; i