diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 1ab3d3f6..b04eefbe 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -768,10 +768,12 @@ DivMacroInt* DivPlatformAmiga::getChanMacroInt(int ch) { DivSamplePos DivPlatformAmiga::getSamplePos(int ch) { if (ch>=4) return DivSamplePos(); if (chan[ch].sample<0 || chan[ch].sample>=parent->song.sampleLen) return DivSamplePos(); + int audPer=amiga.audPer[ch]; + if (audPer<1) audPer=1; return DivSamplePos( chan[ch].sample, amiga.dmaLoc[ch]-sampleOff[chan[ch].sample], - chipClock/amiga.audPer[ch] + chipClock/audPer ); } diff --git a/src/engine/platform/ga20.cpp b/src/engine/platform/ga20.cpp index 9da33543..527e80f1 100644 --- a/src/engine/platform/ga20.cpp +++ b/src/engine/platform/ga20.cpp @@ -336,6 +336,18 @@ DivMacroInt* DivPlatformGA20::getChanMacroInt(int ch) { return &chan[ch].std; } +DivSamplePos DivPlatformGA20::getSamplePos(int ch) { + if (ch>=4) return DivSamplePos(); + if (chan[ch].sample<0 || chan[ch].sample>=parent->song.sampleLen) return DivSamplePos(); + if (!ga20.is_playing(ch)) return DivSamplePos(); + unsigned char f=chan[ch].freq; + return DivSamplePos( + chan[ch].sample, + ga20.get_position(ch)-sampleOffGA20[chan[ch].sample], + chipClock/(4*(0x100-(int)f)) + ); +} + DivDispatchOscBuffer* DivPlatformGA20::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/ga20.h b/src/engine/platform/ga20.h index 9cd6869a..1e06378f 100644 --- a/src/engine/platform/ga20.h +++ b/src/engine/platform/ga20.h @@ -78,6 +78,7 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf { virtual int dispatch(DivCommand c) override; virtual void* getChanState(int chan) override; virtual DivMacroInt* getChanMacroInt(int ch) override; + virtual DivSamplePos getSamplePos(int ch) override; virtual DivDispatchOscBuffer* getOscBuffer(int chan) override; virtual unsigned char* getRegisterPool() override; virtual int getRegisterPoolSize() override; diff --git a/src/engine/platform/sound/ga20/iremga20.h b/src/engine/platform/sound/ga20/iremga20.h index dc29d86f..1a27891e 100644 --- a/src/engine/platform/sound/ga20/iremga20.h +++ b/src/engine/platform/sound/ga20/iremga20.h @@ -39,12 +39,19 @@ public: u8 read(u32 offset); inline void set_mute(const int ch, const bool mute) { m_channel[ch & 3].mute = mute; } + inline unsigned int get_position(const int ch) { + return m_channel[ch&3].pos; + } + inline bool is_playing(const int ch) { + return m_channel[ch&3].play; + } // device-level overrides void device_reset(); // sound stream update overrides void sound_stream_update(short** outputs, int len); + private: struct channel_def