From f8de3e0c6ef093986b83e86cd72bf8bc8b839561 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 1 Aug 2017 11:13:35 -0400 Subject: [PATCH] reinstate "restart seek" behaviour but use a new Session::_seek_counter member variable for this --- libs/ardour/ardour/session.h | 1 + libs/ardour/session.cc | 1 + libs/ardour/session_transport.cc | 18 ++++++++++++++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index b9e751cb06..869a2d7230 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1242,6 +1242,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop int transport_sub_state; mutable gint _record_status; framepos_t _transport_frame; + gint _seek_counter; Location* _session_range_location; ///< session range, or 0 if there is nothing in the session yet bool _session_range_end_is_free; Slave* _slave; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 9a7c493fe9..47bb16b39a 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -181,6 +181,7 @@ Session::Session (AudioEngine &eng, , transport_sub_state (0) , _record_status (Disabled) , _transport_frame (0) + , _seek_counter (0) , _session_range_location (0) , _session_range_end_is_free (true) , _slave (0) diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 494f167198..b2ca0b1484 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -584,23 +584,34 @@ Session::non_realtime_locate () microseconds_t begin = get_microseconds (); - - const framepos_t tf = _transport_frame; + framepos_t tf; { boost::shared_ptr rl = routes.reader(); + restart: + gint sc = g_atomic_int_get (&_seek_counter); + tf = _transport_frame; cerr << "\n\n >>> START Non-RT locate on routes to " << tf << "\n\n"; for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { (*i)->non_realtime_locate (tf); + if (sc != g_atomic_int_get (&_seek_counter)) { + cerr << "\n\n RESTART locate, new seek delivered\n"; + goto restart; + } } cerr << "\n\n <<< DONE Non-RT locate on routes\n\n"; } { + /* VCAs are quick to locate because they have no data (except + automation) associated with them. Don't bother with a + restart mechanism here, but do use the same transport frame + that the Routes used. + */ VCAList v = _vca_manager->vcas (); for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) { (*i)->non_realtime_locate (tf); @@ -1241,6 +1252,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool // Update Timecode time _transport_frame = target_frame; + // Bump seek counter so that any in-process locate in the butler + // thread(s?) can restart. + g_atomic_int_inc (&_seek_counter); _last_roll_or_reversal_location = target_frame; timecode_time(_transport_frame, transmitting_timecode_time); -- 2.30.2