diff --git a/src/engine/platform/ga20.cpp b/src/engine/platform/ga20.cpp index 94306cd98..1bab91e3b 100644 --- a/src/engine/platform/ga20.cpp +++ b/src/engine/platform/ga20.cpp @@ -93,6 +93,52 @@ void DivPlatformGA20::acquire(short** buf, size_t len) { } } +void DivPlatformGA20::acquireDirect(blip_buffer_t** bb, size_t off, size_t len) { + if (ga20BufLenbegin(len); + } + + for (size_t h=off; h>2; + if (out!=oldOut) { + blip_add_delta(bb[0],h,out-oldOut); + oldOut=out; + } + for (int i=0; i<4; i++) { + oscBuf[i]->putSample(h,ga20Buf[i][h]>>1); + } + } + + for (int i=0; i<4; i++) { + oscBuf[i]->end(len); + } +} + u8 DivPlatformGA20::read_byte(u32 address) { if ((sampleMem!=NULL) && (address<0x100000)) { return sampleMem[address&0xfffff]; @@ -375,6 +421,7 @@ void DivPlatformGA20::reset() { memset(regPool,0,32); ga20.device_reset(); delay=0; + oldOut=0; for (int i=0; i<4; i++) { chan[i]=DivPlatformGA20::Channel(); chan[i].std.setEngine(parent); @@ -385,6 +432,10 @@ void DivPlatformGA20::reset() { } } +bool DivPlatformGA20::hasAcquireDirect() { + return true; +} + int DivPlatformGA20::getOutputCount() { return 1; } diff --git a/src/engine/platform/ga20.h b/src/engine/platform/ga20.h index a1c54a11d..4cc212308 100644 --- a/src/engine/platform/ga20.h +++ b/src/engine/platform/ga20.h @@ -59,6 +59,7 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf { bool sampleLoaded[256]; int delay; + int oldOut; short* ga20Buf[4]; size_t ga20BufLen; @@ -74,6 +75,7 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf { void chWrite(unsigned char ch, unsigned int addr, unsigned char val); public: virtual u8 read_byte(u32 address) override; + virtual void acquireDirect(blip_buffer_t** bb, size_t off, size_t len) override; virtual void acquire(short** buf, size_t len) override; virtual int dispatch(DivCommand c) override; virtual void* getChanState(int chan) override; @@ -86,6 +88,7 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf { virtual void forceIns() override; virtual void tick(bool sysTick=true) override; virtual void muteChannel(int ch, bool mute) override; + virtual bool hasAcquireDirect() override; virtual int getOutputCount() override; virtual void notifyInsChange(int ins) override; virtual void notifyWaveChange(int wave) override; diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 4f519774d..e49f8f72d 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -650,10 +650,6 @@ bool DivPlatformPCSpeaker::hasAcquireDirect() { return (speakerType==0 || speakerType==3); } -bool DivPlatformPCSpeaker::isOscBufPositional() { - return (speakerType==0 || speakerType==3); -} - void DivPlatformPCSpeaker::setFlags(const DivConfig& flags) { switch (flags.getInt("clockSel",0)) { case 1: // PC-98 diff --git a/src/engine/platform/pcspkr.h b/src/engine/platform/pcspkr.h index 65300e75f..8d7b1c546 100644 --- a/src/engine/platform/pcspkr.h +++ b/src/engine/platform/pcspkr.h @@ -88,7 +88,6 @@ class DivPlatformPCSpeaker: public DivDispatch { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); bool hasAcquireDirect(); - bool isOscBufPositional(); void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void notifyPlaybackStop();