From 6ed50d717c0895f53badbe0accbff95b6cb201d7 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 29 Sep 2022 00:27:40 -0500 Subject: [PATCH] fix song stop screwing everything up --- src/engine/engine.cpp | 3 +++ src/engine/engine.h | 2 ++ src/engine/playback.cpp | 24 +++++++++++++++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 46f7ad03a..f368788ac 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -401,6 +401,7 @@ void writePackedCommandValues(SafeWriter* w, const DivCommand& c) { SafeWriter* DivEngine::saveCommand(bool binary) { stop(); repeatPattern=false; + shallStop=false; setOrder(0); BUSY_BEGIN_SOFT; // determine loop point @@ -1873,6 +1874,7 @@ void DivEngine::play() { sPreview.wave=-1; sPreview.pos=0; sPreview.dir=false; + shallStop=false; if (stepPlay==0) { freelance=false; playSub(false); @@ -2031,6 +2033,7 @@ void DivEngine::reset() { speed1=curSubSong->speed1; speed2=curSubSong->speed2; firstTick=false; + shallStop=false; nextSpeed=speed1; divider=60; if (curSubSong->customTempo) { diff --git a/src/engine/engine.h b/src/engine/engine.h index 19d86905a..0cc05eefb 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -327,6 +327,7 @@ class DivEngine { bool lowQuality; bool playing; bool freelance; + bool shallStop; bool speedAB; bool endOfSong; bool consoleMode; @@ -998,6 +999,7 @@ class DivEngine { lowQuality(false), playing(false), freelance(false), + shallStop(false), speedAB(false), endOfSong(false), consoleMode(false), diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index fedfc94eb..b00e09ddd 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -844,15 +844,7 @@ void DivEngine::processRow(int i, bool afterDelay) { break; case 0xff: // stop song - freelance=false; - playing=false; - extValuePresent=false; - stepPlay=0; - remainingLoops=-1; - sPreview.sample=-1; - sPreview.wave=-1; - sPreview.pos=0; - sPreview.dir=false; + shallStop=true; break; } } @@ -1285,6 +1277,20 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) { firstTick=false; + if (shallStop) { + freelance=false; + playing=false; + extValuePresent=false; + stepPlay=0; + remainingLoops=-1; + sPreview.sample=-1; + sPreview.wave=-1; + sPreview.pos=0; + sPreview.dir=false; + ret=true; + return ret; + } + // system tick for (int i=0; itick(subticks==tickMult);