diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 25aff9899..36aada6b6 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1419,14 +1419,20 @@ void DivEngine::setLoops(int loops) { remainingLoops=loops; } -void DivEngine::playSub() { +void DivEngine::playSub(bool preserveDrift) { reset(); + if (preserveDrift && curOrder==0) return; int goal=curOrder; curOrder=0; curRow=0; + int prevDrift=clockDrift; clockDrift=0; cycles=0; - ticks=1; + if (preserveDrift) { + endOfSong=false; + } else { + ticks=1; + } speedAB=false; playing=true; dispatch->setSkipRegisterWrites(true); @@ -1435,14 +1441,20 @@ void DivEngine::playSub() { } dispatch->setSkipRegisterWrites(false); dispatch->forceIns(); - clockDrift=0; - cycles=0; - ticks=1; + if (preserveDrift) { + clockDrift=prevDrift; + } else { + clockDrift=0; + } + if (!preserveDrift) { + cycles=0; + ticks=1; + } } void DivEngine::play() { isBusy.lock(); - playSub(); + playSub(false); isBusy.unlock(); } @@ -1682,7 +1694,7 @@ void DivEngine::setOrder(unsigned char order) { curOrder=order; if (order>=song.ordersLen) curOrder=0; if (playing) { - playSub(); + playSub(false); } isBusy.unlock(); } diff --git a/src/engine/engine.h b/src/engine/engine.h index 329968900..fe4a9832a 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -113,7 +113,7 @@ class DivEngine { bool perSystemPostEffect(int ch, unsigned char effect, unsigned char effectVal); void renderSamples(); void reset(); - void playSub(); + void playSub(bool preserveDrift); public: DivSong song; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 7b8a47fef..da79d474c 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -697,7 +697,7 @@ bool DivEngine::nextTick() { if (--ticks<=0) { ret=endOfSong; if (endOfSong) { - reset(); + playSub(true); } endOfSong=false; nextRow();