From 5eae36f0923c95b920dd64a5c483ed9419d370f6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 17 Oct 2024 15:51:04 -0500 Subject: [PATCH] Lynx: direct stream mode --- src/engine/platform/lynx.cpp | 73 ++++++++++++++++++++++++------------ src/engine/platform/lynx.h | 10 +++++ 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 737392e80..03370babb 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -22,7 +22,7 @@ #include "../bsr.h" #include -#define rWrite(a,v) {if (!skipRegisterWrites) {mikey->write(a,v); if (dumpWrites) {addWrite(a,v);}}} +#define rWrite(a,v) {if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);}}} #define WRITE_VOLUME(ch,v) rWrite(0x20+(ch<<3),(v)) #define WRITE_FEEDBACK(ch,v) rWrite(0x21+(ch<<3),(v)) @@ -123,40 +123,64 @@ const char** DivPlatformLynx::getRegisterSheet() { return regCheatSheetLynx; } -void DivPlatformLynx::acquire(short** buf, size_t len) { - for (size_t h=0; h=0 && chan[i].samplesong.sampleLen) { - chan[i].sampleAccum-=chan[i].sampleFreq; - if (chan[i].sampleAccum<0) { - chan[i].sampleAccum+=rate; - DivSample* s=parent->getSample(chan[i].sample); - if (s!=NULL) { - if (isMuted[i]) { +void DivPlatformLynx::processDAC(int sRate) { + for (int i=0; i<4; i++) { + if (chan[i].pcm && chan[i].sample>=0 && chan[i].samplesong.sampleLen) { + chan[i].sampleAccum-=chan[i].sampleFreq; + while (chan[i].sampleAccum<0) { + chan[i].sampleAccum+=sRate; + DivSample* s=parent->getSample(chan[i].sample); + if (s!=NULL) { + if (isMuted[i]) { + WRITE_OUTPUT(i,0); + } else { + if (chan[i].samplePos<0 || chan[i].samplePos>=(int)s->samples) { WRITE_OUTPUT(i,0); } else { - if (chan[i].samplePos<0 || chan[i].samplePos>=(int)s->samples) { - WRITE_OUTPUT(i,0); - } else { - WRITE_OUTPUT(i,CLAMP((s->data8[chan[i].samplePos]*chan[i].outVol)>>7,-128,127)); - } + WRITE_OUTPUT(i,CLAMP((s->data8[chan[i].samplePos]*chan[i].outVol)>>7,-128,127)); } - chan[i].samplePos++; + } + chan[i].samplePos++; - if (s->isLoopable() && chan[i].samplePos>=s->loopEnd) { - chan[i].samplePos=s->loopStart; - } else if (chan[i].samplePos>=(int)s->samples) { - chan[i].sample=-1; - } + if (s->isLoopable() && chan[i].samplePos>=s->loopEnd) { + chan[i].samplePos=s->loopStart; + } else if (chan[i].samplePos>=(int)s->samples) { + chan[i].sample=-1; } } } } + } +} + +void DivPlatformLynx::acquire(short** buf, size_t len) { + for (size_t h=0; hwrite(w.addr,w.val); + writes.pop_front(); + } mikey->sampleAudio(buf[0]+h,buf[1]+h,1,oscBuf); } } +void DivPlatformLynx::fillStream(std::vector& stream, int sRate, size_t len) { + writes.clear(); + for (size_t i=0; i mikey; + struct QueuedWrite { + unsigned char addr; + unsigned char val; + QueuedWrite(): addr(0), val(9) {} + QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + }; + FixedQueue writes; friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); + + void processDAC(int sRate); public: void acquire(short** buf, size_t len); + void fillStream(std::vector& stream, int sRate, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch);