shithub: pt2-clone

Download patch

ref: 96b4a252f20aec887a58d07a5bcd34bb4365c1e0
parent: 844b0885556b8f5ff1f211c08ba52f75bc86a37a
author: Olav Sørensen <olav.sorensen@live.no>
date: Thu Apr 7 08:50:48 EDT 2022

Fix possible out-of-sync between replayer pos and tracker pos

--- a/src/pt2_header.h
+++ b/src/pt2_header.h
@@ -14,7 +14,7 @@
 #include "pt2_unicode.h"
 #include "pt2_palette.h"
 
-#define PROG_VER_STR "1.43"
+#define PROG_VER_STR "1.44"
 
 #ifdef _WIN32
 #define DIR_DELIMITER '\\'
@@ -210,7 +210,10 @@
 	TEXT_EDIT_HEX = 2
 };
 
-int8_t *allocMemForAllSamples(void); // pt2_replayer.c
+// pt2_replayer.c
+int8_t *allocMemForAllSamples(void);
+void setReplayerPosToTrackerPos(void);
+// -------------------------
 
 void restartSong(void);
 void resetSong(void);
--- a/src/pt2_replayer.c
+++ b/src/pt2_replayer.c
@@ -35,6 +35,14 @@
 	0x10, 0x13, 0x16, 0x1A, 0x20, 0x2B, 0x40, 0x80
 };
 
+void setReplayerPosToTrackerPos(void)
+{
+	modPattern = (int8_t)song->currPattern;
+	modOrder = song->currOrder;
+	song->row = song->currRow;
+	song->tick = 0;
+}
+
 int8_t *allocMemForAllSamples(void)
 {
 	// allocate memory for all sample data blocks (+ 2 extra, for quirk + safety)
@@ -707,7 +715,7 @@
 	switch (cmd)
 	{
 		case 0x9: sampleOffset(ch); return; // note the returns here, not breaks!
-		case 0xB: positionJump(ch); return; 
+		case 0xB: positionJump(ch); return;
 		case 0xD: patternBreak(ch); return;
 		case 0xE: E_Commands(ch);   return;
 		case 0xF: setSpeed(ch);     return;
@@ -1270,6 +1278,13 @@
 	posJumpAssert = false;
 	modRenderDone = true;
 
+	/* The replayer is one tick ahead (unfortunately), so if the user was to stop the mod at the previous tick
+	** before a position jump (pattern loop, pattern break, position jump, row 63->0 transition, etc),
+	** it would be possible for the replayer to be at another order/pattern than the tracker.
+	** Let's set the replayer state to the tracker state on mod stop, to fix possible confusion.
+	*/
+	setReplayerPosToTrackerPos();
+
 	doStopSong = false; // just in case this flag was stuck from command F00 (stop song)
 }
 
@@ -1280,9 +1295,10 @@
 
 	audio.tickSampleCounter64 = 0; // zero tick sample counter so that it will instantly initiate a tick
 	song->currRow = song->row = startRow & 0x3F;
-	song->tick = song->speed;
-	ciaSetBPM = -1;
 
+	song->tick = song->speed-1;
+	ciaSetBPM = -1; // fix possibly stuck "set BPM" flag
+
 	editor.playMode = PLAY_MODE_PATTERN;
 	editor.currMode = MODE_PLAY;
 	editor.didQuantize = false;
@@ -1323,8 +1339,6 @@
 
 	doStopIt(false);
 	turnOffVoices();
-	audio.tickSampleCounter64 = 0; // zero tick sample counter so that it will instantly initiate a tick
-	ciaSetBPM = -1;
 
 	if (row != -1)
 	{
@@ -1376,6 +1390,8 @@
 	editor.currMode = oldMode;
 
 	song->tick = song->speed-1;
+	ciaSetBPM = -1; // fix possibly stuck "set BPM" flag
+
 	modRenderDone = false;
 	editor.songPlaying = true;
 	editor.didQuantize = false;
@@ -1382,6 +1398,8 @@
 
 	if (editor.playMode != PLAY_MODE_PATTERN)
 		editor.musicTime64 = 0; // don't reset playback counter in "play/rec pattern" mode
+
+	audio.tickSampleCounter64 = 0; // zero tick sample counter so that it will instantly initiate a tick
 
 	if (audioWasntLocked)
 		unlockAudio();