From f1cf125a1d1227cf5af12bb92d34ca85c64a4ffd Mon Sep 17 00:00:00 2001
From: Mark Knoop <mark@markknoop.com>
Date: Sun, 17 May 2020 16:08:49 +0100
Subject: [PATCH] Fix repeated toggling of loop mode

Calling Session::set_play_loop repeatedly (e.g. LLL) should toggle in and out
of loop play. Previously transport needed to be stopped before loop play could
be started for a second or subsequent time. This uses the loop_changing boolean
to flag that Session::non_realtime_stop should not unset the loop.

Also, Session::non_realtime_stop must reset loop_changing to false after use so
it does not affect the next transport action.
---
 libs/ardour/session_transport.cc | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index a5e8f3ea7f..92ab447179 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -1483,6 +1483,9 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 		}
 	}
 
+	/* reset loop_changing so it does not affect next transport action */
+	loop_changing = false;
+
 	if (!_transport_fsm->declicking_for_locate()) {
 
 		DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n"));
@@ -1593,7 +1596,11 @@ Session::set_play_loop (bool yn, bool change_transport_state)
 		merge_event (new SessionEvent (SessionEvent::AutoLoop, SessionEvent::Replace, loc->end(), loc->start(), 0.0f));
 
 		if (!Config->get_loop_is_mode()) {
-			/* args: positition, disposition, flush=true, for_loop_end=false, force=true */
+			if (transport_rolling()) {
+				/* set loop_changing to ensure that non_realtime_stop does not unset_play_loop */
+				loop_changing = true;
+			}
+			/* args: position, disposition, flush=true, for_loop_end=false, force=true */
 			TFSM_LOCATE (loc->start(), MustRoll, true, false, true);
 		} else {
 			if (!transport_rolling()) {
-- 
2.26.2

