new chan osc, part 4

adapt dispatch code to it
This commit is contained in:
tildearrow 2025-03-01 19:49:56 -05:00
parent c0e4552c52
commit a16d20e190
18 changed files with 218 additions and 88 deletions

View file

@ -54,6 +54,10 @@ const char** DivPlatformArcade::getRegisterSheet() {
void DivPlatformArcade::acquire_nuked(short** buf, size_t len) { void DivPlatformArcade::acquire_nuked(short** buf, size_t len) {
thread_local int o[2]; thread_local int o[2];
for (int i=0; i<8; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
if (delay>0) delay--; if (delay>0) delay--;
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
@ -81,7 +85,7 @@ void DivPlatformArcade::acquire_nuked(short** buf, size_t len) {
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
int chOut=(int16_t)fm.ch_out[i]; int chOut=(int16_t)fm.ch_out[i];
oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(chOut<<1,-32768,32767); oscBuf[i]->putSample(h,CLAMP(chOut<<1,-32768,32767));
} }
if (o[0]<-32768) o[0]=-32768; if (o[0]<-32768) o[0]=-32768;
@ -93,6 +97,10 @@ void DivPlatformArcade::acquire_nuked(short** buf, size_t len) {
buf[0][h]=o[0]; buf[0][h]=o[0];
buf[1][h]=o[1]; buf[1][h]=o[1];
} }
for (int i=0; i<8; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) { void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) {
@ -100,6 +108,10 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) {
ymfm::ym2151::fm_engine* fme=fm_ymfm->debug_engine(); ymfm::ym2151::fm_engine* fme=fm_ymfm->debug_engine();
for (int i=0; i<8; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
os[0]=0; os[1]=0; os[0]=0; os[1]=0;
if (!writes.empty()) { if (!writes.empty()) {
@ -121,7 +133,7 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) {
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
int chOut=fme->debug_channel(i)->debug_output(0)+fme->debug_channel(i)->debug_output(1); int chOut=fme->debug_channel(i)->debug_output(0)+fme->debug_channel(i)->debug_output(1);
oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(chOut,-32768,32767); oscBuf[i]->putSample(h,CLAMP(chOut,-32768,32767));
} }
os[0]=out_ymfm.data[0]; os[0]=out_ymfm.data[0];
@ -135,6 +147,10 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) {
buf[0][h]=os[0]; buf[0][h]=os[0];
buf[1][h]=os[1]; buf[1][h]=os[1];
} }
for (int i=0; i<8; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformArcade::acquire(short** buf, size_t len) { void DivPlatformArcade::acquire(short** buf, size_t len) {
@ -964,7 +980,7 @@ void DivPlatformArcade::setFlags(const DivConfig& flags) {
rate=chipClock/64; rate=chipClock/64;
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -257,6 +257,10 @@ void DivPlatformAY8910::acquire_mame(short** buf, size_t len) {
} }
} }
for (int i=0; i<3; i++) {
oscBuf[i]->begin(len);
}
if (sunsoft) { if (sunsoft) {
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
runDAC(); runDAC();
@ -267,9 +271,9 @@ void DivPlatformAY8910::acquire_mame(short** buf, size_t len) {
buf[0][i]=ayBuf[0][0]; buf[0][i]=ayBuf[0][0];
buf[1][i]=buf[0][i]; buf[1][i]=buf[0][i];
oscBuf[0]->data[oscBuf[0]->needle++]=CLAMP(sunsoftVolTable[31-(ay->lastIndx&31)]<<3,-32768,32767); oscBuf[0]->putSample(i,CLAMP(sunsoftVolTable[31-(ay->lastIndx&31)]<<3,-32768,32767));
oscBuf[1]->data[oscBuf[1]->needle++]=CLAMP(sunsoftVolTable[31-((ay->lastIndx>>5)&31)]<<3,-32768,32767); oscBuf[1]->putSample(i,CLAMP(sunsoftVolTable[31-((ay->lastIndx>>5)&31)]<<3,-32768,32767));
oscBuf[2]->data[oscBuf[2]->needle++]=CLAMP(sunsoftVolTable[31-((ay->lastIndx>>10)&31)]<<3,-32768,32767); oscBuf[2]->putSample(i,CLAMP(sunsoftVolTable[31-((ay->lastIndx>>10)&31)]<<3,-32768,32767));
} }
} else { } else {
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
@ -286,14 +290,21 @@ void DivPlatformAY8910::acquire_mame(short** buf, size_t len) {
buf[1][i]=buf[0][i]; buf[1][i]=buf[0][i];
} }
oscBuf[0]->data[oscBuf[0]->needle++]=ayBuf[0][0]<<2; oscBuf[0]->putSample(i,ayBuf[0][0]<<2);
oscBuf[1]->data[oscBuf[1]->needle++]=ayBuf[1][0]<<2; oscBuf[1]->putSample(i,ayBuf[1][0]<<2);
oscBuf[2]->data[oscBuf[2]->needle++]=ayBuf[2][0]<<2; oscBuf[2]->putSample(i,ayBuf[2][0]<<2);
} }
} }
for (int i=0; i<3; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformAY8910::acquire_atomic(short** buf, size_t len) { void DivPlatformAY8910::acquire_atomic(short** buf, size_t len) {
for (int i=0; i<3; i++) {
oscBuf[i]->begin(len);
}
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
runDAC(); runDAC();
runTFX(); runTFX();
@ -316,9 +327,12 @@ void DivPlatformAY8910::acquire_atomic(short** buf, size_t len) {
buf[1][i]=buf[0][i]; buf[1][i]=buf[0][i];
} }
oscBuf[0]->data[oscBuf[0]->needle++]=ay_atomic.o_analog[0]; oscBuf[0]->putSample(i,ay_atomic.o_analog[0]);
oscBuf[1]->data[oscBuf[1]->needle++]=ay_atomic.o_analog[1]; oscBuf[1]->putSample(i,ay_atomic.o_analog[1]);
oscBuf[2]->data[oscBuf[2]->needle++]=ay_atomic.o_analog[2]; oscBuf[2]->putSample(i,ay_atomic.o_analog[2]);
}
for (int i=0; i<3; i++) {
oscBuf[i]->end(len);
} }
} }
@ -1154,7 +1168,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) {
} }
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
stereo=flags.getBool("stereo",false); stereo=flags.getBool("stereo",false);

View file

@ -173,6 +173,10 @@ void DivPlatformAY8930::acquire(short** buf, size_t len) {
} }
} }
for (int i=0; i<3; i++) {
oscBuf[i]->begin(len);
}
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
runDAC(); runDAC();
checkWrites(); checkWrites();
@ -186,9 +190,13 @@ void DivPlatformAY8930::acquire(short** buf, size_t len) {
buf[1][i]=buf[0][i]; buf[1][i]=buf[0][i];
} }
oscBuf[0]->data[oscBuf[0]->needle++]=ayBuf[0][0]<<2; oscBuf[0]->putSample(i,ayBuf[0][0]<<2);
oscBuf[1]->data[oscBuf[1]->needle++]=ayBuf[1][0]<<2; oscBuf[1]->putSample(i,ayBuf[1][0]<<2);
oscBuf[2]->data[oscBuf[2]->needle++]=ayBuf[2][0]<<2; oscBuf[2]->putSample(i,ayBuf[2][0]<<2);
}
for (int i=0; i<3; i++) {
oscBuf[i]->end(len);
} }
} }
@ -923,7 +931,7 @@ void DivPlatformAY8930::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/4; rate=chipClock/4;
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
stereo=flags.getBool("stereo",false); stereo=flags.getBool("stereo",false);

View file

@ -48,6 +48,9 @@ void DivPlatformBifurcator::acquire(short** buf, size_t len) {
chan[i].chVolL=regPool[i*8+6]; chan[i].chVolL=regPool[i*8+6];
chan[i].chVolR=regPool[i*8+7]; chan[i].chVolR=regPool[i*8+7];
} }
for (int i=0; i<4; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
int l=0; int l=0;
int r=0; int r=0;
@ -62,13 +65,16 @@ void DivPlatformBifurcator::acquire(short** buf, size_t len) {
int out=chan[i].curx-32768; int out=chan[i].curx-32768;
int outL=out*chan[i].chVolL/256; int outL=out*chan[i].chVolL/256;
int outR=out*chan[i].chVolR/256; int outR=out*chan[i].chVolR/256;
oscBuf[i]->data[oscBuf[i]->needle++]=(short)((outL+outR)/2); oscBuf[i]->putSample(h,(short)((outL+outR)/2));
l+=outL/4; l+=outL/4;
r+=outR/4; r+=outR/4;
} }
buf[0][h]=(short)l; buf[0][h]=(short)l;
buf[1][h]=(short)r; buf[1][h]=(short)r;
} }
for (int i=0; i<4; i++) {
oscBuf[i]->end(len);
}
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
regPool[i*8]=chan[i].curx&0xff; regPool[i*8]=chan[i].curx&0xff;
regPool[i*8+1]=chan[i].curx>>8; regPool[i*8+1]=chan[i].curx>>8;
@ -347,7 +353,7 @@ void DivPlatformBifurcator::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/16; rate=chipClock/16;
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -41,6 +41,9 @@ const char** DivPlatformBubSysWSG::getRegisterSheet() {
void DivPlatformBubSysWSG::acquire(short** buf, size_t len) { void DivPlatformBubSysWSG::acquire(short** buf, size_t len) {
int chanOut=0; int chanOut=0;
for (int i=0; i<2; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
signed int out=0; signed int out=0;
// K005289 part // K005289 part
@ -49,13 +52,13 @@ void DivPlatformBubSysWSG::acquire(short** buf, size_t len) {
// Wavetable part // Wavetable part
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
if (isMuted[i]) { if (isMuted[i]) {
oscBuf[i]->data[oscBuf[i]->needle++]=0; oscBuf[i]->putSample(h,0);
continue; continue;
} else { } else {
chanOut=chan[i].waveROM[k005289.addr(i)]*(regPool[2+i]&0xf); chanOut=chan[i].waveROM[k005289.addr(i)]*(regPool[2+i]&0xf);
out+=chanOut; out+=chanOut;
if (writeOscBuf==0) { if (writeOscBuf==0) {
oscBuf[i]->data[oscBuf[i]->needle++]=chanOut<<7; oscBuf[i]->putSample(h,chanOut<<7);
} }
} }
} }
@ -70,6 +73,9 @@ void DivPlatformBubSysWSG::acquire(short** buf, size_t len) {
//printf("out: %d\n",out); //printf("out: %d\n",out);
buf[0][h]=out; buf[0][h]=out;
} }
for (int i=0; i<2; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformBubSysWSG::updateWave(int ch) { void DivPlatformBubSysWSG::updateWave(int ch) {
@ -334,7 +340,7 @@ void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/coreQuality; rate=chipClock/coreQuality;
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->rate=rate/8; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -68,6 +68,9 @@ const char** DivPlatformC140::getRegisterSheet() {
} }
void DivPlatformC140::acquire_219(short** buf, size_t len) { void DivPlatformC140::acquire_219(short** buf, size_t len) {
for (int i=0; i<totalChans; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
while (!writes.empty()) { while (!writes.empty()) {
QueuedWrite w=writes.front(); QueuedWrite w=writes.front();
@ -92,15 +95,21 @@ void DivPlatformC140::acquire_219(short** buf, size_t len) {
for (int i=0; i<totalChans; i++) { for (int i=0; i<totalChans; i++) {
if (c219.voice[i].inv_lout) { if (c219.voice[i].inv_lout) {
oscBuf[i]->data[oscBuf[i]->needle++]=(c219.voice[i].lout-c219.voice[i].rout)>>10; oscBuf[i]->putSample(h,(c219.voice[i].lout-c219.voice[i].rout)>>10);
} else { } else {
oscBuf[i]->data[oscBuf[i]->needle++]=(c219.voice[i].lout+c219.voice[i].rout)>>10; oscBuf[i]->putSample(h,(c219.voice[i].lout+c219.voice[i].rout)>>10);
} }
} }
} }
for (int i=0; i<totalChans; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformC140::acquire_140(short** buf, size_t len) { void DivPlatformC140::acquire_140(short** buf, size_t len) {
for (int i=0; i<totalChans; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
while (!writes.empty()) { while (!writes.empty()) {
QueuedWrite w=writes.front(); QueuedWrite w=writes.front();
@ -124,9 +133,12 @@ void DivPlatformC140::acquire_140(short** buf, size_t len) {
buf[1][h]=c140.rout; buf[1][h]=c140.rout;
for (int i=0; i<totalChans; i++) { for (int i=0; i<totalChans; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=(c140.voice[i].lout+c140.voice[i].rout)>>10; oscBuf[i]->putSample(h,(c140.voice[i].lout+c140.voice[i].rout)>>10);
} }
} }
for (int i=0; i<totalChans; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformC140::acquire(short** buf, size_t len) { void DivPlatformC140::acquire(short** buf, size_t len) {
@ -752,7 +764,7 @@ void DivPlatformC140::setFlags(const DivConfig& flags) {
c140_bank_type(&c140,bankType); c140_bank_type(&c140,bankType);
} }
for (int i=0; i<totalChans; i++) { for (int i=0; i<totalChans; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -139,6 +139,9 @@ void DivPlatformC64::processDAC(int sRate) {
void DivPlatformC64::acquire(short** buf, size_t len) { void DivPlatformC64::acquire(short** buf, size_t len) {
int dcOff=(sidCore)?0:sid->get_dc(0); int dcOff=(sidCore)?0:sid->get_dc(0);
for (int i=0; i<4; i++) {
oscBuf[i]->begin(len);
}
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
// run PCM // run PCM
pcmCycle+=lineRate; pcmCycle+=lineRate;
@ -165,32 +168,35 @@ void DivPlatformC64::acquire(short** buf, size_t len) {
buf[0][i]=32767*CLAMP(o,-1.0,1.0); buf[0][i]=32767*CLAMP(o,-1.0,1.0);
if (++writeOscBuf>=4) { if (++writeOscBuf>=4) {
writeOscBuf=0; writeOscBuf=0;
oscBuf[0]->data[oscBuf[0]->needle++]=sid_d->lastOut[0]; oscBuf[0]->putSample(i,sid_d->lastOut[0]);
oscBuf[1]->data[oscBuf[1]->needle++]=sid_d->lastOut[1]; oscBuf[1]->putSample(i,sid_d->lastOut[1]);
oscBuf[2]->data[oscBuf[2]->needle++]=sid_d->lastOut[2]; oscBuf[2]->putSample(i,sid_d->lastOut[2]);
oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; oscBuf[3]->putSample(i,chan[3].pcmOut<<11);
} }
} else if (sidCore==1) { } else if (sidCore==1) {
sid_fp->clock(4,&buf[0][i]); sid_fp->clock(4,&buf[0][i]);
if (++writeOscBuf>=4) { if (++writeOscBuf>=4) {
writeOscBuf=0; writeOscBuf=0;
oscBuf[0]->data[oscBuf[0]->needle++]=runFakeFilter(0,(sid_fp->lastChanOut[0]-dcOff)>>5); oscBuf[0]->putSample(i,runFakeFilter(0,(sid_fp->lastChanOut[0]-dcOff)>>5));
oscBuf[1]->data[oscBuf[1]->needle++]=runFakeFilter(1,(sid_fp->lastChanOut[1]-dcOff)>>5); oscBuf[1]->putSample(i,runFakeFilter(1,(sid_fp->lastChanOut[1]-dcOff)>>5));
oscBuf[2]->data[oscBuf[2]->needle++]=runFakeFilter(2,(sid_fp->lastChanOut[2]-dcOff)>>5); oscBuf[2]->putSample(i,runFakeFilter(2,(sid_fp->lastChanOut[2]-dcOff)>>5));
oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; oscBuf[3]->putSample(i,chan[3].pcmOut<<11);
} }
} else { } else {
sid->clock(); sid->clock();
buf[0][i]=sid->output(); buf[0][i]=sid->output();
if (++writeOscBuf>=16) { if (++writeOscBuf>=16) {
writeOscBuf=0; writeOscBuf=0;
oscBuf[0]->data[oscBuf[0]->needle++]=runFakeFilter(0,(sid->last_chan_out[0]-dcOff)>>5); oscBuf[0]->putSample(i,runFakeFilter(0,(sid->last_chan_out[0]-dcOff)>>5));
oscBuf[1]->data[oscBuf[1]->needle++]=runFakeFilter(1,(sid->last_chan_out[1]-dcOff)>>5); oscBuf[1]->putSample(i,runFakeFilter(1,(sid->last_chan_out[1]-dcOff)>>5));
oscBuf[2]->data[oscBuf[2]->needle++]=runFakeFilter(2,(sid->last_chan_out[2]-dcOff)>>5); oscBuf[2]->putSample(i,runFakeFilter(2,(sid->last_chan_out[2]-dcOff)>>5));
oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; oscBuf[3]->putSample(i,chan[3].pcmOut<<11);
} }
} }
} }
for (int i=0; i<4; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformC64::updateFilter() { void DivPlatformC64::updateFilter() {
@ -913,7 +919,7 @@ void DivPlatformC64::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock; rate=chipClock;
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
oscBuf[i]->rate=rate/16; oscBuf[i]->setRate(rate);
} }
if (sidCore>0) { if (sidCore>0) {
rate/=(sidCore==2)?coreQuality:4; rate/=(sidCore==2)?coreQuality:4;
@ -930,15 +936,16 @@ void DivPlatformC64::setFlags(const DivConfig& flags) {
// init fake filter table // init fake filter table
// taken from dSID // taken from dSID
double cutRatio=-2.0*3.14*(sidIs6581?(((double)oscBuf[0]->rate/44100.0)*(20000.0/256.0)):(12500.0/256.0))/(double)oscBuf[0]->rate; double oscBufRate=(double)rate/16.0;
double cutRatio=-2.0*3.14*(sidIs6581?((oscBufRate/44100.0)*(20000.0/256.0)):(12500.0/256.0))/oscBufRate;
for (int i=0; i<2048; i++) { for (int i=0; i<2048; i++) {
double c=(double)i/8.0+0.2; double c=(double)i/8.0+0.2;
if (sidIs6581) { if (sidIs6581) {
if (c<24) { if (c<24) {
c=2.0*sin(771.78/(double)oscBuf[0]->rate); c=2.0*sin(771.78/oscBufRate);
} else { } else {
c=(44100.0/(double)oscBuf[0]->rate)-1.263*(44100.0/(double)oscBuf[0]->rate)*exp(c*cutRatio); c=(44100.0/oscBufRate)-1.263*(44100.0/oscBufRate)*exp(c*cutRatio);
} }
} else { } else {
c=1-exp(c*cutRatio); c=1-exp(c*cutRatio);

View file

@ -64,6 +64,10 @@ const char** DivPlatformDave::getRegisterSheet() {
} }
void DivPlatformDave::acquire(short** buf, size_t len) { void DivPlatformDave::acquire(short** buf, size_t len) {
for (int i=0; i<6; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
for (int i=4; i<6; i++) { for (int i=4; i<6; i++) {
if (chan[i].dacSample!=-1) { if (chan[i].dacSample!=-1) {
@ -107,38 +111,42 @@ void DivPlatformDave::acquire(short** buf, size_t len) {
unsigned short nextR=next>>16; unsigned short nextR=next>>16;
if ((regPool[7]&0x18)==0x18) { if ((regPool[7]&0x18)==0x18) {
oscBuf[0]->data[oscBuf[0]->needle++]=0; oscBuf[0]->putSample(h,0);
oscBuf[1]->data[oscBuf[1]->needle++]=0; oscBuf[1]->putSample(h,0);
oscBuf[2]->data[oscBuf[2]->needle++]=0; oscBuf[2]->putSample(h,0);
oscBuf[3]->data[oscBuf[3]->needle++]=0; oscBuf[3]->putSample(h,0);
oscBuf[4]->data[oscBuf[4]->needle++]=dave->chn0_left<<9; oscBuf[4]->putSample(h,dave->chn0_left<<9);
oscBuf[5]->data[oscBuf[5]->needle++]=dave->chn0_right<<9; oscBuf[5]->putSample(h,dave->chn0_right<<9);
} else if (regPool[7]&0x08) { } else if (regPool[7]&0x08) {
oscBuf[0]->data[oscBuf[0]->needle++]=dave->chn0_state?(dave->chn0_right<<8):0; oscBuf[0]->putSample(h,dave->chn0_state?(dave->chn0_right<<8):0);
oscBuf[1]->data[oscBuf[1]->needle++]=dave->chn1_state?(dave->chn1_right<<8):0; oscBuf[1]->putSample(h,dave->chn1_state?(dave->chn1_right<<8):0);
oscBuf[2]->data[oscBuf[2]->needle++]=dave->chn2_state?(dave->chn2_right<<8):0; oscBuf[2]->putSample(h,dave->chn2_state?(dave->chn2_right<<8):0);
oscBuf[3]->data[oscBuf[3]->needle++]=dave->chn3_state?(dave->chn3_right<<8):0; oscBuf[3]->putSample(h,dave->chn3_state?(dave->chn3_right<<8):0);
oscBuf[4]->data[oscBuf[4]->needle++]=dave->chn0_left<<9; oscBuf[4]->putSample(h,dave->chn0_left<<9);
oscBuf[5]->data[oscBuf[5]->needle++]=0; oscBuf[5]->putSample(h,0);
} else if (regPool[7]&0x10) { } else if (regPool[7]&0x10) {
oscBuf[0]->data[oscBuf[0]->needle++]=dave->chn0_state?(dave->chn0_left<<8):0; oscBuf[0]->putSample(h,dave->chn0_state?(dave->chn0_left<<8):0);
oscBuf[1]->data[oscBuf[1]->needle++]=dave->chn1_state?(dave->chn1_left<<8):0; oscBuf[1]->putSample(h,dave->chn1_state?(dave->chn1_left<<8):0);
oscBuf[2]->data[oscBuf[2]->needle++]=dave->chn2_state?(dave->chn2_left<<8):0; oscBuf[2]->putSample(h,dave->chn2_state?(dave->chn2_left<<8):0);
oscBuf[3]->data[oscBuf[3]->needle++]=dave->chn3_state?(dave->chn3_left<<8):0; oscBuf[3]->putSample(h,dave->chn3_state?(dave->chn3_left<<8):0);
oscBuf[4]->data[oscBuf[4]->needle++]=0; oscBuf[4]->putSample(h,0);
oscBuf[5]->data[oscBuf[5]->needle++]=dave->chn0_right<<9; oscBuf[5]->putSample(h,dave->chn0_right<<9);
} else { } else {
oscBuf[0]->data[oscBuf[0]->needle++]=dave->chn0_state?((dave->chn0_left+dave->chn0_right)<<8):0; oscBuf[0]->putSample(h,dave->chn0_state?((dave->chn0_left+dave->chn0_right)<<8):0);
oscBuf[1]->data[oscBuf[1]->needle++]=dave->chn1_state?((dave->chn1_left+dave->chn1_right)<<8):0; oscBuf[1]->putSample(h,dave->chn1_state?((dave->chn1_left+dave->chn1_right)<<8):0);
oscBuf[2]->data[oscBuf[2]->needle++]=dave->chn2_state?((dave->chn2_left+dave->chn2_right)<<8):0; oscBuf[2]->putSample(h,dave->chn2_state?((dave->chn2_left+dave->chn2_right)<<8):0);
oscBuf[3]->data[oscBuf[3]->needle++]=dave->chn3_state?((dave->chn3_left+dave->chn3_right)<<8):0; oscBuf[3]->putSample(h,dave->chn3_state?((dave->chn3_left+dave->chn3_right)<<8):0);
oscBuf[4]->data[oscBuf[4]->needle++]=0; oscBuf[4]->putSample(h,0);
oscBuf[5]->data[oscBuf[5]->needle++]=0; oscBuf[5]->putSample(h,0);
} }
buf[0][h]=(short)nextL; buf[0][h]=(short)nextL;
buf[1][h]=(short)nextR; buf[1][h]=(short)nextR;
} }
for (int i=0; i<6; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformDave::tick(bool sysTick) { void DivPlatformDave::tick(bool sysTick) {
@ -596,7 +604,7 @@ void DivPlatformDave::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/16; rate=chipClock/16;
for (int i=0; i<6; i++) { for (int i=0; i<6; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -26,26 +26,32 @@
void DivPlatformDummy::acquire(short** buf, size_t len) { void DivPlatformDummy::acquire(short** buf, size_t len) {
int chanOut; int chanOut;
for (int i=0; i<chans; i++) {
oscBuf[i]->begin(len);
}
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
int out=0; int out=0;
for (unsigned char j=0; j<chans; j++) { for (unsigned char j=0; j<chans; j++) {
if (chan[j].active) { if (chan[j].active) {
if (!isMuted[j]) { if (!isMuted[j]) {
chanOut=(((signed short)chan[j].pos)*chan[j].amp*chan[j].vol)>>12; chanOut=(((signed short)chan[j].pos)*chan[j].amp*chan[j].vol)>>12;
oscBuf[j]->data[oscBuf[j]->needle++]=chanOut<<1; oscBuf[j]->putSample(i,chanOut<<1);
out+=chanOut; out+=chanOut;
} else { } else {
oscBuf[j]->data[oscBuf[j]->needle++]=0; oscBuf[j]->putSample(i,0);
} }
chan[j].pos+=chan[j].freq; chan[j].pos+=chan[j].freq;
} else { } else {
oscBuf[j]->data[oscBuf[j]->needle++]=0; oscBuf[j]->putSample(i,0);
} }
} }
if (out<-32768) out=-32768; if (out<-32768) out=-32768;
if (out>32767) out=32767; if (out>32767) out=32767;
buf[0][i]=out; buf[0][i]=out;
} }
for (int i=0; i<chans; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformDummy::muteChannel(int ch, bool mute) { void DivPlatformDummy::muteChannel(int ch, bool mute) {
@ -150,7 +156,7 @@ int DivPlatformDummy::init(DivEngine* p, int channels, int sugRate, const DivCon
isMuted[i]=false; isMuted[i]=false;
if (i<channels) { if (i<channels) {
oscBuf[i]=new DivDispatchOscBuffer; oscBuf[i]=new DivDispatchOscBuffer;
oscBuf[i]->rate=65536; oscBuf[i]->setRate(65536);
} }
} }
rate=65536; rate=65536;

View file

@ -111,6 +111,9 @@ const char** DivPlatformES5506::getRegisterSheet() {
} }
void DivPlatformES5506::acquire(short** buf, size_t len) { void DivPlatformES5506::acquire(short** buf, size_t len) {
for (int i=0; i<chanMax; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// convert 32 bit access to 8 bit host interface // convert 32 bit access to 8 bit host interface
while (!hostIntf32.empty()) { while (!hostIntf32.empty()) {
@ -166,9 +169,12 @@ void DivPlatformES5506::acquire(short** buf, size_t len) {
buf[(o<<1)|1][h]=es5506.rout(o); buf[(o<<1)|1][h]=es5506.rout(o);
} }
for (int i=chanMax; i>=0; i--) { for (int i=chanMax; i>=0; i--) {
oscBuf[i]->data[oscBuf[i]->needle++]=(es5506.voice_lout(i)+es5506.voice_rout(i))>>5; oscBuf[i]->putSample(h,(es5506.voice_lout(i)+es5506.voice_rout(i))>>5);
} }
} }
for (int i=0; i<chanMax; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformES5506::e_pin(bool state) { void DivPlatformES5506::e_pin(bool state) {
@ -1259,7 +1265,7 @@ void DivPlatformES5506::setFlags(const DivConfig& flags) {
rate=chipClock/(16*(initChanMax+1)); // 2 E clock tick (16 CLKIN tick) per voice / 4 rate=chipClock/(16*(initChanMax+1)); // 2 E clock tick (16 CLKIN tick) per voice / 4
for (int i=0; i<32; i++) { for (int i=0; i<32; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -40,6 +40,9 @@
void DivPlatformESFM::acquire(short** buf, size_t len) { void DivPlatformESFM::acquire(short** buf, size_t len) {
thread_local short o[2]; thread_local short o[2];
for (int i=0; i<18; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
if (!writes.empty()) { if (!writes.empty()) {
QueuedWrite& w=writes.front(); QueuedWrite& w=writes.front();
@ -52,12 +55,15 @@ void DivPlatformESFM::acquire(short** buf, size_t len) {
ESFM_generate(&chip,o); ESFM_generate(&chip,o);
for (int c=0; c<18; c++) { for (int c=0; c<18; c++) {
oscBuf[c]->data[oscBuf[c]->needle++]=ESFM_get_channel_output_native(&chip,c); oscBuf[c]->putSample(h,ESFM_get_channel_output_native(&chip,c));
} }
buf[0][h]=o[0]; buf[0][h]=o[0];
buf[1][h]=o[1]; buf[1][h]=o[1];
} }
for (int i=0; i<18; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformESFM::tick(bool sysTick) { void DivPlatformESFM::tick(bool sysTick) {
@ -1068,6 +1074,9 @@ void DivPlatformESFM::poke(std::vector<DivRegWrite>& wlist) {
void DivPlatformESFM::setFlags(const DivConfig& flags) { void DivPlatformESFM::setFlags(const DivConfig& flags) {
chipClock=COLOR_NTSC*4.0; chipClock=COLOR_NTSC*4.0;
rate=chipClock/288.0; rate=chipClock/288.0;
for (int i=0; i<18; i++) {
oscBuf[i]->setRate(rate);
}
} }
void DivPlatformESFM::setFast(bool fast) { void DivPlatformESFM::setFast(bool fast) {

View file

@ -56,6 +56,7 @@ const char** DivPlatformFDS::getRegisterSheet() {
} }
void DivPlatformFDS::acquire_puNES(short* buf, size_t len) { void DivPlatformFDS::acquire_puNES(short* buf, size_t len) {
oscBuf->begin(len);
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
extcl_apu_tick_FDS(fds); extcl_apu_tick_FDS(fds);
int sample=isMuted[0]?0:fds->snd.main.output; int sample=isMuted[0]?0:fds->snd.main.output;
@ -64,13 +65,15 @@ void DivPlatformFDS::acquire_puNES(short* buf, size_t len) {
buf[i]=sample; buf[i]=sample;
if (++writeOscBuf>=32) { if (++writeOscBuf>=32) {
writeOscBuf=0; writeOscBuf=0;
oscBuf->data[oscBuf->needle++]=sample*3; oscBuf->putSample(i,sample*3);
} }
} }
oscBuf->end(len);
} }
void DivPlatformFDS::acquire_NSFPlay(short* buf, size_t len) { void DivPlatformFDS::acquire_NSFPlay(short* buf, size_t len) {
int out[2]; int out[2];
oscBuf->begin(len);
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
fds_NP->Tick(1); fds_NP->Tick(1);
fds_NP->Render(out); fds_NP->Render(out);
@ -80,9 +83,10 @@ void DivPlatformFDS::acquire_NSFPlay(short* buf, size_t len) {
buf[i]=sample; buf[i]=sample;
if (++writeOscBuf>=32) { if (++writeOscBuf>=32) {
writeOscBuf=0; writeOscBuf=0;
oscBuf->data[oscBuf->needle++]=sample*3; oscBuf->putSample(i,sample*3);
} }
} }
oscBuf->end(len);
} }
void DivPlatformFDS::doWrite(unsigned short addr, unsigned char data) { void DivPlatformFDS::doWrite(unsigned short addr, unsigned char data) {
@ -486,7 +490,7 @@ void DivPlatformFDS::setFlags(const DivConfig& flags) {
} }
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock; rate=chipClock;
oscBuf->rate=rate/32; oscBuf->setRate(rate);
if (useNP) { if (useNP) {
fds_NP->SetClock(rate); fds_NP->SetClock(rate);
fds_NP->SetRate(rate); fds_NP->SetRate(rate);

View file

@ -63,6 +63,9 @@ const char** DivPlatformGB::getRegisterSheet() {
} }
void DivPlatformGB::acquire(short** buf, size_t len) { void DivPlatformGB::acquire(short** buf, size_t len) {
for (int i=0; i<4; i++) {
oscBuf[i]->begin(len);
}
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
if (!writes.empty()) { if (!writes.empty()) {
QueuedWrite& w=writes.front(); QueuedWrite& w=writes.front();
@ -74,10 +77,13 @@ void DivPlatformGB::acquire(short** buf, size_t len) {
buf[0][i]=gb->apu_output.final_sample.left; buf[0][i]=gb->apu_output.final_sample.left;
buf[1][i]=gb->apu_output.final_sample.right; buf[1][i]=gb->apu_output.final_sample.right;
for (int i=0; i<4; i++) { for (int j=0; j<4; j++) {
oscBuf[i]->data[oscBuf[i]->needle++]=(gb->apu_output.current_sample[i].left+gb->apu_output.current_sample[i].right)<<6; oscBuf[j]->putSample(i,(gb->apu_output.current_sample[j].left+gb->apu_output.current_sample[j].right)<<6);
} }
} }
for (int i=0; i<4; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformGB::updateWave() { void DivPlatformGB::updateWave() {
@ -724,7 +730,7 @@ void DivPlatformGB::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/coreQuality; rate=chipClock/coreQuality;
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -29,6 +29,9 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) {
// HLE for now // HLE for now
int outL[2]={0,0}; int outL[2]={0,0};
int outR[2]={0,0}; int outR[2]={0,0};
for (int i=0; i<2; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// internal mixing is always 10-bit // internal mixing is always 10-bit
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
@ -87,7 +90,7 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) {
outL[i]=(chan[i].pan&2)?out:0; outL[i]=(chan[i].pan&2)?out:0;
outR[i]=(chan[i].pan&1)?out:0; outR[i]=(chan[i].pan&1)?out:0;
} }
oscBuf[i]->data[oscBuf[i]->needle++]=(short)((outL[i]+outR[i])<<5); oscBuf[i]->putSample(h,(short)((outL[i]+outR[i])<<5));
} }
int l=outL[0]+outL[1]; int l=outL[0]+outL[1];
int r=outR[0]+outR[1]; int r=outR[0]+outR[1];
@ -100,6 +103,9 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) {
buf[0][h]=(short)l; buf[0][h]=(short)l;
buf[1][h]=(short)r; buf[1][h]=(short)r;
} }
for (int i=0; i<2; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformGBADMA::tick(bool sysTick) { void DivPlatformGBADMA::tick(bool sysTick) {
@ -493,7 +499,7 @@ void DivPlatformGBADMA::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock>>outDepth; rate=chipClock>>outDepth;
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -61,6 +61,9 @@ void DivPlatformGBAMinMod::acquire(short** buf, size_t len) {
chState[i].volL=(short)chReg[14]; chState[i].volL=(short)chReg[14];
chState[i].volR=(short)chReg[15]; chState[i].volR=(short)chReg[15];
} }
for (int i=0; i<chanMax; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
while (sampTimer>=sampCycles) { while (sampTimer>=sampCycles) {
// the driver generates 4 samples at a time and can be start-offset // the driver generates 4 samples at a time and can be start-offset
@ -133,10 +136,10 @@ void DivPlatformGBAMinMod::acquire(short** buf, size_t len) {
buf[0][h]=sampL; buf[0][h]=sampL;
buf[1][h]=sampR; buf[1][h]=sampR;
for (int i=0; i<chanMax; i++) { for (int i=0; i<chanMax; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=oscOut[i][sampPos]; oscBuf[i]->putSample(h,oscOut[i][sampPos]);
} }
for (int i=chanMax; i<16; i++) { for (int i=chanMax; i<16; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=0; oscBuf[i]->putSample(h,0);
} }
while (updTimer>=updCycles) { while (updTimer>=updCycles) {
// flip buffer // flip buffer
@ -197,6 +200,9 @@ void DivPlatformGBAMinMod::acquire(short** buf, size_t len) {
updTimer+=1<<dacDepth; updTimer+=1<<dacDepth;
sampTimer+=1<<dacDepth; sampTimer+=1<<dacDepth;
} }
for (int i=0; i<chanMax; i++) {
oscBuf[i]->end(len);
}
// write back changed cached channel registers // write back changed cached channel registers
for (int i=0; i<chanMax; i++) { for (int i=0; i<chanMax; i++) {
unsigned short* chReg=&regPool[i*16]; unsigned short* chReg=&regPool[i*16];
@ -728,7 +734,7 @@ void DivPlatformGBAMinMod::setFlags(const DivConfig& flags) {
chanMax=flags.getInt("channels",16); chanMax=flags.getInt("channels",16);
rate=16777216>>dacDepth; rate=16777216>>dacDepth;
for (int i=0; i<16; i++) { for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
sampCycles=16777216/flags.getInt("sampRate",21845); sampCycles=16777216/flags.getInt("sampRate",21845);
chipClock=16777216/sampCycles; chipClock=16777216/sampCycles;

View file

@ -1840,7 +1840,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) {
rate=chipClock/36; rate=chipClock/36;
} }
for (int i=0; i<10; i++) { for (int i=0; i<10; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
} }

View file

@ -41,6 +41,10 @@ double DivPlatformSoundUnit::NOTE_SU(int ch, int note) {
} }
void DivPlatformSoundUnit::acquire(short** buf, size_t len) { void DivPlatformSoundUnit::acquire(short** buf, size_t len) {
for (int i=0; i<8; i++) {
oscBuf[i]->begin(len);
}
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
while (!writes.empty()) { while (!writes.empty()) {
QueuedWrite w=writes.front(); QueuedWrite w=writes.front();
@ -49,9 +53,13 @@ void DivPlatformSoundUnit::acquire(short** buf, size_t len) {
} }
su->NextSample(&buf[0][h],&buf[1][h]); su->NextSample(&buf[0][h],&buf[1][h]);
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
oscBuf[i]->data[oscBuf[i]->needle++]=su->GetSample(i); oscBuf[i]->putSample(h,su->GetSample(i));
} }
} }
for (int i=0; i<8; i++) {
oscBuf[i]->end(len);
}
} }
void DivPlatformSoundUnit::writeControl(int ch) { void DivPlatformSoundUnit::writeControl(int ch) {
@ -646,7 +654,7 @@ void DivPlatformSoundUnit::setFlags(const DivConfig& flags) {
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/4; rate=chipClock/4;
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->setRate(rate);
} }
bool echoOn=flags.getBool("echo",false); bool echoOn=flags.getBool("echo",false);
initIlCtrl=3|(echoOn?4:0); initIlCtrl=3|(echoOn?4:0);

View file

@ -704,8 +704,10 @@ void FurnaceGUI::drawChanOsc() {
} }
} }
} else { } else {
/*
String dStr=fmt::sprintf("DS: %d P: %d\nMAX: %d\nPHASE %f",displaySize,precision,(short)((fft->needle+displaySize)-fft->relatedBuf->needle),fft->debugPhase); String dStr=fmt::sprintf("DS: %d P: %d\nMAX: %d\nPHASE %f",displaySize,precision,(short)((fft->needle+displaySize)-fft->relatedBuf->needle),fft->debugPhase);
dl->AddText(inRect.Min,0xffffffff,dStr.c_str()); dl->AddText(inRect.Min,0xffffffff,dStr.c_str());
*/
if (displaySize<precision) { if (displaySize<precision) {
float y=0; float y=0;
for (int j=-2048; j<precision; j++) { for (int j=-2048; j<precision; j++) {