diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 0b02bb408..a4003a2be 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -382,6 +382,17 @@ DivMacroInt* DivPlatformSegaPCM::getChanMacroInt(int ch) { return &chan[ch].std; } +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(); + if (!pcm.is_playing(ch)) return DivSamplePos(); + return DivSamplePos( + chan[ch].pcm.sample, + pcm.get_addr(ch)-sampleOffSegaPCM[chan[ch].pcm.sample], + 122*(chan[ch].pcm.freq+1) + ); +} + DivDispatchOscBuffer* DivPlatformSegaPCM::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index f99a24df3..9e2ad5df1 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -87,6 +87,7 @@ class DivPlatformSegaPCM: 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/sound/segapcm.cpp b/src/engine/platform/sound/segapcm.cpp index 4dd58eb26..d469e3a15 100644 --- a/src/engine/platform/sound/segapcm.cpp +++ b/src/engine/platform/sound/segapcm.cpp @@ -134,6 +134,18 @@ uint8_t* segapcm_device::get_ram() { return m_ram; } +unsigned int segapcm_device::get_addr(int ch) { + uint8_t *regs = &m_ram[8*ch]; + int offset = (regs[0x86] & m_bankmask) << m_bankshift; + uint32_t addr = (regs[0x85] << 8) | (regs[0x84]) | offset; + return addr; +} + +bool segapcm_device::is_playing(int ch) { + uint8_t *regs = &m_ram[8*ch]; + return !(regs[0x86]&1); +} + void segapcm_device::mute(int ch, bool doMute) { m_muted[ch&15]=doMute; -} \ No newline at end of file +} diff --git a/src/engine/platform/sound/segapcm.h b/src/engine/platform/sound/segapcm.h index 40ca35a4b..819202cd7 100644 --- a/src/engine/platform/sound/segapcm.h +++ b/src/engine/platform/sound/segapcm.h @@ -34,6 +34,8 @@ public: void write(unsigned int offset, uint8_t data); uint8_t read(unsigned int offset); uint8_t* get_ram(); + unsigned int get_addr(int ch); + bool is_playing(int ch); void mute(int ch, bool doMute); // device-level overrides