diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 127ffc18c..abfe370a7 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -85,10 +85,12 @@ class DivDispatch { * the engine shall resample to the output rate. */ int rate; - virtual void acquire(short** buf, size_t start, size_t len); + virtual void acquire(short* bufL, short* bufR, size_t start, size_t len); virtual int dispatch(DivCommand c); virtual void tick(); + virtual bool isStereo(); + /** * initialize this DivDispatch. * @param parent the parent DivEngine. diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 52a100756..4086edb00 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -1,6 +1,6 @@ #include "../dispatch.h" -void DivDispatch::acquire(short** buf, size_t start, size_t len) { +void DivDispatch::acquire(short* bufL, short* bufR, size_t start, size_t len) { } void DivDispatch::tick() { @@ -10,6 +10,10 @@ int DivDispatch::dispatch(DivCommand c) { return 1; } +bool DivDispatch::isStereo() { + return false; +} + int DivDispatch::init(DivEngine* p, int channels, int sugRate) { return 0; } diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 11fb8cb63..b7c4e9dbc 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -4,11 +4,10 @@ #define FREQ_BASE 277.0f -void DivPlatformC64::acquire(short** buf, size_t start, size_t len) { +void DivPlatformC64::acquire(short* bufL, short* bufR, size_t start, size_t len) { for (size_t i=start; i #include -void DivPlatformDummy::acquire(short** buf, size_t start, size_t len) { +void DivPlatformDummy::acquire(short* bufL, short* bufR, size_t start, size_t len) { for (size_t i=start; i=0x8000)?chan[j].vol:-chan[j].vol)*chan[j].amp; + bufL[i]+=((chan[j].pos>=0x8000)?chan[j].vol:-chan[j].vol)*chan[j].amp; chan[j].pos+=chan[j].freq; } } - buf[1][i]=buf[0][i]; } } diff --git a/src/engine/platform/dummy.h b/src/engine/platform/dummy.h index f220e35a5..626a502d7 100644 --- a/src/engine/platform/dummy.h +++ b/src/engine/platform/dummy.h @@ -15,7 +15,7 @@ class DivPlatformDummy: public DivDispatch { Channel chan[17]; unsigned char chans; public: - void acquire(short** buf, size_t start, size_t len); + void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void tick(); int init(DivEngine* parent, int channels, int sugRate); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 90385cd24..331e31cbe 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -7,11 +7,11 @@ #define FREQ_BASE 8015.85f -void DivPlatformGB::acquire(short** buf, size_t start, size_t len) { +void DivPlatformGB::acquire(short* bufL, short* bufR, size_t start, size_t len) { for (int i=start; iapu_output.final_sample.left<<2; - buf[1][i]=gb->apu_output.final_sample.right<<2; + bufL[i]=gb->apu_output.final_sample.left<<2; + bufR[i]=gb->apu_output.final_sample.right<<2; } } @@ -270,6 +270,10 @@ int DivPlatformGB::dispatch(DivCommand c) { return 1; } +bool DivPlatformGB::isStereo() { + return true; +} + int DivPlatformGB::init(DivEngine* p, int channels, int sugRate) { parent=p; rate=262144; diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index 19e4f519d..aab8fe481 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -36,9 +36,10 @@ class DivPlatformGB: public DivDispatch { GB_gameboy_t* gb; void updateWave(); public: - void acquire(short** buf, size_t start, size_t len); + void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void tick(); + bool isStereo(); int init(DivEngine* parent, int channels, int sugRate); }; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 6aa1b0862..5321303c6 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -12,7 +12,7 @@ static unsigned char konOffs[6]={ 0, 1, 2, 4, 5, 6 }; -void DivPlatformGenesis::acquire(short** buf, size_t start, size_t len) { +void DivPlatformGenesis::acquire(short* bufL, short* bufR, size_t start, size_t len) { static short o[2]; static int os[2]; @@ -63,8 +63,8 @@ void DivPlatformGenesis::acquire(short** buf, size_t start, size_t len) { psgClocks-=rate; } - buf[0][h]=(os[0]<<5)+psgOut; - buf[1][h]=(os[1]<<5)+psgOut; + bufL[h]=(os[0]<<5)+psgOut; + bufR[h]=(os[1]<<5)+psgOut; } } @@ -340,6 +340,10 @@ int DivPlatformGenesis::dispatch(DivCommand c) { return 1; } +bool DivPlatformGenesis::isStereo() { + return true; +} + int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate) { parent=p; rate=213068; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 522c002fb..c4292d47a 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -48,9 +48,10 @@ class DivPlatformGenesis: public DivDispatch { int toFreq(int freq); public: - void acquire(short** buf, size_t start, size_t len); + void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void tick(); + bool isStereo(); int init(DivEngine* parent, int channels, int sugRate); }; #endif diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 185d48ae0..1a256fe4e 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -5,7 +5,7 @@ #define FREQ_BASE 3424.0f -void DivPlatformNES::acquire(short** buf, size_t start, size_t len) { +void DivPlatformNES::acquire(short* bufL, short* bufR, size_t start, size_t len) { for (size_t i=start; iResetTS(0); //printf("tempL: %d tempR: %d\n",tempL,tempR); - buf[0][h]=tempL; - buf[1][h]=tempR; + bufL[h]=tempL; + bufR[h]=tempR; } } @@ -250,6 +250,10 @@ int DivPlatformPCE::dispatch(DivCommand c) { return 1; } +bool DivPlatformPCE::isStereo() { + return true; +} + int DivPlatformPCE::init(DivEngine* p, int channels, int sugRate) { parent=p; rate=1789773; diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 2775dc0bb..8ed9d8a7a 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -50,9 +50,10 @@ class DivPlatformPCE: public DivDispatch { PCE_PSG* pce; void updateWave(int ch); public: - void acquire(short** buf, size_t start, size_t len); + void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void tick(); + bool isStereo(); int init(DivEngine* parent, int channels, int sugRate); }; diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 99cc2a89f..6abbbc20c 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -2,9 +2,8 @@ #include "../engine.h" #include -void DivPlatformSMS::acquire(short** buf, size_t start, size_t len) { - sn->sound_stream_update(buf[0]+start,len); - memcpy(buf[1]+start,buf[0]+start,sizeof(short)*len); +void DivPlatformSMS::acquire(short* bufL, short* bufR, size_t start, size_t len) { + sn->sound_stream_update(bufL+start,len); } int DivPlatformSMS::acquireOne() { diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index a390ca909..33d4a9c40 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -31,7 +31,7 @@ class DivPlatformSMS: public DivDispatch { sn76496_device* sn; public: int acquireOne(); - void acquire(short** buf, size_t start, size_t len); + void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); void tick(); int init(DivEngine* parent, int channels, int sugRate); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index d98339b13..a60320cf7 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -618,11 +618,11 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi while (runLeft) { if (runLeft>=cycles) { runLeft-=cycles; - dispatch->acquire(bbIn,runPos,cycles); + dispatch->acquire(bbIn[0],bbIn[1],runPos,cycles); runPos+=cycles; nextTick(); } else { - dispatch->acquire(bbIn,runPos,runLeft); + dispatch->acquire(bbIn[0],bbIn[1],runPos,runLeft); cycles-=runLeft; break; } @@ -634,20 +634,29 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi prevSample[0]=temp[0]; } - for (size_t i=0; iisStereo()) for (size_t i=0; iisStereo()) { + blip_end_frame(bb[1],runtotal); + blip_read_samples(bb[1],bbOut[1],size,0); + } + + if (dispatch->isStereo()) { + for (size_t i=0; i