BubSys: acquireDirect()

This commit is contained in:
tildearrow 2025-03-09 04:16:41 -05:00
parent ef1fae3bee
commit 418780b82b
3 changed files with 28 additions and 17 deletions

View file

@ -45,7 +45,7 @@ class k005289_core : public vgsound_emu_core
// getters // getters
inline u8 addr() { return m_addr; } inline u8 addr() { return m_addr; }
private: public:
// registers // registers
u8 m_addr = 0; // external address pin u8 m_addr = 0; // external address pin
u16 m_pitch = 0; // pitch u16 m_pitch = 0; // pitch
@ -77,7 +77,7 @@ class k005289_core : public vgsound_emu_core
// 1QA...E/2QA...E pin // 1QA...E/2QA...E pin
inline u8 addr(int voice) { return m_timer[voice & 1].addr(); } inline u8 addr(int voice) { return m_timer[voice & 1].addr(); }
private: public:
std::array<timer_t, 2> m_timer; std::array<timer_t, 2> m_timer;
}; };

View file

@ -39,15 +39,25 @@ const char** DivPlatformBubSysWSG::getRegisterSheet() {
return regCheatSheetBubSysWSG; return regCheatSheetBubSysWSG;
} }
void DivPlatformBubSysWSG::acquire(short** buf, size_t len) { void DivPlatformBubSysWSG::acquireDirect(blip_buffer_t** bb, size_t len) {
int chanOut=0; int chanOut=0;
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->begin(len); oscBuf[i]->begin(len);
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
int advance=len-h;
// heuristic
for (int i=0; i<2; i++) {
const int remain=k005289.m_timer[i].m_counter;
if (remain<advance) advance=remain;
}
if (advance<1) advance=1;
signed int out=0; signed int out=0;
// K005289 part // K005289 part
k005289.tick(coreQuality); k005289.tick(advance);
h+=advance-1;
// Wavetable part // Wavetable part
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
@ -57,21 +67,16 @@ void DivPlatformBubSysWSG::acquire(short** buf, size_t len) {
} else { } else {
chanOut=chan[i].waveROM[k005289.addr(i)]*(regPool[2+i]&0xf); chanOut=chan[i].waveROM[k005289.addr(i)]*(regPool[2+i]&0xf);
out+=chanOut; out+=chanOut;
if (writeOscBuf==0) { oscBuf[i]->putSample(h,chanOut<<7);
oscBuf[i]->putSample(h,chanOut<<7);
}
} }
} }
if (++writeOscBuf>=8) writeOscBuf=0;
out<<=6; // scale output to 16 bit out<<=6; // scale output to 16 bit
if (out<-32768) out=-32768; if (out!=lastOut) {
if (out>32767) out=32767; blip_add_delta(bb[0],h,out-lastOut);
lastOut=out;
//printf("out: %d\n",out); }
buf[0][h]=out;
} }
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->end(len); oscBuf[i]->end(len);
@ -310,6 +315,7 @@ void DivPlatformBubSysWSG::reset() {
addWrite(0xffffffff,0); addWrite(0xffffffff,0);
} }
k005289.reset(); k005289.reset();
lastOut=0;
} }
int DivPlatformBubSysWSG::getOutputCount() { int DivPlatformBubSysWSG::getOutputCount() {
@ -320,6 +326,10 @@ bool DivPlatformBubSysWSG::keyOffAffectsArp(int ch) {
return true; return true;
} }
bool DivPlatformBubSysWSG::hasAcquireDirect() {
return true;
}
void DivPlatformBubSysWSG::notifyWaveChange(int wave) { void DivPlatformBubSysWSG::notifyWaveChange(int wave) {
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
if (chan[i].wave==wave) { if (chan[i].wave==wave) {
@ -338,7 +348,7 @@ void DivPlatformBubSysWSG::notifyInsDeletion(void* ins) {
void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) { void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) {
chipClock=COLOR_NTSC; chipClock=COLOR_NTSC;
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/coreQuality; rate=chipClock;
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->setRate(rate); oscBuf[i]->setRate(rate);
} }

View file

@ -38,14 +38,14 @@ class DivPlatformBubSysWSG: public DivDispatch {
bool isMuted[2]; bool isMuted[2];
unsigned char writeOscBuf; unsigned char writeOscBuf;
int coreQuality; int coreQuality, lastOut;
k005289_core k005289; k005289_core k005289;
unsigned short regPool[4]; unsigned short regPool[4];
void updateWave(int ch); void updateWave(int ch);
friend void putDispatchChip(void*,int); friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int); friend void putDispatchChan(void*,int,int);
public: public:
void acquire(short** buf, size_t len); void acquireDirect(blip_buffer_t** bb, size_t len);
int dispatch(DivCommand c); int dispatch(DivCommand c);
void* getChanState(int chan); void* getChanState(int chan);
DivDispatchOscBuffer* getOscBuffer(int chan); DivDispatchOscBuffer* getOscBuffer(int chan);
@ -58,6 +58,7 @@ class DivPlatformBubSysWSG: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
int getOutputCount(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
bool hasAcquireDirect();
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);