From a16d20e1900baf950dc4f534a327a763ff364aec Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 1 Mar 2025 19:49:56 -0500 Subject: [PATCH] new chan osc, part 4 adapt dispatch code to it --- src/engine/platform/arcade.cpp | 22 ++++++++++-- src/engine/platform/ay.cpp | 34 ++++++++++++------ src/engine/platform/ay8930.cpp | 16 ++++++--- src/engine/platform/bifurcator.cpp | 10 ++++-- src/engine/platform/bubsyswsg.cpp | 12 +++++-- src/engine/platform/c140.cpp | 20 ++++++++--- src/engine/platform/c64.cpp | 39 +++++++++++--------- src/engine/platform/dave.cpp | 58 +++++++++++++++++------------- src/engine/platform/dummy.cpp | 14 +++++--- src/engine/platform/es5506.cpp | 10 ++++-- src/engine/platform/esfm.cpp | 11 +++++- src/engine/platform/fds.cpp | 10 ++++-- src/engine/platform/gb.cpp | 12 +++++-- src/engine/platform/gbadma.cpp | 10 ++++-- src/engine/platform/gbaminmod.cpp | 12 +++++-- src/engine/platform/genesis.cpp | 2 +- src/engine/platform/su.cpp | 12 +++++-- src/gui/chanOsc.cpp | 2 ++ 18 files changed, 218 insertions(+), 88 deletions(-) diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index f12151011..24ed8a405 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -54,6 +54,10 @@ const char** DivPlatformArcade::getRegisterSheet() { void DivPlatformArcade::acquire_nuked(short** buf, size_t len) { thread_local int o[2]; + for (int i=0; i<8; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; h0) delay--; 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++) { 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; @@ -93,6 +97,10 @@ void DivPlatformArcade::acquire_nuked(short** buf, size_t len) { buf[0][h]=o[0]; 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) { @@ -100,6 +108,10 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) { 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; hdebug_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]; @@ -135,6 +147,10 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) { buf[0][h]=os[0]; buf[1][h]=os[1]; } + + for (int i=0; i<8; i++) { + oscBuf[i]->end(len); + } } void DivPlatformArcade::acquire(short** buf, size_t len) { @@ -964,7 +980,7 @@ void DivPlatformArcade::setFlags(const DivConfig& flags) { rate=chipClock/64; for (int i=0; i<8; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 6639296d1..08c310138 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -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) { for (size_t i=0; idata[oscBuf[0]->needle++]=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[2]->data[oscBuf[2]->needle++]=CLAMP(sunsoftVolTable[31-((ay->lastIndx>>10)&31)]<<3,-32768,32767); + oscBuf[0]->putSample(i,CLAMP(sunsoftVolTable[31-(ay->lastIndx&31)]<<3,-32768,32767)); + oscBuf[1]->putSample(i,CLAMP(sunsoftVolTable[31-((ay->lastIndx>>5)&31)]<<3,-32768,32767)); + oscBuf[2]->putSample(i,CLAMP(sunsoftVolTable[31-((ay->lastIndx>>10)&31)]<<3,-32768,32767)); } } else { for (size_t i=0; idata[oscBuf[0]->needle++]=ayBuf[0][0]<<2; - oscBuf[1]->data[oscBuf[1]->needle++]=ayBuf[1][0]<<2; - oscBuf[2]->data[oscBuf[2]->needle++]=ayBuf[2][0]<<2; + oscBuf[0]->putSample(i,ayBuf[0][0]<<2); + oscBuf[1]->putSample(i,ayBuf[1][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) { + for (int i=0; i<3; i++) { + oscBuf[i]->begin(len); + } for (size_t i=0; idata[oscBuf[0]->needle++]=ay_atomic.o_analog[0]; - oscBuf[1]->data[oscBuf[1]->needle++]=ay_atomic.o_analog[1]; - oscBuf[2]->data[oscBuf[2]->needle++]=ay_atomic.o_analog[2]; + oscBuf[0]->putSample(i,ay_atomic.o_analog[0]); + oscBuf[1]->putSample(i,ay_atomic.o_analog[1]); + 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++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } stereo=flags.getBool("stereo",false); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index dcf7b30d8..103f9ffd1 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -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; idata[oscBuf[0]->needle++]=ayBuf[0][0]<<2; - oscBuf[1]->data[oscBuf[1]->needle++]=ayBuf[1][0]<<2; - oscBuf[2]->data[oscBuf[2]->needle++]=ayBuf[2][0]<<2; + oscBuf[0]->putSample(i,ayBuf[0][0]<<2); + oscBuf[1]->putSample(i,ayBuf[1][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; rate=chipClock/4; for (int i=0; i<3; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } stereo=flags.getBool("stereo",false); diff --git a/src/engine/platform/bifurcator.cpp b/src/engine/platform/bifurcator.cpp index 87e042dc7..200a59dec 100644 --- a/src/engine/platform/bifurcator.cpp +++ b/src/engine/platform/bifurcator.cpp @@ -48,6 +48,9 @@ void DivPlatformBifurcator::acquire(short** buf, size_t len) { chan[i].chVolL=regPool[i*8+6]; chan[i].chVolR=regPool[i*8+7]; } + for (int i=0; i<4; i++) { + oscBuf[i]->begin(len); + } for (size_t h=0; hdata[oscBuf[i]->needle++]=(short)((outL+outR)/2); + oscBuf[i]->putSample(h,(short)((outL+outR)/2)); l+=outL/4; r+=outR/4; } buf[0][h]=(short)l; buf[1][h]=(short)r; } + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } for (int i=0; i<4; i++) { regPool[i*8]=chan[i].curx&0xff; regPool[i*8+1]=chan[i].curx>>8; @@ -347,7 +353,7 @@ void DivPlatformBifurcator::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index b0b470bf2..fa53a40a8 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -41,6 +41,9 @@ const char** DivPlatformBubSysWSG::getRegisterSheet() { void DivPlatformBubSysWSG::acquire(short** buf, size_t len) { int chanOut=0; + for (int i=0; i<2; i++) { + oscBuf[i]->begin(len); + } for (size_t h=0; hdata[oscBuf[i]->needle++]=0; + oscBuf[i]->putSample(h,0); continue; } else { chanOut=chan[i].waveROM[k005289.addr(i)]*(regPool[2+i]&0xf); out+=chanOut; 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); buf[0][h]=out; } + for (int i=0; i<2; i++) { + oscBuf[i]->end(len); + } } void DivPlatformBubSysWSG::updateWave(int ch) { @@ -334,7 +340,7 @@ void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/coreQuality; for (int i=0; i<2; i++) { - oscBuf[i]->rate=rate/8; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/c140.cpp b/src/engine/platform/c140.cpp index 99d6d6e6c..509532d5f 100644 --- a/src/engine/platform/c140.cpp +++ b/src/engine/platform/c140.cpp @@ -68,6 +68,9 @@ const char** DivPlatformC140::getRegisterSheet() { } void DivPlatformC140::acquire_219(short** buf, size_t len) { + for (int i=0; ibegin(len); + } for (size_t h=0; hdata[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 { - 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; iend(len); + } } void DivPlatformC140::acquire_140(short** buf, size_t len) { + for (int i=0; ibegin(len); + } for (size_t h=0; hdata[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; iend(len); + } } void DivPlatformC140::acquire(short** buf, size_t len) { @@ -752,7 +764,7 @@ void DivPlatformC140::setFlags(const DivConfig& flags) { c140_bank_type(&c140,bankType); } for (int i=0; irate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 44227732e..89d349071 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -139,6 +139,9 @@ void DivPlatformC64::processDAC(int sRate) { void DivPlatformC64::acquire(short** buf, size_t len) { 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=4) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=sid_d->lastOut[0]; - oscBuf[1]->data[oscBuf[1]->needle++]=sid_d->lastOut[1]; - oscBuf[2]->data[oscBuf[2]->needle++]=sid_d->lastOut[2]; - oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; + oscBuf[0]->putSample(i,sid_d->lastOut[0]); + oscBuf[1]->putSample(i,sid_d->lastOut[1]); + oscBuf[2]->putSample(i,sid_d->lastOut[2]); + oscBuf[3]->putSample(i,chan[3].pcmOut<<11); } } else if (sidCore==1) { sid_fp->clock(4,&buf[0][i]); if (++writeOscBuf>=4) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=runFakeFilter(0,(sid_fp->lastChanOut[0]-dcOff)>>5); - oscBuf[1]->data[oscBuf[1]->needle++]=runFakeFilter(1,(sid_fp->lastChanOut[1]-dcOff)>>5); - oscBuf[2]->data[oscBuf[2]->needle++]=runFakeFilter(2,(sid_fp->lastChanOut[2]-dcOff)>>5); - oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; + oscBuf[0]->putSample(i,runFakeFilter(0,(sid_fp->lastChanOut[0]-dcOff)>>5)); + oscBuf[1]->putSample(i,runFakeFilter(1,(sid_fp->lastChanOut[1]-dcOff)>>5)); + oscBuf[2]->putSample(i,runFakeFilter(2,(sid_fp->lastChanOut[2]-dcOff)>>5)); + oscBuf[3]->putSample(i,chan[3].pcmOut<<11); } } else { sid->clock(); buf[0][i]=sid->output(); if (++writeOscBuf>=16) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=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[2]->data[oscBuf[2]->needle++]=runFakeFilter(2,(sid->last_chan_out[2]-dcOff)>>5); - oscBuf[3]->data[oscBuf[3]->needle++]=chan[3].pcmOut<<11; + oscBuf[0]->putSample(i,runFakeFilter(0,(sid->last_chan_out[0]-dcOff)>>5)); + oscBuf[1]->putSample(i,runFakeFilter(1,(sid->last_chan_out[1]-dcOff)>>5)); + oscBuf[2]->putSample(i,runFakeFilter(2,(sid->last_chan_out[2]-dcOff)>>5)); + oscBuf[3]->putSample(i,chan[3].pcmOut<<11); } } } + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } } void DivPlatformC64::updateFilter() { @@ -913,7 +919,7 @@ void DivPlatformC64::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate/16; + oscBuf[i]->setRate(rate); } if (sidCore>0) { rate/=(sidCore==2)?coreQuality:4; @@ -930,15 +936,16 @@ void DivPlatformC64::setFlags(const DivConfig& flags) { // init fake filter table // 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++) { double c=(double)i/8.0+0.2; if (sidIs6581) { if (c<24) { - c=2.0*sin(771.78/(double)oscBuf[0]->rate); + c=2.0*sin(771.78/oscBufRate); } 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 { c=1-exp(c*cutRatio); diff --git a/src/engine/platform/dave.cpp b/src/engine/platform/dave.cpp index c61a51e70..9e12ef095 100644 --- a/src/engine/platform/dave.cpp +++ b/src/engine/platform/dave.cpp @@ -64,6 +64,10 @@ const char** DivPlatformDave::getRegisterSheet() { } 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>16; if ((regPool[7]&0x18)==0x18) { - oscBuf[0]->data[oscBuf[0]->needle++]=0; - oscBuf[1]->data[oscBuf[1]->needle++]=0; - oscBuf[2]->data[oscBuf[2]->needle++]=0; - oscBuf[3]->data[oscBuf[3]->needle++]=0; - oscBuf[4]->data[oscBuf[4]->needle++]=dave->chn0_left<<9; - oscBuf[5]->data[oscBuf[5]->needle++]=dave->chn0_right<<9; + oscBuf[0]->putSample(h,0); + oscBuf[1]->putSample(h,0); + oscBuf[2]->putSample(h,0); + oscBuf[3]->putSample(h,0); + oscBuf[4]->putSample(h,dave->chn0_left<<9); + oscBuf[5]->putSample(h,dave->chn0_right<<9); } else if (regPool[7]&0x08) { - oscBuf[0]->data[oscBuf[0]->needle++]=dave->chn0_state?(dave->chn0_right<<8):0; - oscBuf[1]->data[oscBuf[1]->needle++]=dave->chn1_state?(dave->chn1_right<<8):0; - oscBuf[2]->data[oscBuf[2]->needle++]=dave->chn2_state?(dave->chn2_right<<8):0; - oscBuf[3]->data[oscBuf[3]->needle++]=dave->chn3_state?(dave->chn3_right<<8):0; - oscBuf[4]->data[oscBuf[4]->needle++]=dave->chn0_left<<9; - oscBuf[5]->data[oscBuf[5]->needle++]=0; + oscBuf[0]->putSample(h,dave->chn0_state?(dave->chn0_right<<8):0); + oscBuf[1]->putSample(h,dave->chn1_state?(dave->chn1_right<<8):0); + oscBuf[2]->putSample(h,dave->chn2_state?(dave->chn2_right<<8):0); + oscBuf[3]->putSample(h,dave->chn3_state?(dave->chn3_right<<8):0); + oscBuf[4]->putSample(h,dave->chn0_left<<9); + oscBuf[5]->putSample(h,0); } else if (regPool[7]&0x10) { - oscBuf[0]->data[oscBuf[0]->needle++]=dave->chn0_state?(dave->chn0_left<<8):0; - oscBuf[1]->data[oscBuf[1]->needle++]=dave->chn1_state?(dave->chn1_left<<8):0; - oscBuf[2]->data[oscBuf[2]->needle++]=dave->chn2_state?(dave->chn2_left<<8):0; - oscBuf[3]->data[oscBuf[3]->needle++]=dave->chn3_state?(dave->chn3_left<<8):0; - oscBuf[4]->data[oscBuf[4]->needle++]=0; - oscBuf[5]->data[oscBuf[5]->needle++]=dave->chn0_right<<9; + oscBuf[0]->putSample(h,dave->chn0_state?(dave->chn0_left<<8):0); + oscBuf[1]->putSample(h,dave->chn1_state?(dave->chn1_left<<8):0); + oscBuf[2]->putSample(h,dave->chn2_state?(dave->chn2_left<<8):0); + oscBuf[3]->putSample(h,dave->chn3_state?(dave->chn3_left<<8):0); + oscBuf[4]->putSample(h,0); + oscBuf[5]->putSample(h,dave->chn0_right<<9); } else { - oscBuf[0]->data[oscBuf[0]->needle++]=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[2]->data[oscBuf[2]->needle++]=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[4]->data[oscBuf[4]->needle++]=0; - oscBuf[5]->data[oscBuf[5]->needle++]=0; + oscBuf[0]->putSample(h,dave->chn0_state?((dave->chn0_left+dave->chn0_right)<<8):0); + oscBuf[1]->putSample(h,dave->chn1_state?((dave->chn1_left+dave->chn1_right)<<8):0); + oscBuf[2]->putSample(h,dave->chn2_state?((dave->chn2_left+dave->chn2_right)<<8):0); + oscBuf[3]->putSample(h,dave->chn3_state?((dave->chn3_left+dave->chn3_right)<<8):0); + oscBuf[4]->putSample(h,0); + oscBuf[5]->putSample(h,0); } buf[0][h]=(short)nextL; buf[1][h]=(short)nextR; } + + for (int i=0; i<6; i++) { + oscBuf[i]->end(len); + } } void DivPlatformDave::tick(bool sysTick) { @@ -596,7 +604,7 @@ void DivPlatformDave::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<6; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/dummy.cpp b/src/engine/platform/dummy.cpp index 422397b14..1be4a4962 100644 --- a/src/engine/platform/dummy.cpp +++ b/src/engine/platform/dummy.cpp @@ -26,26 +26,32 @@ void DivPlatformDummy::acquire(short** buf, size_t len) { int chanOut; + for (int i=0; ibegin(len); + } for (size_t i=0; i>12; - oscBuf[j]->data[oscBuf[j]->needle++]=chanOut<<1; + oscBuf[j]->putSample(i,chanOut<<1); out+=chanOut; } else { - oscBuf[j]->data[oscBuf[j]->needle++]=0; + oscBuf[j]->putSample(i,0); } chan[j].pos+=chan[j].freq; } else { - oscBuf[j]->data[oscBuf[j]->needle++]=0; + oscBuf[j]->putSample(i,0); } } if (out<-32768) out=-32768; if (out>32767) out=32767; buf[0][i]=out; } + for (int i=0; iend(len); + } } 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; if (irate=65536; + oscBuf[i]->setRate(65536); } } rate=65536; diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index a40e7d4d5..2f5f7b3c1 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -111,6 +111,9 @@ const char** DivPlatformES5506::getRegisterSheet() { } void DivPlatformES5506::acquire(short** buf, size_t len) { + for (int i=0; ibegin(len); + } for (size_t h=0; h=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; iend(len); + } } 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 for (int i=0; i<32; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/esfm.cpp b/src/engine/platform/esfm.cpp index e0f3252a7..bbce9d665 100644 --- a/src/engine/platform/esfm.cpp +++ b/src/engine/platform/esfm.cpp @@ -40,6 +40,9 @@ void DivPlatformESFM::acquire(short** buf, size_t len) { thread_local short o[2]; + for (int i=0; i<18; i++) { + oscBuf[i]->begin(len); + } for (size_t h=0; hdata[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[1][h]=o[1]; } + for (int i=0; i<18; i++) { + oscBuf[i]->end(len); + } } void DivPlatformESFM::tick(bool sysTick) { @@ -1068,6 +1074,9 @@ void DivPlatformESFM::poke(std::vector& wlist) { void DivPlatformESFM::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC*4.0; rate=chipClock/288.0; + for (int i=0; i<18; i++) { + oscBuf[i]->setRate(rate); + } } void DivPlatformESFM::setFast(bool fast) { diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index 1b3428455..215b640da 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -56,6 +56,7 @@ const char** DivPlatformFDS::getRegisterSheet() { } void DivPlatformFDS::acquire_puNES(short* buf, size_t len) { + oscBuf->begin(len); for (size_t i=0; isnd.main.output; @@ -64,13 +65,15 @@ void DivPlatformFDS::acquire_puNES(short* buf, size_t len) { buf[i]=sample; if (++writeOscBuf>=32) { 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) { int out[2]; + oscBuf->begin(len); for (size_t i=0; iTick(1); fds_NP->Render(out); @@ -80,9 +83,10 @@ void DivPlatformFDS::acquire_NSFPlay(short* buf, size_t len) { buf[i]=sample; if (++writeOscBuf>=32) { 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) { @@ -486,7 +490,7 @@ void DivPlatformFDS::setFlags(const DivConfig& flags) { } CHECK_CUSTOM_CLOCK; rate=chipClock; - oscBuf->rate=rate/32; + oscBuf->setRate(rate); if (useNP) { fds_NP->SetClock(rate); fds_NP->SetRate(rate); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 0cf65722c..819df4c16 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -63,6 +63,9 @@ const char** DivPlatformGB::getRegisterSheet() { } void DivPlatformGB::acquire(short** buf, size_t len) { + for (int i=0; i<4; i++) { + oscBuf[i]->begin(len); + } for (size_t i=0; iapu_output.final_sample.left; buf[1][i]=gb->apu_output.final_sample.right; - for (int i=0; i<4; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=(gb->apu_output.current_sample[i].left+gb->apu_output.current_sample[i].right)<<6; + for (int j=0; j<4; j++) { + 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() { @@ -724,7 +730,7 @@ void DivPlatformGB::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/coreQuality; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/gbadma.cpp b/src/engine/platform/gbadma.cpp index c180cef1f..84621e079 100644 --- a/src/engine/platform/gbadma.cpp +++ b/src/engine/platform/gbadma.cpp @@ -29,6 +29,9 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { // HLE for now int outL[2]={0,0}; int outR[2]={0,0}; + for (int i=0; i<2; i++) { + oscBuf[i]->begin(len); + } for (size_t h=0; hdata[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 r=outR[0]+outR[1]; @@ -100,6 +103,9 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { buf[0][h]=(short)l; buf[1][h]=(short)r; } + for (int i=0; i<2; i++) { + oscBuf[i]->end(len); + } } void DivPlatformGBADMA::tick(bool sysTick) { @@ -493,7 +499,7 @@ void DivPlatformGBADMA::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock>>outDepth; for (int i=0; i<2; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/gbaminmod.cpp b/src/engine/platform/gbaminmod.cpp index add60505e..435999cde 100644 --- a/src/engine/platform/gbaminmod.cpp +++ b/src/engine/platform/gbaminmod.cpp @@ -61,6 +61,9 @@ void DivPlatformGBAMinMod::acquire(short** buf, size_t len) { chState[i].volL=(short)chReg[14]; chState[i].volR=(short)chReg[15]; } + for (int i=0; ibegin(len); + } for (size_t h=0; h=sampCycles) { // 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[1][h]=sampR; for (int i=0; idata[oscBuf[i]->needle++]=oscOut[i][sampPos]; + oscBuf[i]->putSample(h,oscOut[i][sampPos]); } for (int i=chanMax; i<16; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=0; + oscBuf[i]->putSample(h,0); } while (updTimer>=updCycles) { // flip buffer @@ -197,6 +200,9 @@ void DivPlatformGBAMinMod::acquire(short** buf, size_t len) { updTimer+=1<end(len); + } // write back changed cached channel registers for (int i=0; i>dacDepth; for (int i=0; i<16; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } sampCycles=16777216/flags.getInt("sampRate",21845); chipClock=16777216/sampCycles; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index e3455db01..7b2c71b50 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1840,7 +1840,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { rate=chipClock/36; } for (int i=0; i<10; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 07802f7a3..79776ce7b 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -41,6 +41,10 @@ double DivPlatformSoundUnit::NOTE_SU(int ch, int note) { } void DivPlatformSoundUnit::acquire(short** buf, size_t len) { + for (int i=0; i<8; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hNextSample(&buf[0][h],&buf[1][h]); 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) { @@ -646,7 +654,7 @@ void DivPlatformSoundUnit::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/4; for (int i=0; i<8; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } bool echoOn=flags.getBool("echo",false); initIlCtrl=3|(echoOn?4:0); diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index 88086620b..3bee3dda3 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -704,8 +704,10 @@ void FurnaceGUI::drawChanOsc() { } } } else { + /* 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()); + */ if (displaySize