summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/session_transport.cc23
1 files changed, 16 insertions, 7 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 3b2060d2ac..86ab62e1ef 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -314,6 +314,8 @@ Session::realtime_locate ()
void
Session::butler_transport_work ()
{
+ /* Note: this function executes in the butler thread context */
+
restart:
bool finished;
PostTransportWork ptw;
@@ -329,20 +331,27 @@ Session::butler_transport_work ()
if (ptw & PostTransportLocate) {
- if (get_play_loop() && !Config->get_seamless_loop() && actively_recording()) {
+ if (get_play_loop() && !Config->get_seamless_loop()) {
- /* this locate is happening while we are doing loop
- * recording but with seam-ed (non-seamless) looping.
- * We must flush any data to disk before resetting
- * buffers as part of the pending locate (which happens
- * a little later in this method).
+ DEBUG_TRACE (DEBUG::Butler, "flush loop recording fragment to disk\n");
+
+ /* this locate might be happening while we are
+ * loop recording.
+ *
+ * Non-seamless looping will require a locate (below) that
+ * will reset capture buffers and throw away data.
+ *
+ * Rather than first find all tracks and see if they
+ * have outstanding data, just do a flush anyway. It
+ * may be cheaper this way anyway, and is certainly
+ * more accurate.
*/
bool more_disk_io_to_do = false;
uint32_t errors = 0;
do {
- more_disk_io_to_do = _butler->flush_tracks_to_disk (r, errors, true);
+ more_disk_io_to_do = _butler->flush_tracks_to_disk_after_locate (r, errors);
if (errors) {
break;