continue with MTC debugging
[ardour.git] / libs / ardour / session_transport.cc
index 10429e96395aba3ebbcd5db5663043bdb952e524..69de9ead2efa836303a0cfb769c2210c8de41e94 100644 (file)
 
 #include "pbd/undo.h"
 #include "pbd/error.h"
-#include <glibmm/thread.h>
+#include "pbd/enumwriter.h"
 #include "pbd/pthread_utils.h"
 #include "pbd/memento_command.h"
-#include "pbd/stacktrace.h"
 
 #include "midi++/mmc.h"
 #include "midi++/port.h"
@@ -39,6 +38,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/auditioner.h"
 #include "ardour/butler.h"
+#include "ardour/debug.h"
 #include "ardour/location.h"
 #include "ardour/session.h"
 #include "ardour/slave.h"
@@ -79,9 +79,9 @@ Session::request_input_change_handling ()
 }
 
 void
-Session::request_slave_source (SlaveSource src)
+Session::request_sync_source (SyncSource src)
 {
-       Event* ev = new Event (Event::SetSlaveSource, Event::Add, Event::Immediate, 0, 0.0);
+       Event* ev = new Event (Event::SetSyncSource, Event::Add, Event::Immediate, 0, 0.0);
        bool seamless;
 
        seamless = Config->get_seamless_loop ();
@@ -97,7 +97,7 @@ Session::request_slave_source (SlaveSource src)
        /* save value of seamless from before the switch */
        _was_seamless = seamless;
 
-       ev->slave = src;
+       ev->sync_source = src;
        queue_event (ev);
 }
 
@@ -105,6 +105,7 @@ void
 Session::request_transport_speed (double speed)
 {
        Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, speed);
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1\n", speed));
        queue_event (ev);
 }
 
@@ -120,6 +121,7 @@ void
 Session::request_stop (bool abort, bool clear_state)
 {
        Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0, abort, clear_state);
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport stop, abort = %1, clear state = %2\n", abort, clear_state));
        queue_event (ev);
 }
 
@@ -127,6 +129,7 @@ void
 Session::request_locate (nframes_t target_frame, bool with_roll)
 {
        Event *ev = new Event (with_roll ? Event::LocateRoll : Event::Locate, Event::Add, Event::Immediate, target_frame, 0, false);
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request locate to %1\n", target_frame));
        queue_event (ev);
 }
 
@@ -134,6 +137,7 @@ void
 Session::force_locate (nframes64_t target_frame, bool with_roll)
 {
        Event *ev = new Event (with_roll ? Event::LocateRoll : Event::Locate, Event::Add, Event::Immediate, target_frame, 0, true);
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request forced locate to %1\n", target_frame));
        queue_event (ev);
 }
 
@@ -150,6 +154,7 @@ Session::request_play_loop (bool yn, bool leave_rolling)
        }
 
        ev = new Event (Event::SetLoop, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, leave rolling ? %2\n", yn, leave_rolling));
        queue_event (ev);
 
        if (!leave_rolling && !yn && Config->get_seamless_loop() && transport_rolling()) {
@@ -168,12 +173,14 @@ Session::request_play_range (list<AudioRange>* range, bool leave_rolling)
        } else {
                ev->audio_range.clear ();
        }
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request play range, leave rolling ? %1\n", leave_rolling));
        queue_event (ev);
 }
 
 void
 Session::realtime_stop (bool abort, bool clear_state)
 {
+       DEBUG_TRACE (DEBUG::Transport, "realtime stop\n");
        PostTransportWork todo = PostTransportWork (0);
 
        /* assume that when we start, we'll be moving forwards */
@@ -230,7 +237,7 @@ Session::realtime_stop (bool abort, bool clear_state)
                waiting_for_sync_offset = true;
        }
 
-       transport_sub_state = ((Config->get_slave_source() == None && config.get_auto_return()) ? AutoReturning : 0);
+       transport_sub_state = ((!config.get_external_sync()&& config.get_auto_return()) ? AutoReturning : 0);
 }
 
 void
@@ -245,6 +252,9 @@ Session::butler_transport_work ()
        int on_entry = g_atomic_int_get (&_butler->should_do_transport_work);
        finished = true;
        ptw = post_transport_work();
+
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler transport work, todo = %1\n", enum_2_string (ptw)));
+                    
        if (ptw & PostTransportCurveRealloc) {
                for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
                        (*i)->curve_reallocate();
@@ -439,7 +449,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
        }
 
        bool const auto_return_enabled =
-               (Config->get_slave_source() == None && config.get_auto_return());
+               (!config.get_external_sync() && config.get_auto_return());
 
        if (auto_return_enabled ||
            (ptw & PostTransportLocate) ||
@@ -571,7 +581,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
        /* and start it up again if relevant */
 
-       if ((ptw & PostTransportLocate) && Config->get_slave_source() == None && pending_locate_roll) {
+       if ((ptw & PostTransportLocate) && !config.get_external_sync() && pending_locate_roll) {
                request_transport_speed (1.0);
                pending_locate_roll = false;
        }
@@ -873,6 +883,8 @@ Session::locate (nframes64_t target_frame, bool with_roll, bool with_flush, bool
 void
 Session::set_transport_speed (double speed, bool abort, bool clear_state)
 {
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Set transport speed to %1, abort = %2 clear_state = %3, current = %4\n", speed, abort, clear_state, _transport_speed));
+
        if (_transport_speed == speed) {
                return;
        }
@@ -946,7 +958,9 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state)
 
        } else {
 
-               if (!get_record_enabled() && Config->get_stop_at_session_end() && _transport_frame >= current_end_frame()) {
+               /* if not recording, don't roll forward past end if told to stop there */
+
+               if (!get_record_enabled() && (speed > 0.0 && Config->get_stop_at_session_end() && _transport_frame >= current_end_frame())) {
                        return;
                }
 
@@ -1106,7 +1120,7 @@ Session::post_transport ()
 
        if (ptw & PostTransportLocate) {
 
-               if (((Config->get_slave_source() == None && (auto_play_legal && config.get_auto_play())) && !_exporting) || (ptw & PostTransportRoll)) {
+               if (((!config.get_external_sync() && (auto_play_legal && config.get_auto_play())) && !_exporting) || (ptw & PostTransportRoll)) {
                        start_transport ();
 
                } else {
@@ -1142,9 +1156,8 @@ Session::reset_rf_scale (nframes_t motion)
 }
 
 void
-Session::set_slave_source (SlaveSource src)
+Session::drop_sync_source ()
 {
-       bool reverse = false;
        bool non_rt_required = false;
 
        if (_transport_speed) {
@@ -1152,22 +1165,42 @@ Session::set_slave_source (SlaveSource src)
                return;
        }
 
-//     if (src == JACK && Config->get_jack_time_master()) {
-//             return;
-//     }
-
        delete _slave;
        _slave = 0;
 
-       if (_transport_speed < 0.0) {
-               reverse = true;
+       boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
+       for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
+               if (!(*i)->hidden()) {
+                       if ((*i)->realtime_set_speed ((*i)->speed(), true)) {
+                               non_rt_required = true;
+                       }
+                       (*i)->set_slaved (0);
+               }
+       }
+
+       if (non_rt_required) {
+               add_post_transport_work (PostTransportSpeed);
+               _butler->schedule_transport_work ();
        }
 
-       switch (src) {
-       case None:
-               stop_transport ();
-               break;
+       set_dirty();
+}
 
+void
+Session::use_sync_source (SyncSource src)
+{
+       bool reverse = false;
+       bool non_rt_required = false;
+
+       if (_transport_speed) {
+               error << _("please stop the transport before adjusting slave settings") << endmsg;
+               return;
+       }
+
+       delete _slave;
+       _slave = 0;
+
+       switch (src) {
        case MTC:
                if (_mtc_port) {
                        try {
@@ -1206,8 +1239,6 @@ Session::set_slave_source (SlaveSource src)
 
        };
 
-       Config->set_slave_source (src);
-
        boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
        for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
                if (!(*i)->hidden()) {
@@ -1389,6 +1420,16 @@ Session::xrun_recovery ()
        }
 }
 
+void
+Session::route_processors_changed (RouteProcessorChange c)
+{
+       if (c.type == RouteProcessorChange::MeterPointChange) {
+               return;
+       }
+
+       update_latency_compensation (false, false);
+}
+
 void
 Session::update_latency_compensation (bool with_stop, bool abort)
 {