diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 363f3c366a..58b1321688 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1348,7 +1348,7 @@ protected: void locate (samplepos_t, bool for_loop_end=false, bool force=false, bool with_mmc=true); void stop_transport (bool abort = false, bool clear_state = false); - void start_transport (); + void start_transport (bool after_loop); void butler_completed_transport_work (); void post_locate (); void schedule_butler_for_transport_work (); diff --git a/libs/ardour/ardour/transport_api.h b/libs/ardour/ardour/transport_api.h index 8cd5a4ea91..d9d5121b7c 100644 --- a/libs/ardour/ardour/transport_api.h +++ b/libs/ardour/ardour/transport_api.h @@ -37,7 +37,7 @@ class LIBARDOUR_API TransportAPI virtual void locate (samplepos_t, bool with_loop=false, bool force=false, bool with_mmc=true) = 0; virtual bool should_stop_before_locate () const = 0; virtual void stop_transport (bool abort = false, bool clear_state = false) = 0; - virtual void start_transport () = 0; + virtual void start_transport (bool after_loop) = 0; virtual void butler_completed_transport_work () = 0; virtual void schedule_butler_for_transport_work () = 0; virtual bool should_roll_after_locate () const = 0; diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 93985f21bf..4b3c5307da 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -446,7 +446,7 @@ Session::stop_transport (bool abort, bool clear_state) /** Called from the process thread */ void -Session::start_transport () +Session::start_transport (bool after_loop) { ENSURE_PROCESS_THREAD; DEBUG_TRACE (DEBUG::Transport, "start_transport\n"); @@ -570,15 +570,19 @@ Session::start_transport () DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC4 with speed = %1\n", transport_speed())); - /* emit TransportStateChange signal only when transport is actually rolling */ - SessionEvent* ev = new SessionEvent (SessionEvent::TransportStateChange, SessionEvent::Add, _transport_sample, _transport_sample, 1.0); - queue_event (ev); - - samplepos_t roll_pos = _transport_sample + std::max (_count_in_samples, _remaining_latency_preroll) * (_transport_fsm->will_roll_fowards () ? 1 : -1); - if (roll_pos > 0 && roll_pos != _transport_sample) { - /* and when transport_rolling () == true */ - SessionEvent* ev = new SessionEvent (SessionEvent::TransportStateChange, SessionEvent::Add, roll_pos, roll_pos, 1.0); + if (!after_loop) { + /* emit TransportStateChange signal only when transport is actually rolling */ + SessionEvent* ev = new SessionEvent (SessionEvent::TransportStateChange, SessionEvent::Add, _transport_sample, _transport_sample, 1.0); + cerr << "queueing TSC1 @ " << _transport_sample << endl; queue_event (ev); + + samplepos_t roll_pos = _transport_sample + std::max (_count_in_samples, _remaining_latency_preroll) * (_transport_fsm->will_roll_fowards () ? 1 : -1); + if (roll_pos > 0 && roll_pos != _transport_sample) { + /* and when transport_rolling () == true */ + SessionEvent* ev = new SessionEvent (SessionEvent::TransportStateChange, SessionEvent::Add, roll_pos, roll_pos, 1.0); + cerr << "queueing TSC2 @ " << roll_pos << endl; + queue_event (ev); + } } } diff --git a/libs/ardour/transport_fsm.cc b/libs/ardour/transport_fsm.cc index 2c903b776d..217889dedd 100644 --- a/libs/ardour/transport_fsm.cc +++ b/libs/ardour/transport_fsm.cc @@ -484,7 +484,7 @@ TransportFSM::start_playback () api->set_transport_speed (most_recently_requested_speed); } - api->start_transport(); + api->start_transport (false); } void @@ -688,7 +688,8 @@ TransportFSM::should_roll_after_locate () const void TransportFSM::roll_after_locate () const { - DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("rolling after locate, was for_loop ? %1\n", _last_locate.for_loop_end)); + bool for_loop = _last_locate.for_loop_end; + DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("rolling after locate, was for_loop ? %1\n", for_loop)); current_roll_after_locate_status = boost::none; if (most_recently_requested_speed == std::numeric_limits::max()) { @@ -699,7 +700,7 @@ TransportFSM::roll_after_locate () const } api->set_transport_speed (most_recently_requested_speed); - api->start_transport (); + api->start_transport (for_loop); } void