Amiga: acquireDirect, part 2
the filter is back!
This commit is contained in:
parent
e116f2e523
commit
e941dfb174
5 changed files with 85 additions and 44 deletions
|
|
@ -26,8 +26,6 @@
|
|||
#include "../ta-log.h"
|
||||
#include <math.h>
|
||||
|
||||
constexpr int MASTER_CLOCK_PREC=(sizeof(void*)==8)?8:0;
|
||||
|
||||
void DivEngine::nextOrder() {
|
||||
curRow=0;
|
||||
if (repeatPattern) return;
|
||||
|
|
@ -992,7 +990,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
|||
case 0xc0: case 0xc1: case 0xc2: case 0xc3: // set Hz
|
||||
divider=(double)(((effect&0x3)<<8)|effectVal);
|
||||
if (divider<1) divider=1;
|
||||
cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/divider;
|
||||
cycles=got.rate/divider;
|
||||
clockDrift=0;
|
||||
subticks=0;
|
||||
break;
|
||||
|
|
@ -1146,7 +1144,7 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
|||
case 0xf0: // set Hz by tempo
|
||||
divider=(double)effectVal*2.0/5.0;
|
||||
if (divider<1) divider=1;
|
||||
cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/divider;
|
||||
cycles=got.rate/divider;
|
||||
clockDrift=0;
|
||||
subticks=0;
|
||||
break;
|
||||
|
|
@ -1551,8 +1549,8 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
|||
tickMult=1;
|
||||
}
|
||||
|
||||
cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/(divider*tickMult);
|
||||
clockDrift+=fmod(got.rate*pow(2,MASTER_CLOCK_PREC),(double)(divider*tickMult));
|
||||
cycles=got.rate/(divider*tickMult);
|
||||
clockDrift+=fmod(got.rate,(double)(divider*tickMult));
|
||||
if (clockDrift>=(divider*tickMult)) {
|
||||
clockDrift-=(divider*tickMult);
|
||||
cycles++;
|
||||
|
|
@ -2027,7 +2025,7 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) {
|
|||
}
|
||||
|
||||
int DivEngine::getBufferPos() {
|
||||
return bufferPos>>MASTER_CLOCK_PREC;
|
||||
return bufferPos;
|
||||
}
|
||||
|
||||
void DivEngine::runMidiClock(int totalCycles) {
|
||||
|
|
@ -2053,10 +2051,10 @@ void DivEngine::runMidiClock(int totalCycles) {
|
|||
if (vD<1) vD=1;
|
||||
double bpm=((24.0*divider)/(timeBase*hl*speedSum))*(double)virtualTempoN/vD;
|
||||
if (bpm<1.0) bpm=1.0;
|
||||
int increment=got.rate*pow(2,MASTER_CLOCK_PREC)/(bpm);
|
||||
int increment=got.rate/(bpm);
|
||||
|
||||
midiClockCycles+=increment;
|
||||
midiClockDrift+=fmod(got.rate*pow(2,MASTER_CLOCK_PREC),(double)(bpm));
|
||||
midiClockDrift+=fmod(got.rate,(double)(bpm));
|
||||
if (midiClockDrift>=(bpm)) {
|
||||
midiClockDrift-=(bpm);
|
||||
midiClockCycles++;
|
||||
|
|
@ -2164,8 +2162,8 @@ void DivEngine::runMidiTime(int totalCycles) {
|
|||
}
|
||||
curMidiTimePiece=(curMidiTimePiece+1)&7;
|
||||
|
||||
midiTimeCycles+=got.rate*pow(2,MASTER_CLOCK_PREC)/(frameRate);
|
||||
midiTimeDrift+=fmod(got.rate*pow(2,MASTER_CLOCK_PREC),(double)(frameRate));
|
||||
midiTimeCycles+=got.rate/(frameRate);
|
||||
midiTimeDrift+=fmod(got.rate,(double)(frameRate));
|
||||
if (midiTimeDrift>=(frameRate)) {
|
||||
midiTimeDrift-=(frameRate);
|
||||
midiTimeCycles++;
|
||||
|
|
@ -2428,21 +2426,6 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
if (mustPlay) {
|
||||
// logic starts here
|
||||
for (int i=0; i<song.systemLen; i++) {
|
||||
// TODO: we may have a problem here
|
||||
disCont[i].lastAvail=blip_samples_avail(disCont[i].bb[0]);
|
||||
if (disCont[i].lastAvail>0) {
|
||||
disCont[i].flush(disCont[i].lastAvail);
|
||||
}
|
||||
if (size<disCont[i].lastAvail) {
|
||||
disCont[i].runtotal=0;
|
||||
} else {
|
||||
disCont[i].runtotal=blip_clocks_needed(disCont[i].bb[0],size-disCont[i].lastAvail);
|
||||
}
|
||||
if (disCont[i].runtotal>disCont[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;
|
||||
}
|
||||
|
||||
|
|
@ -2455,10 +2438,10 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
memset(metroTick,0,size);
|
||||
|
||||
int attempts=0;
|
||||
int runLeftG=size<<MASTER_CLOCK_PREC;
|
||||
int runLeftG=size;
|
||||
while (++attempts<(int)size) {
|
||||
// -1. set bufferPos
|
||||
bufferPos=(size<<MASTER_CLOCK_PREC)-runLeftG;
|
||||
bufferPos=size-runLeftG;
|
||||
|
||||
// 0. check if we've halted
|
||||
if (halted) break;
|
||||
|
|
@ -2471,7 +2454,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
if (nextTick()) {
|
||||
/*totalTicks=0;
|
||||
totalSeconds=0;*/
|
||||
lastLoopPos=size-(runLeftG>>MASTER_CLOCK_PREC);
|
||||
lastLoopPos=size-runLeftG;
|
||||
logD("last loop pos: %d for a size of %d and runLeftG of %d",lastLoopPos,size,runLeftG);
|
||||
totalLoops++;
|
||||
if (remainingLoops>0) {
|
||||
|
|
@ -2487,7 +2470,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
}
|
||||
}
|
||||
if (pendingMetroTick) {
|
||||
unsigned int realPos=size-(runLeftG>>MASTER_CLOCK_PREC);
|
||||
unsigned int realPos=size-runLeftG;
|
||||
if (realPos>=size) realPos=size-1;
|
||||
metroTick[realPos]=pendingMetroTick;
|
||||
pendingMetroTick=0;
|
||||
|
|
@ -2502,30 +2485,70 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
|
||||
// 5. tick the clock and fill buffers as needed
|
||||
if (cycles<runLeftG) {
|
||||
// run until the end of this tick
|
||||
for (int i=0; i<song.systemLen; i++) {
|
||||
disCont[i].cycles=cycles;
|
||||
disCont[i].size=size;
|
||||
renderPool->push([](void* d) {
|
||||
DivDispatchContainer* dc=(DivDispatchContainer*)d;
|
||||
int total=(dc->cycles*dc->runtotal)/(dc->size<<MASTER_CLOCK_PREC);
|
||||
dc->acquire(dc->runPos,total);
|
||||
dc->runLeft-=total;
|
||||
dc->runPos+=total;
|
||||
|
||||
int lastAvail=blip_samples_avail(dc->bb[0]);
|
||||
if (lastAvail>0) {
|
||||
if (lastAvail>=dc->cycles) {
|
||||
dc->flush(dc->runPos,dc->cycles);
|
||||
dc->runPos+=dc->cycles;
|
||||
return;
|
||||
} else {
|
||||
dc->flush(dc->runPos,lastAvail);
|
||||
dc->runPos+=lastAvail;
|
||||
dc->cycles-=lastAvail;
|
||||
}
|
||||
}
|
||||
|
||||
int total=blip_clocks_needed(dc->bb[0],dc->cycles);
|
||||
if (total>(int)dc->bbInLen) {
|
||||
logD("growing dispatch %p bbIn to %d",(void*)dc,total+256);
|
||||
dc->grow(total+256);
|
||||
}
|
||||
dc->acquire(0,total);
|
||||
dc->fillBuf(total,dc->runPos,dc->cycles);
|
||||
dc->runPos+=dc->cycles;
|
||||
},&disCont[i]);
|
||||
}
|
||||
renderPool->wait();
|
||||
runLeftG-=cycles;
|
||||
cycles=0;
|
||||
} else {
|
||||
// run until the end of this audio buffer
|
||||
cycles-=runLeftG;
|
||||
runLeftG=0;
|
||||
for (int i=0; i<song.systemLen; i++) {
|
||||
disCont[i].cycles=runLeftG;
|
||||
renderPool->push([](void* d) {
|
||||
DivDispatchContainer* dc=(DivDispatchContainer*)d;
|
||||
dc->acquire(dc->runPos,dc->runLeft);
|
||||
dc->runLeft=0;
|
||||
|
||||
int lastAvail=blip_samples_avail(dc->bb[0]);
|
||||
if (lastAvail>0) {
|
||||
if (lastAvail>=dc->cycles) {
|
||||
dc->flush(dc->runPos,dc->cycles);
|
||||
dc->runPos+=dc->cycles;
|
||||
return;
|
||||
} else {
|
||||
dc->flush(dc->runPos,lastAvail);
|
||||
dc->runPos+=lastAvail;
|
||||
dc->cycles-=lastAvail;
|
||||
}
|
||||
}
|
||||
|
||||
int total=blip_clocks_needed(dc->bb[0],dc->cycles);
|
||||
if (total>(int)dc->bbInLen) {
|
||||
logD("growing dispatch %p bbIn to %d",(void*)dc,total+256);
|
||||
dc->grow(total+256);
|
||||
}
|
||||
dc->acquire(0,total);
|
||||
dc->fillBuf(total,dc->runPos,dc->cycles);
|
||||
},&disCont[i]);
|
||||
}
|
||||
runLeftG=0;
|
||||
renderPool->wait();
|
||||
}
|
||||
}
|
||||
|
|
@ -2538,7 +2561,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
playing=false;
|
||||
extValuePresent=false;
|
||||
}
|
||||
totalProcessed=size-(runLeftG>>MASTER_CLOCK_PREC);
|
||||
totalProcessed=size-runLeftG;
|
||||
|
||||
for (int i=0; i<song.systemLen; i++) {
|
||||
if (size<disCont[i].lastAvail) {
|
||||
|
|
@ -2546,10 +2569,11 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
|||
continue;
|
||||
}
|
||||
disCont[i].size=size;
|
||||
/*
|
||||
renderPool->push([](void* d) {
|
||||
DivDispatchContainer* dc=(DivDispatchContainer*)d;
|
||||
dc->fillBuf(dc->runtotal,dc->lastAvail,dc->size-dc->lastAvail);
|
||||
},&disCont[i]);
|
||||
},&disCont[i]);*/
|
||||
}
|
||||
renderPool->wait();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue