From c2764591e0f46cef2a1455d1be9f5d2eaf31beef Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 May 2022 17:02:16 -0500 Subject: [PATCH] ZX beeper: fix overlay drums --- src/engine/platform/zxbeeper.cpp | 24 +++++++++++++----------- src/engine/platform/zxbeeper.h | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index 8f0f5437..676db382 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -40,29 +40,30 @@ const char* DivPlatformZXBeeper::getEffectName(unsigned char effect) { } void DivPlatformZXBeeper::acquire(short* bufL, short* bufR, size_t start, size_t len) { + bool o=false; for (size_t h=start; h=0 && curSamplesong.sampleLen) { if (--curSamplePeriod<0) { DivSample* s=parent->getSample(curSample); - if (s->samples<=0) { + if (s->samples>0) { + sampleOut=(s->data8[curSamplePos++]>0); + if (curSamplePos>=s->samples) curSample=-1; + // 256 bits + if (curSamplePos>2047) curSample=-1; + + curSamplePeriod=15; + } else { curSample=-1; - continue; } - - o=s->data8[curSamplePos++]; - bufL[h]=o?16384:0; - if (curSamplePos>=s->samples) curSample=-1; - // 256 bits - if (curSamplePos>2047) curSample=-1; - - curSamplePeriod=15; } + o=sampleOut; + bufL[h]=o?16384:0; continue; } unsigned short oldPos=chan[curChan].sPosition; + o=false; if (sOffTimer) { sOffTimer--; @@ -282,6 +283,7 @@ void DivPlatformZXBeeper::reset() { curSample=-1; curSamplePos=0; curSamplePeriod=0; + sampleOut=false; } bool DivPlatformZXBeeper::keyOffAffectsArp(int ch) { diff --git a/src/engine/platform/zxbeeper.h b/src/engine/platform/zxbeeper.h index f655a911..9520ea71 100644 --- a/src/engine/platform/zxbeeper.h +++ b/src/engine/platform/zxbeeper.h @@ -71,6 +71,7 @@ class DivPlatformZXBeeper: public DivDispatch { int tempL[32]; int tempR[32]; unsigned char regPool[128]; + bool sampleOut; friend void putDispatchChan(void*,int,int); public: void acquire(short* bufL, short* bufR, size_t start, size_t len);