From d1234ad59e80dc04c2d5ca17d5066e7434a141d1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 9 Mar 2025 03:58:09 -0500 Subject: [PATCH] SM8521: acquireDirect() --- src/engine/dispatchContainer.cpp | 5 --- src/engine/platform/sm8521.cpp | 60 ++++++++++++++++---------------- src/engine/platform/sm8521.h | 6 ++-- 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index d9d6d3d5e..7811e4b37 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -719,11 +719,6 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do break; case DIV_SYSTEM_SM8521: dispatch=new DivPlatformSM8521; - if (isRender) { - ((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQualityRender",3)); - } else { - ((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQuality",3)); - } break; case DIV_SYSTEM_PV1000: dispatch=new DivPlatformPV1000; diff --git a/src/engine/platform/sm8521.cpp b/src/engine/platform/sm8521.cpp index 5d86e5991..1f572001f 100644 --- a/src/engine/platform/sm8521.cpp +++ b/src/engine/platform/sm8521.cpp @@ -47,7 +47,7 @@ const char** DivPlatformSM8521::getRegisterSheet() { return regCheatSheetSM8521; } -void DivPlatformSM8521::acquire(short** buf, size_t len) { +void DivPlatformSM8521::acquireDirect(blip_buffer_t** bb, size_t len) { while (!writes.empty()) { QueuedWrite w=writes.front(); sm8521_write(&sm8521,w.addr,w.val); @@ -60,8 +60,29 @@ void DivPlatformSM8521::acquire(short** buf, size_t len) { } for (size_t h=0; hputSample(h,sm8521.sg[i].base.out<<7); } @@ -346,6 +367,7 @@ void DivPlatformSM8521::reset() { addWrite(0xffffffff,0); } sm8521_reset(&sm8521); + lastOut=0; rWrite(0x40,0x80); // initialize SGC } @@ -357,6 +379,10 @@ bool DivPlatformSM8521::keyOffAffectsArp(int ch) { return true; } +bool DivPlatformSM8521::hasAcquireDirect() { + return true; +} + void DivPlatformSM8521::notifyWaveChange(int wave) { for (int i=0; i<2; i++) { if (chan[i].wave==wave) { @@ -376,7 +402,7 @@ void DivPlatformSM8521::setFlags(const DivConfig& flags) { chipClock=11059200; CHECK_CUSTOM_CLOCK; antiClickEnabled=!flags.getBool("noAntiClick",false); - rate=chipClock/4/coreQuality; // CKIN -> fCLK(/2) -> Function blocks (/2) + rate=chipClock/4; // CKIN -> fCLK(/2) -> Function blocks (/2) for (int i=0; i<3; i++) { oscBuf[i]->setRate(rate); } @@ -390,32 +416,6 @@ void DivPlatformSM8521::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -void DivPlatformSM8521::setCoreQuality(unsigned char q) { - switch (q) { - case 0: - coreQuality=64; - break; - case 1: - coreQuality=32; - break; - case 2: - coreQuality=16; - break; - case 3: - coreQuality=8; - break; - case 4: - coreQuality=4; - break; - case 5: - coreQuality=1; - break; - default: - coreQuality=8; - break; - } -} - int DivPlatformSM8521::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; diff --git a/src/engine/platform/sm8521.h b/src/engine/platform/sm8521.h index fb5db5df0..8b1f83c2e 100644 --- a/src/engine/platform/sm8521.h +++ b/src/engine/platform/sm8521.h @@ -54,14 +54,14 @@ class DivPlatformSM8521: public DivDispatch { FixedQueue writes; bool antiClickEnabled; - int coreQuality; + int coreQuality, lastOut; struct sm8521_t sm8521; unsigned char regPool[256]; void updateWave(int ch); friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); public: - void acquire(short** buf, size_t len); + void acquireDirect(blip_buffer_t** bb, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); @@ -74,13 +74,13 @@ class DivPlatformSM8521: public DivDispatch { void muteChannel(int ch, bool mute); int getOutputCount(); bool keyOffAffectsArp(int ch); + bool hasAcquireDirect(); void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - void setCoreQuality(unsigned char q); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSM8521();