diff --git a/extern/SAASound/src/SAADevice.cpp b/extern/SAASound/src/SAADevice.cpp index eb88e9ace..7b9ae6c2a 100644 --- a/extern/SAASound/src/SAADevice.cpp +++ b/extern/SAASound/src/SAADevice.cpp @@ -307,7 +307,7 @@ BYTE CSAADevice::_ReadData(void) } #endif -void CSAADevice::_TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed, DivDispatchOscBuffer** oscBuf) +void CSAADevice::_TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed, DivDispatchOscBuffer** oscBuf, unsigned int where) { unsigned int temp_left, temp_right; unsigned int accum_left = 0, accum_right = 0; @@ -316,27 +316,27 @@ void CSAADevice::_TickAndOutputStereo(unsigned int& left_mixed, unsigned int& ri m_Noise0.Tick(); m_Noise1.Tick(); m_Amp0.TickAndOutputStereo(temp_left, temp_right); - oscBuf[0]->data[oscBuf[0]->needle++]=(temp_left+temp_right)<<5; + oscBuf[0]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; m_Amp1.TickAndOutputStereo(temp_left, temp_right); - oscBuf[1]->data[oscBuf[1]->needle++]=(temp_left+temp_right)<<5; + oscBuf[1]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; m_Amp2.TickAndOutputStereo(temp_left, temp_right); - oscBuf[2]->data[oscBuf[2]->needle++]=(temp_left+temp_right)<<5; + oscBuf[2]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; m_Amp3.TickAndOutputStereo(temp_left, temp_right); - oscBuf[3]->data[oscBuf[3]->needle++]=(temp_left+temp_right)<<5; + oscBuf[3]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; m_Amp4.TickAndOutputStereo(temp_left, temp_right); - oscBuf[4]->data[oscBuf[4]->needle++]=(temp_left+temp_right)<<5; + oscBuf[4]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; m_Amp5.TickAndOutputStereo(temp_left, temp_right); - oscBuf[5]->data[oscBuf[5]->needle++]=(temp_left+temp_right)<<5; + oscBuf[5]->putSample(where,(temp_left+temp_right)<<5); accum_left += temp_left; accum_right += temp_right; } diff --git a/extern/SAASound/src/SAADevice.h b/extern/SAASound/src/SAADevice.h index fe4339305..60b934ddf 100644 --- a/extern/SAASound/src/SAADevice.h +++ b/extern/SAASound/src/SAADevice.h @@ -53,7 +53,7 @@ public: void _SetClockRate(unsigned int nClockRate); void _SetSampleRate(unsigned int nSampleRate); void _SetOversample(unsigned int nOversample); - void _TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed, DivDispatchOscBuffer** oscBuf); + void _TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed, DivDispatchOscBuffer** oscBuf, unsigned int where); void _TickAndOutputSeparate(unsigned int& left_mixed, unsigned int& right_mixed, unsigned int& left0, unsigned int& right0, unsigned int& left1, unsigned int& right1, diff --git a/extern/SAASound/src/SAAImpl.cpp b/extern/SAASound/src/SAAImpl.cpp index ef1014c01..7efae7f8b 100644 --- a/extern/SAASound/src/SAAImpl.cpp +++ b/extern/SAASound/src/SAAImpl.cpp @@ -373,9 +373,10 @@ void CSAASoundInternal::GenerateMany(BYTE* pBuffer, unsigned int nSamples, DivDi else { #endif + unsigned int where=0; while (nSamples--) { - m_chip._TickAndOutputStereo(left_mixed, right_mixed, oscBuf); + m_chip._TickAndOutputStereo(left_mixed, right_mixed, oscBuf, where++); scale_for_output(left_mixed, right_mixed, oversample, m_bHighpass, nBoost, filterout_z1_left_mixed, filterout_z1_right_mixed, pBuffer); } diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 7b2c71b50..be99595cb 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -139,6 +139,10 @@ void DivPlatformGenesis::acquire_nuked(short** buf, size_t len) { thread_local short o[2]; thread_local int os[2]; + for (int i=0; i<7; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hdata[oscBuf[5]->needle++]=chan[5].dacOutput<<6; - oscBuf[6]->data[oscBuf[6]->needle++]=chan[6].dacOutput<<6; + oscBuf[5]->putSample(h,chan[5].dacOutput<<6); + oscBuf[6]->putSample(h,chan[6].dacOutput<<6); } else { - oscBuf[i]->data[oscBuf[i]->needle++]=((fm.dacdata^0x100)-0x100)<<6; - oscBuf[6]->data[oscBuf[6]->needle++]=0; + oscBuf[i]->putSample(h,((fm.dacdata^0x100)-0x100)<<6); + oscBuf[6]->putSample(h,0); } } else { - oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(fm.ch_out[i]<<(chipType==2?1:6),-32768,32767); - oscBuf[6]->data[oscBuf[6]->needle++]=0; + oscBuf[i]->putSample(h,CLAMP(fm.ch_out[i]<<(chipType==2?1:6),-32768,32767)); + oscBuf[6]->putSample(h,0); } } else { - oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(fm.ch_out[i]<<(chipType==2?1:6),-32768,32767); + oscBuf[i]->putSample(h,CLAMP(fm.ch_out[i]<<(chipType==2?1:6),-32768,32767)); } } @@ -219,6 +223,10 @@ void DivPlatformGenesis::acquire_nuked(short** buf, size_t len) { buf[0][h]=os[0]; buf[1][h]=os[1]; } + + for (int i=0; i<7; i++) { + oscBuf[i]->end(len); + } } void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) { @@ -226,6 +234,10 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) { ymfm::ym2612::fm_engine* fme=fm_ymfm->debug_engine(); + for (int i=0; i<7; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hdebug_dac_enable()) { if (softPCM) { - oscBuf[5]->data[oscBuf[5]->needle++]=chan[5].dacOutput<<6; - oscBuf[6]->data[oscBuf[6]->needle++]=chan[6].dacOutput<<6; + oscBuf[5]->putSample(h,chan[5].dacOutput<<6); + oscBuf[6]->putSample(h,chan[6].dacOutput<<6); } else { - oscBuf[i]->data[oscBuf[i]->needle++]=((fm_ymfm->debug_dac_data()^0x100)-0x100)<<6; - oscBuf[6]->data[oscBuf[6]->needle++]=0; + oscBuf[i]->putSample(h,((fm_ymfm->debug_dac_data()^0x100)-0x100)<<6); + oscBuf[6]->putSample(h,0); } } else { - oscBuf[i]->data[oscBuf[i]->needle++]=chOut; - oscBuf[6]->data[oscBuf[6]->needle++]=0; + oscBuf[i]->putSample(h,chOut); + oscBuf[6]->putSample(h,0); } } else { - oscBuf[i]->data[oscBuf[i]->needle++]=chOut; + oscBuf[i]->putSample(h,chOut); } } @@ -302,6 +314,10 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) { buf[0][h]=os[0]; buf[1][h]=os[1]; } + + for (int i=0; i<7; i++) { + oscBuf[i]->end(len); + } } const unsigned char chanMap276[6]={ @@ -309,7 +325,7 @@ const unsigned char chanMap276[6]={ }; // thanks LTVA -void DivPlatformGenesis::acquire276OscSub() { +inline void DivPlatformGenesis::acquire276OscSub(int h) { if (fm_276.fsm_cnt2[1]==0 && llePrevCycle!=0) { lleCycle=0; } @@ -326,22 +342,22 @@ void DivPlatformGenesis::acquire276OscSub() { for (int i=0; i<6; i++) { if ((softPCM && ((chanMap276[i]!=5) || !chan[5].dacMode)) || (!softPCM)) { - oscBuf[chanMap276[i]]->data[oscBuf[chanMap276[i]]->needle++]=lleOscData[i]; + oscBuf[chanMap276[i]]->putSample(h,lleOscData[i]); } lleOscData[i]=0; } if (softPCM && chan[5].dacMode) { - oscBuf[5]->data[oscBuf[5]->needle++]=chan[5].dacOutput<<6; - oscBuf[6]->data[oscBuf[6]->needle++]=chan[6].dacOutput<<6; + oscBuf[5]->putSample(h,chan[5].dacOutput<<6); + oscBuf[6]->putSample(h,chan[6].dacOutput<<6); } else { - oscBuf[6]->data[oscBuf[6]->needle++]=0; + oscBuf[6]->putSample(h,0); } } } else { for (int i=0; i<6; i++) { if (lleCycle==((7+i)*12)) { - oscBuf[i]->data[oscBuf[i]->needle]=(fm_276.osc_out>>1)*8; + oscBuf[i]->putSample(h,(fm_276.osc_out>>1)*4); } } @@ -351,18 +367,15 @@ void DivPlatformGenesis::acquire276OscSub() { lleCycle=0; for (int i=0; i<6; i++) { - oscBuf[i]->data[oscBuf[i]->needle]>>=1; + // we cannot do this anymore + //oscBuf[i]->putSample(h,>>=1); } if (softPCM && chan[5].dacMode) { - oscBuf[5]->data[oscBuf[5]->needle]=chan[5].dacOutput<<6; - oscBuf[6]->data[oscBuf[6]->needle]=chan[6].dacOutput<<6; + oscBuf[5]->putSample(h,chan[5].dacOutput<<6); + oscBuf[6]->putSample(h,chan[6].dacOutput<<6); } else { - oscBuf[6]->data[oscBuf[6]->needle]=0; - } - - for (int i=0; i<7; i++) { - oscBuf[i]->needle++; + oscBuf[6]->putSample(h,0); } } } @@ -370,6 +383,10 @@ void DivPlatformGenesis::acquire276OscSub() { // thanks LTVA void DivPlatformGenesis::acquire_nuked276(short** buf, size_t len) { + for (int i=0; i<7; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; h>2; } } + + for (int i=0; i<7; i++) { + oscBuf[i]->end(len); + } } void DivPlatformGenesis::acquire(short** buf, size_t len) { diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 9ecc80419..82495bdef 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -94,7 +94,7 @@ class DivPlatformGenesis: public DivPlatformOPN { inline void processDAC(int iRate); inline void commitState(int ch, DivInstrument* ins); - void acquire276OscSub(); + inline void acquire276OscSub(int h); void acquire_nuked(short** buf, size_t len); void acquire_nuked276(short** buf, size_t len); void acquire_ymfm(short** buf, size_t len); diff --git a/src/engine/platform/k007232.cpp b/src/engine/platform/k007232.cpp index 6aaccc908..c03081f7c 100644 --- a/src/engine/platform/k007232.cpp +++ b/src/engine/platform/k007232.cpp @@ -55,6 +55,10 @@ inline void DivPlatformK007232::chWrite(unsigned char ch, unsigned int addr, uns } void DivPlatformK007232::acquire(short** buf, size_t len) { + for (int i=0; i<2; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; h=8) { oscDivider=0; for (int i=0; i<2; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=(lout[i]+rout[i])<<3; + oscBuf[i]->putSample(h,(lout[i]+rout[i])<<3); } } } else { @@ -91,11 +95,15 @@ void DivPlatformK007232::acquire(short** buf, size_t len) { if (++oscDivider>=8) { oscDivider=0; for (int i=0; i<2; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=out[i]<<4; + oscBuf[i]->putSample(h,out[i]<<4); } } } } + + for (int i=0; i<2; i++) { + oscBuf[i]->end(len); + } } u8 DivPlatformK007232::read_sample(u8 ne, u32 address) { @@ -490,7 +498,7 @@ void DivPlatformK007232::setFlags(const DivConfig& flags) { stereo=flags.getBool("stereo",false); for (int i=0; i<2; i++) { chan[i].volumeChanged=true; - oscBuf[i]->rate=rate/8; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 1916270c3..85d7ab817 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -69,7 +69,11 @@ u8 DivPlatformK053260::read_sample(u32 address) { } void DivPlatformK053260::acquire(short** buf, size_t len) { - for (size_t i=0; ibegin(len); + } + + for (size_t h=0; h32767) rout=32767; if (rout<-32768) rout=-32768; - buf[0][i]=lout; - buf[1][i]=rout; + buf[0][h]=lout; + buf[1][h]=rout; for (int i=0; i<4; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=(k053260.voice_out(i,0)+k053260.voice_out(i,1))>>1; + oscBuf[i]->putSample(h,(k053260.voice_out(i,0)+k053260.voice_out(i,1))>>1); } } + + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } } void DivPlatformK053260::tick(bool sysTick) { @@ -427,7 +435,7 @@ void DivPlatformK053260::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/TICK_DIVIDER; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index e044ba5e6..7a2db6025 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -154,6 +154,12 @@ void DivPlatformLynx::processDAC(int sRate) { } void DivPlatformLynx::acquire(short** buf, size_t len) { + thread_local int chanBuf[4]; + + for (int i=0; i<4; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hsampleAudio(buf[0]+h,buf[1]+h,1,oscBuf); + mikey->sampleAudio(buf[0]+h,buf[1]+h,1,chanBuf); + + for (int i=0; i<4; i++) { + oscBuf[i]->putSample(h,chanBuf[i]); + } + } + + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); } } @@ -555,7 +569,7 @@ void DivPlatformLynx::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/128; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index da024ecc0..506ba3be4 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -44,6 +44,10 @@ const char** DivPlatformMMC5::getRegisterSheet() { } void DivPlatformMMC5::acquire(short** buf, size_t len) { + for (int i=0; i<3; i++) { + oscBuf[i]->begin(len); + } + for (size_t i=0; i=32) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=isMuted[0]?0:((mmc5->S3.output)<<11); - oscBuf[1]->data[oscBuf[1]->needle++]=isMuted[1]?0:((mmc5->S4.output)<<11); - oscBuf[2]->data[oscBuf[2]->needle++]=isMuted[2]?0:((mmc5->pcm.output)<<7); + oscBuf[0]->putSample(i,isMuted[0]?0:((mmc5->S3.output)<<11)); + oscBuf[1]->putSample(i,isMuted[1]?0:((mmc5->S4.output)<<11)); + oscBuf[2]->putSample(i,isMuted[2]?0:((mmc5->pcm.output)<<7)); } } + + for (int i=0; i<3; i++) { + oscBuf[i]->end(len); + } } void DivPlatformMMC5::tick(bool sysTick) { @@ -427,7 +435,7 @@ void DivPlatformMMC5::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock; for (int i=0; i<3; i++) { - oscBuf[i]->rate=rate/32; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/msm5232.cpp b/src/engine/platform/msm5232.cpp index 0e96b8df2..d0325ae60 100644 --- a/src/engine/platform/msm5232.cpp +++ b/src/engine/platform/msm5232.cpp @@ -46,6 +46,10 @@ const char** DivPlatformMSM5232::getRegisterSheet() { } void DivPlatformMSM5232::acquire(short** buf, size_t len) { + for (int i=0; i<8; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hdata[oscBuf[i]->needle++]=0; + oscBuf[i]->putSample(h,0); } else { int o=( ((regPool[12+(i>>2)]&1)?((msm->vo16[i]*partVolume[3+(i&4)])>>8):0)+ @@ -64,7 +68,7 @@ void DivPlatformMSM5232::acquire(short** buf, size_t len) { ((regPool[12+(i>>2)]&4)?((msm->vo4[i]*partVolume[1+(i&4)])>>8):0)+ ((regPool[12+(i>>2)]&8)?((msm->vo2[i]*partVolume[i&4])>>8):0) )<<2; - oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(o,-32768,32767); + oscBuf[i]->putSample(h,CLAMP(o,-32768,32767)); } } @@ -84,6 +88,10 @@ void DivPlatformMSM5232::acquire(short** buf, size_t len) { buf[0][h]+=(temp[i]*partVolume[i])>>8; } } + + for (int i=0; i<8; i++) { + oscBuf[i]->end(len); + } } const int attackMap[8]={ @@ -400,7 +408,7 @@ void DivPlatformMSM5232::setFlags(const DivConfig& flags) { msm->set_clock(chipClock+detune*1024); rate=msm->get_rate(); for (int i=0; i<8; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } initPartVolume[0]=flags.getInt("partVolume0",255); initPartVolume[1]=flags.getInt("partVolume1",255); diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 84d529c8f..a6a19f100 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -41,6 +41,8 @@ int DivPlatformMSM6258::calcVGMRate() { } void DivPlatformMSM6258::acquire(short** buf, size_t len) { + oscBuf[0]->begin(len); + for (size_t h=0; hdata[oscBuf[0]->needle++]=0; + oscBuf[0]->putSample(h,0); } else { buf[0][h]=(msmPan&2)?0:msmOut; buf[1][h]=(msmPan&1)?0:msmOut; - oscBuf[0]->data[oscBuf[0]->needle++]=msmPan?(msmOut>>1):0; + oscBuf[0]->putSample(h,msmPan?(msmOut>>1):0); } } + + oscBuf[0]->end(len); } void DivPlatformMSM6258::tick(bool sysTick) { @@ -407,7 +411,7 @@ void DivPlatformMSM6258::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/256; for (int i=0; i<1; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } variableRate=flags.getBool("variableRate",false); } diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index bd030b4c5..d70a05b84 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -63,6 +63,10 @@ u8 DivPlatformMSM6295::read_byte(u32 address) { } void DivPlatformMSM6295::acquire(short** buf, size_t len) { + for (int i=0; i<4; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; h=22) { updateOsc=0; for (int i=0; i<4; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=msm.voice_out(i)<<5; + oscBuf[i]->putSample(h,msm.voice_out(i)<<5); } } } + + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } } void DivPlatformMSM6295::tick(bool sysTick) { @@ -560,7 +568,7 @@ void DivPlatformMSM6295::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/3; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate/22; + oscBuf[i]->setRate(rate);; } if (rateSel!=rateSelInit) { rWrite(12,!rateSelInit); diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 5ee2519c3..4ac1c2289 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -109,6 +109,10 @@ const char** DivPlatformN163::getRegisterSheet() { } void DivPlatformN163::acquire(short** buf, size_t len) { + for (int i=0; i<8; i++) { + oscBuf[i]->begin(len); + } + for (size_t i=0; idata[oscBuf[i]->needle++]=n163.voice_out(i)<<7; + if (n163.voice_cycle()==0x78) for (int j=0; j<8; j++) { + oscBuf[j]->putSample(i,n163.voice_out(j)<<7); } // command queue @@ -128,6 +132,10 @@ void DivPlatformN163::acquire(short** buf, size_t len) { writes.pop(); } } + + for (int i=0; i<8; i++) { + oscBuf[i]->end(len); + } } void DivPlatformN163::updateWave(int ch, int wave, int pos, int len) { @@ -595,7 +603,7 @@ void DivPlatformN163::setFlags(const DivConfig& flags) { n163.set_multiplex(multiplex); rWrite(0x7f,initChanMax<<4); for (int i=0; i<8; i++) { - oscBuf[i]->rate=rate/(initChanMax+1); + oscBuf[i]->setRate(rate);//=rate/(initChanMax+1); } lenCompensate=flags.getBool("lenCompensate",false); diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 3d26c2aae..bbd470fc4 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -171,15 +171,24 @@ void DivPlatformNamcoWSG::acquire(short** buf, size_t len) { regPool[w.addr&0x3f]=w.val; writes.pop(); } + + for (int i=0; ibegin(len); + } + for (size_t h=0; hsound_stream_update(bufC,1); for (int i=0; idata[oscBuf[i]->needle++]=(namco->m_channel_list[i].last_out*chans)>>1; + oscBuf[i]->putSample(h,(namco->m_channel_list[i].last_out*chans)>>1); } } + + for (int i=0; iend(len); + } } void DivPlatformNamcoWSG::updateWave(int ch) { @@ -579,7 +588,7 @@ void DivPlatformNamcoWSG::setFlags(const DivConfig& flags) { rate=chipClock/32; namco->device_clock_changed(96000); for (int i=0; irate=rate; + oscBuf[i]->setRate(rate); } newNoise=flags.getBool("newNoise",true); romMode=flags.getBool("romMode",false); diff --git a/src/engine/platform/nds.cpp b/src/engine/platform/nds.cpp index 2478989d0..98611ad62 100644 --- a/src/engine/platform/nds.cpp +++ b/src/engine/platform/nds.cpp @@ -69,7 +69,11 @@ const char** DivPlatformNDS::getRegisterSheet() { } void DivPlatformNDS::acquire(short** buf, size_t len) { - for (size_t i=0; ibegin(len); + } + + for (size_t h=0; h32767) rout=32767; if (rout<-32768) rout=-32768; - buf[0][i]=lout; - buf[1][i]=rout; + buf[0][h]=lout; + buf[1][h]=rout; for (int i=0; i<16; i++) { - oscBuf[i]->data[oscBuf[i]->needle++]=(nds.chan_lout(i)+nds.chan_rout(i))>>1; + oscBuf[i]->putSample(h,(nds.chan_lout(i)+nds.chan_rout(i))>>1); } } + + for (int i=0; i<16; i++) { + oscBuf[i]->end(len); + } } u8 DivPlatformNDS::read_byte(u32 addr) { @@ -564,7 +572,7 @@ void DivPlatformNDS::setFlags(const DivConfig& flags) { chipClock=33513982; rate=chipClock/2/coreQuality; for (int i=0; i<16; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } memCompo.capacity=(isDSi?16777216:4194304); } diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 22c949f3a..733ba2630 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -106,6 +106,10 @@ void DivPlatformNES::doWrite(unsigned short addr, unsigned char data) { } void DivPlatformNES::acquire_puNES(short** buf, size_t len) { + for (int i=0; i<5; i++) { + oscBuf[i]->begin(len); + } + for (size_t i=0; i=32) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=isMuted[0]?0:(nes->S1.output<<11); - oscBuf[1]->data[oscBuf[1]->needle++]=isMuted[1]?0:(nes->S2.output<<11); - oscBuf[2]->data[oscBuf[2]->needle++]=isMuted[2]?0:(nes->TR.output<<11); - oscBuf[3]->data[oscBuf[3]->needle++]=isMuted[3]?0:(nes->NS.output<<11); - oscBuf[4]->data[oscBuf[4]->needle++]=isMuted[4]?0:(nes->DMC.output<<8); + oscBuf[0]->putSample(i,isMuted[0]?0:(nes->S1.output<<11)); + oscBuf[1]->putSample(i,isMuted[1]?0:(nes->S2.output<<11)); + oscBuf[2]->putSample(i,isMuted[2]?0:(nes->TR.output<<11)); + oscBuf[3]->putSample(i,isMuted[3]?0:(nes->NS.output<<11)); + oscBuf[4]->putSample(i,isMuted[4]?0:(nes->DMC.output<<8)); } } + + for (int i=0; i<5; i++) { + oscBuf[i]->end(len); + } } void DivPlatformNES::acquire_NSFPlay(short** buf, size_t len) { int out1[2]; int out2[2]; + + for (int i=0; i<5; i++) { + oscBuf[i]->begin(len); + } + for (size_t i=0; i=4) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=nes1_NP->out[0]<<11; - oscBuf[1]->data[oscBuf[1]->needle++]=nes1_NP->out[1]<<11; - oscBuf[2]->data[oscBuf[2]->needle++]=nes2_NP->out[0]<<11; - oscBuf[3]->data[oscBuf[3]->needle++]=nes2_NP->out[1]<<11; - oscBuf[4]->data[oscBuf[4]->needle++]=nes2_NP->out[2]<<8; + oscBuf[0]->putSample(i,nes1_NP->out[0]<<11); + oscBuf[1]->putSample(i,nes1_NP->out[1]<<11); + oscBuf[2]->putSample(i,nes2_NP->out[0]<<11); + oscBuf[3]->putSample(i,nes2_NP->out[1]<<11); + oscBuf[4]->putSample(i,nes2_NP->out[2]<<8); } } + + for (int i=0; i<5; i++) { + oscBuf[i]->end(len); + } } void DivPlatformNES::acquire_NSFPlayE(short** buf, size_t len) { int out1[2]; int out2[2]; + + for (int i=0; i<5; i++) { + oscBuf[i]->begin(len); + } + for (size_t i=0; i=4) { writeOscBuf=0; - oscBuf[0]->data[oscBuf[0]->needle++]=e1_NP->out[0]<<11; - oscBuf[1]->data[oscBuf[1]->needle++]=e1_NP->out[1]<<11; - oscBuf[2]->data[oscBuf[2]->needle++]=e2_NP->out[0]<<11; - oscBuf[3]->data[oscBuf[3]->needle++]=e2_NP->out[1]<<11; - oscBuf[4]->data[oscBuf[4]->needle++]=e2_NP->out[2]<<8; + oscBuf[0]->putSample(i,e1_NP->out[0]<<11); + oscBuf[1]->putSample(i,e1_NP->out[1]<<11); + oscBuf[2]->putSample(i,e2_NP->out[0]<<11); + oscBuf[3]->putSample(i,e2_NP->out[1]<<11); + oscBuf[4]->putSample(i,e2_NP->out[2]<<8); } } + + for (int i=0; i<5; i++) { + oscBuf[i]->end(len); + } } void DivPlatformNES::acquire(short** buf, size_t len) { @@ -929,7 +955,7 @@ void DivPlatformNES::setFlags(const DivConfig& flags) { rate/=8; } for (int i=0; i<5; i++) { - oscBuf[i]->rate=rate/(useNP?4:32); + oscBuf[i]->setRate(rate); } dpcmModeDefault=flags.getBool("dpcmMode",true); diff --git a/src/engine/platform/pcmdac.cpp b/src/engine/platform/pcmdac.cpp index a9376ebd9..42b9babd9 100644 --- a/src/engine/platform/pcmdac.cpp +++ b/src/engine/platform/pcmdac.cpp @@ -29,11 +29,14 @@ void DivPlatformPCMDAC::acquire(short** buf, size_t len) { const int depthScale=(15-outDepth); int output=0; + + oscBuf->begin(len); + for (size_t h=0; hdata[oscBuf->needle++]=0; + oscBuf->putSample(h,0); continue; } if (chan[0].useWave || (chan[0].sample>=0 && chan[0].samplesong.sampleLen)) { @@ -229,7 +232,7 @@ void DivPlatformPCMDAC::acquire(short** buf, size_t len) { } else { output=((output*MIN(volMax,chan[0].vol)*MIN(chan[0].envVol,64))>>6)/volMax; } - oscBuf->data[oscBuf->needle++]=((output>>depthScale)<>1; + oscBuf->putSample(h,((output>>depthScale)<>1); if (outStereo) { buf[0][h]=((output*chan[0].panL)>>(depthScale+8))<>(depthScale+8))<end(len); } void DivPlatformPCMDAC::tick(bool sysTick) { @@ -542,7 +547,7 @@ void DivPlatformPCMDAC::setFlags(const DivConfig& flags) { outDepth=(flags.getInt("outDepth",15))&15; outStereo=flags.getBool("stereo",true); interp=flags.getInt("interpolation",0); - oscBuf->rate=rate; + oscBuf->setRate(rate); volMax=flags.getInt("volMax",255); if (volMax<1) volMax=1; } diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index ecbee3ff4..fc78165d7 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -57,6 +57,7 @@ void DivPlatformPET::rWrite(unsigned int addr, unsigned char val) { void DivPlatformPET::acquire(short** buf, size_t len) { bool hwSROutput=((regPool[11]>>2)&7)==4; + oscBuf->begin(len); if (chan[0].enable) { int reload=regPool[8]*2+4; if (!hwSROutput) { @@ -71,7 +72,7 @@ void DivPlatformPET::acquire(short** buf, size_t len) { chan[0].cnt-=SAMP_DIVIDER; } buf[0][h]=chan[0].out; - oscBuf->data[oscBuf->needle++]=chan[0].out; + oscBuf->putSample(h,chan[0].out); } // emulate driver writes to PCR if (!hwSROutput) regPool[12]=chan[0].out?0xe0:0xc0; @@ -79,9 +80,10 @@ void DivPlatformPET::acquire(short** buf, size_t len) { chan[0].out=0; for (size_t h=0; hdata[oscBuf->needle++]=0; + oscBuf->putSample(h,0); } } + oscBuf->end(len); } void DivPlatformPET::writeOutVol() { @@ -311,7 +313,7 @@ int DivPlatformPET::init(DivEngine* p, int channels, int sugRate, const DivConfi rate=chipClock/SAMP_DIVIDER; // = 250000kHz isMuted=false; oscBuf=new DivDispatchOscBuffer; - oscBuf->rate=rate; + oscBuf->setRate(rate); reset(); return 1; } diff --git a/src/engine/platform/pokemini.cpp b/src/engine/platform/pokemini.cpp index cdeb69b99..9e29277e4 100644 --- a/src/engine/platform/pokemini.cpp +++ b/src/engine/platform/pokemini.cpp @@ -88,6 +88,7 @@ void DivPlatformPokeMini::rWrite(unsigned char addr, unsigned char val) { void DivPlatformPokeMini::acquire(short** buf, size_t len) { int out=0; + oscBuf->begin(len); for (size_t i=0; i=pivot && !isMuted[0])?volTable[vol&3]:0; buf[0][i]=out; - oscBuf->data[oscBuf->needle++]=out; + oscBuf->putSample(i,out); } else { buf[0][i]=0; - oscBuf->data[oscBuf->needle++]=0; + oscBuf->putSample(i,0); } } + oscBuf->end(len); } void DivPlatformPokeMini::tick(bool sysTick) { @@ -323,7 +325,7 @@ void DivPlatformPokeMini::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/PCSPKR_DIVIDER; - oscBuf->rate=rate; + oscBuf->setRate(rate); } void DivPlatformPokeMini::notifyInsDeletion(void* ins) { diff --git a/src/engine/platform/pong.cpp b/src/engine/platform/pong.cpp index bfb362dc3..19c478711 100644 --- a/src/engine/platform/pong.cpp +++ b/src/engine/platform/pong.cpp @@ -25,6 +25,7 @@ void DivPlatformPong::acquire(short** buf, size_t len) { int out=0; + oscBuf->begin(len); for (size_t i=0; idata[oscBuf->needle++]=out; + oscBuf->putSample(i,out); } else { buf[0][i]=0; - oscBuf->data[oscBuf->needle++]=0; + oscBuf->putSample(i,0); flip=false; } } + oscBuf->end(len); } void DivPlatformPong::tick(bool sysTick) { @@ -237,7 +239,7 @@ void DivPlatformPong::setFlags(const DivConfig& flags) { chipClock=1000000; CHECK_CUSTOM_CLOCK; rate=chipClock/64; - oscBuf->rate=rate; + oscBuf->setRate(rate); } void DivPlatformPong::notifyInsDeletion(void* ins) { diff --git a/src/engine/platform/powernoise.cpp b/src/engine/platform/powernoise.cpp index a5103b8f9..c7870e31e 100644 --- a/src/engine/platform/powernoise.cpp +++ b/src/engine/platform/powernoise.cpp @@ -82,17 +82,25 @@ const char** DivPlatformPowerNoise::getRegisterSheet() { void DivPlatformPowerNoise::acquire(short** buf, size_t len) { short left, right; + for (int i=0; i<4; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hdata[oscBuf[0]->needle++]=mapAmp((pn.n1.out_latch&0xf)+(pn.n1.out_latch>>4)); - oscBuf[1]->data[oscBuf[1]->needle++]=mapAmp((pn.n2.out_latch&0xf)+(pn.n2.out_latch>>4)); - oscBuf[2]->data[oscBuf[2]->needle++]=mapAmp((pn.n3.out_latch&0xf)+(pn.n3.out_latch>>4)); - oscBuf[3]->data[oscBuf[3]->needle++]=mapAmp((pn.s.out_latch&0xf)+(pn.s.out_latch>>4)); + oscBuf[0]->putSample(h,mapAmp((pn.n1.out_latch&0xf)+(pn.n1.out_latch>>4))); + oscBuf[1]->putSample(h,mapAmp((pn.n2.out_latch&0xf)+(pn.n2.out_latch>>4))); + oscBuf[2]->putSample(h,mapAmp((pn.n3.out_latch&0xf)+(pn.n3.out_latch>>4))); + oscBuf[3]->putSample(h,mapAmp((pn.s.out_latch&0xf)+(pn.s.out_latch>>4))); buf[0][h]=left; buf[1][h]=right; } + + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } } /* macros: @@ -506,7 +514,7 @@ void DivPlatformPowerNoise::setFlags(const DivConfig& flags) { rate=chipClock/coreQuality; for (int i=0; i<4; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/pv1000.cpp b/src/engine/platform/pv1000.cpp index 3c6212dd3..11cab5457 100644 --- a/src/engine/platform/pv1000.cpp +++ b/src/engine/platform/pv1000.cpp @@ -38,13 +38,21 @@ const char** DivPlatformPV1000::getRegisterSheet() { } void DivPlatformPV1000::acquire(short** buf, size_t len) { + for (int i=0; i<3; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; hdata[oscBuf[i]->needle++]=MAX(d65010g031.out[i]<<2,0); + oscBuf[i]->putSample(h,MAX(d65010g031.out[i]<<2,0)); } } + + for (int i=0; i<3; i++) { + oscBuf[i]->end(len); + } } void DivPlatformPV1000::tick(bool sysTick) { @@ -263,7 +271,7 @@ void DivPlatformPV1000::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/1024; for (int i=0; i<3; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } } diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 82dd57b7c..47e67c823 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -265,6 +265,10 @@ const char** DivPlatformQSound::getRegisterSheet() { } void DivPlatformQSound::acquire(short** buf, size_t len) { + for (int i=0; i<19; i++) { + oscBuf[i]->begin(len); + } + for (size_t h=0; h32767) data=32767; - oscBuf[i]->data[oscBuf[i]->needle++]=data; + oscBuf[i]->putSample(h,data); } } + + for (int i=0; i<19; i++) { + oscBuf[i]->end(len); + } } void DivPlatformQSound::tick(bool sysTick) { @@ -861,7 +869,7 @@ int DivPlatformQSound::init(DivEngine* p, int channels, int sugRate, const DivCo reset(); for (int i=0; i<19; i++) { - oscBuf[i]->rate=rate; + oscBuf[i]->setRate(rate); } return 19; } diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 9f00be400..a600d12f9 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -71,7 +71,13 @@ void DivPlatformSAA1099::acquire_saaSound(short** buf, size_t len) { regPool[w.addr&0x1f]=w.val; writes.pop(); } + for (int i=0; i<6; i++) { + oscBuf[i]->begin(len); + } saa_saaSound->GenerateMany((unsigned char*)saaBuf[0],len,oscBuf); + for (int i=0; i<6; i++) { + oscBuf[i]->end(len); + } #ifdef TA_BIG_ENDIAN for (size_t i=0; i>8)); diff --git a/src/engine/platform/sound/lynx/Mikey.cpp b/src/engine/platform/sound/lynx/Mikey.cpp index 791336c1b..bac80792c 100644 --- a/src/engine/platform/sound/lynx/Mikey.cpp +++ b/src/engine/platform/sound/lynx/Mikey.cpp @@ -485,7 +485,7 @@ public: return mAudioChannels[timer].fireAction( tick ); } - AudioSample sampleAudio( DivDispatchOscBuffer** oscb ) const + AudioSample sampleAudio( int* oscb ) const { int left{}; int right{}; @@ -509,7 +509,7 @@ public: } if (oscb!=NULL) { - oscb[i]->data[oscb[i]->needle++]=oscbWrite; + oscb[i]=oscbWrite; } } @@ -570,7 +570,7 @@ void Mikey::enqueueSampling() mQueue->push( ( mNextTick & ~15 ) | 4 ); } -void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size, DivDispatchOscBuffer** oscb ) +void Mikey::sampleAudio( int16_t* bufL, int16_t* bufR, size_t size, int* oscb ) { size_t i = 0; while ( i < size ) diff --git a/src/engine/platform/sound/lynx/Mikey.hpp b/src/engine/platform/sound/lynx/Mikey.hpp index 9d0f6884e..0c002a56e 100644 --- a/src/engine/platform/sound/lynx/Mikey.hpp +++ b/src/engine/platform/sound/lynx/Mikey.hpp @@ -21,7 +21,7 @@ public: ~Mikey(); void write( uint8_t address, uint8_t value ); - void sampleAudio( int16_t* bufL, int16_t* bufR, size_t size, DivDispatchOscBuffer** oscb = NULL ); + void sampleAudio( int16_t* bufL, int16_t* bufR, size_t size, int* oscb = NULL ); uint8_t const* getRegisterPool(); diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index 3bee3dda3..e262f355a 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -460,8 +460,6 @@ void FurnaceGUI::drawChanOsc() { // I have a feeling this could be simplified to two FFTs or even one... // if you know how, please tell me - // TODO: utterly broken! - // initialization double phase=0.0; int displaySize=65536.0f*(fft->windowSize/1000.0f);