From 61a1932bced14882e4372afe256a632c7e47ada9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 25 Jan 2022 15:06:29 -0500 Subject: [PATCH] add walkSong --- src/engine/engine.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++ src/engine/engine.h | 3 +++ 2 files changed, 55 insertions(+) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index efc6768e..e234987a 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2026,10 +2026,62 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write } } +void DivEngine::walkSong(int& loopOrder, int& loopRow) { + loopOrder=0; + loopRow=0; + int nextOrder=-1; + int nextRow=0; + int effectVal=0; + DivPattern* pat[DIV_MAX_CHANS]; + for (int i=0; idata[j][5+(l<<1)]; + if (effectVal<0) effectVal=0; + if (pat[k]->data[j][4+(l<<1)]==0x0d) { + nextOrder=i+1; + nextRow=effectVal; + } else if (pat[k]->data[j][4+(l<<1)]==0x0b) { + nextOrder=effectVal; + nextRow=0; + } + } + } + if (nextOrder!=-1) { + if (nextOrder<=i) { + loopOrder=nextOrder; + loopRow=nextRow; + return; + } + i=nextOrder-1; + nextOrder=-1; + break; + } + } + } +} + SafeWriter* DivEngine::saveVGM() { stop(); setOrder(0); isBusy.lock(); + // determine loop point + int loopOrder=0; + int loopRow=0; + walkSong(loopOrder,loopRow); + logI("loop point: %d %d\n",loopOrder,loopRow); + + curOrder=0; + freelance=false; + playing=false; + extValuePresent=false; + remainingLoops=-1; + // play the song ourselves bool done=false; int writeCount=0; diff --git a/src/engine/engine.h b/src/engine/engine.h index 9771474e..eee89cf6 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -257,6 +257,9 @@ class DivEngine { // calculate frequency/period int calcFreq(int base, int pitch, bool period=false); + // find song loop position + void walkSong(int& loopOrder, int& loopRow); + // play void play();