diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 875ff487d..0ad264e53 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -411,6 +411,13 @@ class DivDispatch { */ virtual DivMacroInt* getChanMacroInt(int chan); + /** + * get the stereo panning of a channel. + * @param chan the channel. + * @return a 16-bit number. left in top 8 bits and right in bottom 8 bits. + */ + virtual unsigned short getPan(int chan); + /** * get currently playing sample (and its position). * @param chan the channel. diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 2be22d1f4..a06d9caf0 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -33,6 +33,10 @@ void* DivDispatch::getChanState(int chan) { return NULL; } +unsigned short DivDispatch::getPan(int chan) { + return 0; +} + DivMacroInt* DivDispatch::getChanMacroInt(int chan) { return NULL; } diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 29b62e30a..95a3d7750 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -857,6 +857,10 @@ DivMacroInt* DivPlatformArcade::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformArcade::getPan(int ch) { + return (chan[ch].chVolL<<8)|(chan[ch].chVolR); +} + DivDispatchOscBuffer* DivPlatformArcade::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index b5720f197..39ae3705e 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -75,6 +75,7 @@ class DivPlatformArcade: public DivPlatformOPM { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); void setFlags(const DivConfig& flags); diff --git a/src/engine/platform/c140.cpp b/src/engine/platform/c140.cpp index c9e83338c..ba80284a7 100644 --- a/src/engine/platform/c140.cpp +++ b/src/engine/platform/c140.cpp @@ -344,6 +344,10 @@ DivMacroInt* DivPlatformC140::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformC140::getPan(int ch) { + return (chan[ch].chPanL<<8)|(chan[ch].chPanR); +} + DivDispatchOscBuffer* DivPlatformC140::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/c140.h b/src/engine/platform/c140.h index bb34dac65..1c8ed9079 100644 --- a/src/engine/platform/c140.h +++ b/src/engine/platform/c140.h @@ -74,6 +74,7 @@ class DivPlatformC140: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 4f8745bda..b25e6954c 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -1057,6 +1057,10 @@ DivMacroInt* DivPlatformES5506::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformES5506::getPan(int ch) { + return ((chan[ch].lVol>>4)<<8)|(chan[ch].rVol>>4); +} + void DivPlatformES5506::reset() { while (!hostIntf32.empty()) hostIntf32.pop(); while (!hostIntf8.empty()) hostIntf8.pop(); diff --git a/src/engine/platform/es5506.h b/src/engine/platform/es5506.h index b7658c52f..07bdb2380 100644 --- a/src/engine/platform/es5506.h +++ b/src/engine/platform/es5506.h @@ -295,6 +295,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { virtual int dispatch(DivCommand c) override; virtual void* getChanState(int chan) override; virtual DivMacroInt* getChanMacroInt(int ch) override; + virtual unsigned short getPan(int chan) override; virtual DivDispatchOscBuffer* getOscBuffer(int chan) override; virtual unsigned char* getRegisterPool() override; virtual int getRegisterPoolSize() override; diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 59c950d18..741fe2c3c 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -578,6 +578,11 @@ DivMacroInt* DivPlatformGB::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformGB::getPan(int ch) { + unsigned char p=lastPan&(0x11<=4+extChanOffs) return DivPlatformGenesis::getPan(ch-3); + if (ch>=extChanOffs) return ((opChan[0].pan<<7)&1)|(opChan[0].pan&1); + return DivPlatformGenesis::getPan(ch); +} + DivDispatchOscBuffer* DivPlatformGenesisExt::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index c668d5104..63112c069 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -34,6 +34,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/k007232.cpp b/src/engine/platform/k007232.cpp index d1037988a..fb44a1a0d 100644 --- a/src/engine/platform/k007232.cpp +++ b/src/engine/platform/k007232.cpp @@ -424,6 +424,10 @@ DivMacroInt* DivPlatformK007232::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformK007232::getPan(int ch) { + return ((chan[ch].panning&15)<<8)|((chan[ch].panning&0xf0)>>4); +} + DivDispatchOscBuffer* DivPlatformK007232::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/k007232.h b/src/engine/platform/k007232.h index b1025f574..c8ea8aea7 100644 --- a/src/engine/platform/k007232.h +++ b/src/engine/platform/k007232.h @@ -85,6 +85,7 @@ class DivPlatformK007232: public DivDispatch, public k007232_intf { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/k053260.h b/src/engine/platform/k053260.h index ce531f3d5..27b2a7910 100644 --- a/src/engine/platform/k053260.h +++ b/src/engine/platform/k053260.h @@ -64,6 +64,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { virtual int dispatch(DivCommand c) override; virtual void* getChanState(int chan) override; virtual DivMacroInt* getChanMacroInt(int ch) override; + virtual unsigned short getPan(int chan) override; virtual DivDispatchOscBuffer* getOscBuffer(int chan) override; virtual unsigned char* getRegisterPool() override; virtual int getRegisterPoolSize() override; diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 24ee1f9c4..c8a34d461 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -430,6 +430,10 @@ DivMacroInt* DivPlatformLynx::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformLynx::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivSamplePos DivPlatformLynx::getSamplePos(int ch) { if (ch>=4) return DivSamplePos(); if (!chan[ch].pcm) return DivSamplePos(); diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index c68106dec..e081f7ff7 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -72,6 +72,7 @@ class DivPlatformLynx: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index 6be120c2b..21ff2a9f2 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -62,6 +62,7 @@ class DivPlatformMSM6258: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 5ac493f19..f6b6d062a 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -473,6 +473,11 @@ DivMacroInt* DivPlatformNamcoWSG::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformNamcoWSG::getPan(int ch) { + if (devType!=30) return 0; + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivDispatchOscBuffer* DivPlatformNamcoWSG::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/namcowsg.h b/src/engine/platform/namcowsg.h index 6aaef0952..7d6943323 100644 --- a/src/engine/platform/namcowsg.h +++ b/src/engine/platform/namcowsg.h @@ -62,6 +62,7 @@ class DivPlatformNamcoWSG: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index a417b5088..2298f6132 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -114,6 +114,7 @@ class DivPlatformOPL: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index b6f43e2da..2daba109e 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -508,6 +508,10 @@ DivMacroInt* DivPlatformPCE::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformPCE::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivSamplePos DivPlatformPCE::getSamplePos(int ch) { if (ch>=6) return DivSamplePos(); if (!chan[ch].pcm) return DivSamplePos(); diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index baca77701..f989034af 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -82,6 +82,7 @@ class DivPlatformPCE: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/pcmdac.cpp b/src/engine/platform/pcmdac.cpp index 940efb3e7..1ddd22dae 100644 --- a/src/engine/platform/pcmdac.cpp +++ b/src/engine/platform/pcmdac.cpp @@ -497,6 +497,10 @@ DivMacroInt* DivPlatformPCMDAC::getChanMacroInt(int ch) { return &chan[0].std; } +unsigned short DivPlatformPCMDAC::getPan(int ch) { + return (chan[0].panL<<8)|chan[0].panR; +} + DivSamplePos DivPlatformPCMDAC::getSamplePos(int ch) { if (ch>=1) return DivSamplePos(); return DivSamplePos( diff --git a/src/engine/platform/pcmdac.h b/src/engine/platform/pcmdac.h index 8ef10149c..17513690a 100644 --- a/src/engine/platform/pcmdac.h +++ b/src/engine/platform/pcmdac.h @@ -78,6 +78,7 @@ class DivPlatformPCMDAC: public DivDispatch { void muteChannel(int ch, bool mute); int getOutputCount(); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivSamplePos getSamplePos(int ch); void setFlags(const DivConfig& flags); void notifyInsChange(int ins); diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h index aff53f679..6daccc120 100644 --- a/src/engine/platform/qsound.h +++ b/src/engine/platform/qsound.h @@ -66,6 +66,7 @@ class DivPlatformQSound: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/rf5c68.h b/src/engine/platform/rf5c68.h index 4ba40318c..9c706ccd5 100644 --- a/src/engine/platform/rf5c68.h +++ b/src/engine/platform/rf5c68.h @@ -59,6 +59,7 @@ class DivPlatformRF5C68: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 803a6cad3..b1ba48826 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -365,6 +365,10 @@ DivMacroInt* DivPlatformSAA1099::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformSAA1099::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivDispatchOscBuffer* DivPlatformSAA1099::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index ffd79db72..36db57cb7 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -79,6 +79,7 @@ class DivPlatformSAA1099: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index b9af8a912..5e584e016 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -394,6 +394,10 @@ DivMacroInt* DivPlatformSegaPCM::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformSegaPCM::getPan(int ch) { + return (chan[ch].chPanL<<8)|chan[ch].chPanR; +} + DivSamplePos DivPlatformSegaPCM::getSamplePos(int ch) { if (ch>=16) return DivSamplePos(); if (chan[ch].pcm.sample<0 || chan[ch].pcm.sample>=parent->song.sampleLen) return DivSamplePos(); diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index 067054fe1..639d875b4 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -89,6 +89,7 @@ class DivPlatformSegaPCM: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index 692c0a42c..d87546b30 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -77,6 +77,7 @@ class DivPlatformSMS: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index a32492fcf..1918cb842 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -699,6 +699,10 @@ DivMacroInt* DivPlatformSNES::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformSNES::getPan(int ch) { + return (chan[ch].panL<<8)|chan[ch].panR; +} + DivSamplePos DivPlatformSNES::getSamplePos(int ch) { if (ch>=8) return DivSamplePos(); if (!chan[ch].active) return DivSamplePos(); diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index cec51c0c1..a799c7a5d 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -100,6 +100,7 @@ class DivPlatformSNES: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index d83ae4777..99b784df3 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -105,6 +105,7 @@ class DivPlatformSoundUnit: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 04039e6e5..4e5fb4cca 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -476,6 +476,10 @@ DivMacroInt* DivPlatformSwan::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformSwan::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivDispatchOscBuffer* DivPlatformSwan::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index 72ddae394..1e0fbeef7 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -62,6 +62,7 @@ class DivPlatformSwan: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index 90140da99..f2dfe7120 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -300,6 +300,10 @@ DivMacroInt* DivPlatformT6W28::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformT6W28::getPan(int ch) { + return (chan[ch].panL<<8)|chan[ch].panR; +} + DivDispatchOscBuffer* DivPlatformT6W28::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/t6w28.h b/src/engine/platform/t6w28.h index 33c03a886..4bb3cda2a 100644 --- a/src/engine/platform/t6w28.h +++ b/src/engine/platform/t6w28.h @@ -63,6 +63,7 @@ class DivPlatformT6W28: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 8577d4553..9de7262b3 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -965,6 +965,10 @@ DivMacroInt* DivPlatformTX81Z::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformTX81Z::getPan(int ch) { + return (chan[ch].chVolL<<8)|(chan[ch].chVolR); +} + DivDispatchOscBuffer* DivPlatformTX81Z::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/tx81z.h b/src/engine/platform/tx81z.h index d0bc759c1..c14bc0117 100644 --- a/src/engine/platform/tx81z.h +++ b/src/engine/platform/tx81z.h @@ -65,6 +65,7 @@ class DivPlatformTX81Z: public DivPlatformOPM { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index 9edaf2db4..588676aff 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -419,6 +419,10 @@ DivMacroInt* DivPlatformVB::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformVB::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivDispatchOscBuffer* DivPlatformVB::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vb.h b/src/engine/platform/vb.h index 2efcdd1b8..2282f62fe 100644 --- a/src/engine/platform/vb.h +++ b/src/engine/platform/vb.h @@ -69,6 +69,7 @@ class DivPlatformVB: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/vera.h b/src/engine/platform/vera.h index 227512a73..515e17e56 100644 --- a/src/engine/platform/vera.h +++ b/src/engine/platform/vera.h @@ -64,6 +64,7 @@ class DivPlatformVERA: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 29601ae92..e95d543a4 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -863,6 +863,10 @@ DivMacroInt* DivPlatformX1_010::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformX1_010::getPan(int ch) { + return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); +} + DivDispatchOscBuffer* DivPlatformX1_010::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/x1_010.h b/src/engine/platform/x1_010.h index a3af7b291..cc698b650 100644 --- a/src/engine/platform/x1_010.h +++ b/src/engine/platform/x1_010.h @@ -131,6 +131,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index fc850acf4..e7a8bc6e5 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -80,6 +80,7 @@ class DivPlatformYM2608: public DivPlatformOPN { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + virtual unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 2966f9dfb..7c6e58ce2 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -750,6 +750,12 @@ DivMacroInt* DivPlatformYM2608Ext::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformYM2608Ext::getPan(int ch) { + if (ch>=4+extChanOffs) return DivPlatformYM2608::getPan(ch-3); + if (ch>=extChanOffs) return ((opChan[0].pan<<7)&1)|(opChan[0].pan&1); + return DivPlatformYM2608::getPan(ch); +} + DivDispatchOscBuffer* DivPlatformYM2608Ext::getOscBuffer(int ch) { if (ch>=6) return oscBuf[ch-3]; if (ch<3) return oscBuf[ch]; diff --git a/src/engine/platform/ym2608ext.h b/src/engine/platform/ym2608ext.h index c9348b48f..0c9c1a418 100644 --- a/src/engine/platform/ym2608ext.h +++ b/src/engine/platform/ym2608ext.h @@ -33,6 +33,7 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index 3805aa48a..99b1e73b7 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -48,6 +48,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + virtual unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2610b.h b/src/engine/platform/ym2610b.h index 43c7af828..80c040e77 100644 --- a/src/engine/platform/ym2610b.h +++ b/src/engine/platform/ym2610b.h @@ -44,6 +44,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + virtual unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 2252a09df..98da9bfb9 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -740,6 +740,12 @@ DivMacroInt* DivPlatformYM2610BExt::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformYM2610BExt::getPan(int ch) { + if (ch>=4+extChanOffs) return DivPlatformYM2610B::getPan(ch-3); + if (ch>=extChanOffs) return ((opChan[0].pan<<7)&1)|(opChan[0].pan&1); + return DivPlatformYM2610B::getPan(ch); +} + DivDispatchOscBuffer* DivPlatformYM2610BExt::getOscBuffer(int ch) { if (ch>=(extChanOffs+4)) return oscBuf[ch-3]; if (ch<(extChanOffs+1)) return oscBuf[ch]; diff --git a/src/engine/platform/ym2610bext.h b/src/engine/platform/ym2610bext.h index b14ba99c4..024119cff 100644 --- a/src/engine/platform/ym2610bext.h +++ b/src/engine/platform/ym2610bext.h @@ -33,6 +33,7 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 1713114b7..bf17659be 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -740,6 +740,12 @@ DivMacroInt* DivPlatformYM2610Ext::getChanMacroInt(int ch) { return &chan[ch].std; } +unsigned short DivPlatformYM2610Ext::getPan(int ch) { + if (ch>=4+extChanOffs) return DivPlatformYM2610::getPan(ch-3); + if (ch>=extChanOffs) return ((opChan[0].pan<<7)&1)|(opChan[0].pan&1); + return DivPlatformYM2610::getPan(ch); +} + DivDispatchOscBuffer* DivPlatformYM2610Ext::getOscBuffer(int ch) { if (ch>=(extChanOffs+4)) return oscBuf[ch-3]; if (ch<(extChanOffs+1)) return oscBuf[ch]; diff --git a/src/engine/platform/ym2610ext.h b/src/engine/platform/ym2610ext.h index 2ce887c36..f860a36cd 100644 --- a/src/engine/platform/ym2610ext.h +++ b/src/engine/platform/ym2610ext.h @@ -33,6 +33,7 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void forceIns(); diff --git a/src/engine/platform/ymz280b.h b/src/engine/platform/ymz280b.h index 14a67dc98..913b8ec6e 100644 --- a/src/engine/platform/ymz280b.h +++ b/src/engine/platform/ymz280b.h @@ -59,6 +59,7 @@ class DivPlatformYMZ280B: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + unsigned short getPan(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize();