diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 14f2de80..1ab3d3f6 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -765,6 +765,16 @@ DivMacroInt* DivPlatformAmiga::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformAmiga::getSamplePos(int ch) { + if (ch>=4) return DivSamplePos(); + if (chan[ch].sample<0 || chan[ch].sample>=parent->song.sampleLen) return DivSamplePos(); + return DivSamplePos( + chan[ch].sample, + amiga.dmaLoc[ch]-sampleOff[chan[ch].sample], + chipClock/amiga.audPer[ch] + ); +} + void DivPlatformAmiga::notifyInsChange(int ins) { for (int i=0; i<4; i++) { if (chan[i].ins==ins) { diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index 36ba2253..1c793296 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -137,6 +137,7 @@ class DivPlatformAmiga: public DivDispatch { int getOutputCount(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 18190113..145ab562 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -700,6 +700,15 @@ DivMacroInt* DivPlatformAY8910::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformAY8910::getSamplePos(int ch) { + if (ch>=3) return DivSamplePos(); + return DivSamplePos( + chan[ch].dac.sample, + chan[ch].dac.pos, + chan[ch].dac.rate + ); +} + DivDispatchOscBuffer* DivPlatformAY8910::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index f20a71ea..8f938d0a 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -143,6 +143,7 @@ class DivPlatformAY8910: public DivDispatch { int getOutputCount(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); bool getDCOffRequired(); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 0eb509db..ba4e8099 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -696,6 +696,15 @@ DivMacroInt* DivPlatformAY8930::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformAY8930::getSamplePos(int ch) { + if (ch>=3) return DivSamplePos(); + return DivSamplePos( + chan[ch].dac.sample, + chan[ch].dac.pos, + chan[ch].dac.rate + ); +} + DivDispatchOscBuffer* DivPlatformAY8930::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index 3ffba63e..3b47cf0d 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -145,6 +145,7 @@ class DivPlatformAY8930: public DivDispatch { int getOutputCount(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 9491b07b..089d33e2 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1210,6 +1210,7 @@ DivMacroInt* DivPlatformGenesis::getChanMacroInt(int ch) { } DivSamplePos DivPlatformGenesis::getSamplePos(int ch) { + if (!chan[5].dacMode) return DivSamplePos(); if (ch<5) return DivSamplePos(); if (ch>5 && !softPCM) return DivSamplePos(); return DivSamplePos( diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 7dec2102..a8b2cb88 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -415,6 +415,16 @@ DivMacroInt* DivPlatformLynx::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformLynx::getSamplePos(int ch) { + if (ch>=4) return DivSamplePos(); + if (!chan[ch].pcm) return DivSamplePos(); + return DivSamplePos( + chan[ch].sample, + chan[ch].samplePos, + chan[ch].sampleFreq + ); +} + DivDispatchOscBuffer* DivPlatformLynx::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index 7cde207e..c68106de 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); + DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 2ed98b36..95d48326 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -505,6 +505,16 @@ DivMacroInt* DivPlatformPCE::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformPCE::getSamplePos(int ch) { + if (ch>=6) return DivSamplePos(); + if (!chan[ch].pcm) return DivSamplePos(); + return DivSamplePos( + chan[ch].dacSample, + chan[ch].dacPos, + chan[ch].dacRate + ); +} + DivDispatchOscBuffer* DivPlatformPCE::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index fd4f8132..9b8c610c 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -81,6 +81,7 @@ class DivPlatformPCE: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/pcmdac.cpp b/src/engine/platform/pcmdac.cpp index bf4a1df9..f7b3af71 100644 --- a/src/engine/platform/pcmdac.cpp +++ b/src/engine/platform/pcmdac.cpp @@ -441,6 +441,15 @@ DivMacroInt* DivPlatformPCMDAC::getChanMacroInt(int ch) { return &chan[0].std; } +DivSamplePos DivPlatformPCMDAC::getSamplePos(int ch) { + if (ch>=1) return DivSamplePos(); + return DivSamplePos( + chan[ch].sample, + chan[ch].audPos, + chan[ch].freq + ); +} + void DivPlatformPCMDAC::notifyInsChange(int ins) { if (chan[0].ins==ins) { chan[0].insChanged=true; diff --git a/src/engine/platform/pcmdac.h b/src/engine/platform/pcmdac.h index e32b7b09..f9435e3e 100644 --- a/src/engine/platform/pcmdac.h +++ b/src/engine/platform/pcmdac.h @@ -79,6 +79,7 @@ class DivPlatformPCMDAC: public DivDispatch { void muteChannel(int ch, bool mute); int getOutputCount(); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index b08255d3..912a589e 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -448,6 +448,16 @@ DivMacroInt* DivPlatformVRC6::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformVRC6::getSamplePos(int ch) { + if (ch>=2) return DivSamplePos(); + if (!chan[ch].pcm) return DivSamplePos(); + return DivSamplePos( + chan[ch].dacSample, + chan[ch].dacPos, + chan[ch].dacRate + ); +} + DivDispatchOscBuffer* DivPlatformVRC6::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vrc6.h b/src/engine/platform/vrc6.h index 5688cb5c..5a241610 100644 --- a/src/engine/platform/vrc6.h +++ b/src/engine/platform/vrc6.h @@ -65,6 +65,7 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); + DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize();