reinstate "restart seek" behaviour but use a new Session::_seek_counter member variab...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 1 Aug 2017 15:13:35 +0000 (11:13 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 18 Sep 2017 15:40:53 +0000 (11:40 -0400)
libs/ardour/ardour/session.h
libs/ardour/session.cc
libs/ardour/session_transport.cc

index b9e751cb06b92b5889cccac8bd8a0007001e707e..869a2d7230500a91af52efbf4bf274ad0a9d5073 100644 (file)
@@ -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;
index 9a7c493fe9a2285dce0a7dce760e9886e33e6ffa..47bb16b39a8df8872ce2e649766d9287c55ca5e7 100644 (file)
@@ -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)
index 494f1671988ab85057d4e389559a48fffc1deb9b..b2ca0b148403f5d0160457d9b410e84f8953a337 100644 (file)
@@ -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<RouteList> 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);