From 591cd633d7d380496e529ae8c857de7becd8e2f3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 19 Mar 2023 16:49:31 -0500 Subject: [PATCH] SegaPCM: implement getSamplePos() --- src/engine/platform/segapcm.cpp | 11 +++++++++++ src/engine/platform/segapcm.h | 1 + src/engine/platform/sound/segapcm.cpp | 14 +++++++++++++- src/engine/platform/sound/segapcm.h | 2 ++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 0b02bb40..a4003a2b 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 f99a24df..9e2ad5df 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 4dd58eb2..d469e3a1 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 40ca35a4..819202cd 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