diff options
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r-- | libs/ardour/session_transport.cc | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index c62e42d5d9..9e5117f9d1 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -85,7 +85,7 @@ using namespace PBD; #define TFSM_EVENT(evtype) { _transport_fsm->enqueue (new TransportFSM::Event (evtype)); } #define TFSM_STOP(abort,clear) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StopTransport,abort,clear)); } -#define TFSM_LOCATE(target,roll,flush,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,roll,flush,loop,force)); } +#define TFSM_LOCATE(target,ltd,flush,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,ltd,flush,loop,force)); } /* ***************************************************************************** * REALTIME ACTIONS (to be called on state transitions) @@ -470,7 +470,7 @@ Session::set_transport_speed (double speed, samplepos_t destination_sample, bool /* jump to start and then roll from there */ - request_locate (location->start(), true); + request_locate (location->start(), MustRoll); return; } } @@ -910,7 +910,7 @@ Session::request_stop (bool abort, bool clear_state, TransportRequestSource orig } void -Session::request_locate (samplepos_t target_sample, bool with_roll, TransportRequestSource origin) +Session::request_locate (samplepos_t target_sample, LocateTransportDisposition ltd, TransportRequestSource origin) { if (synced_to_engine()) { _engine.transport_locate (target_sample); @@ -921,8 +921,27 @@ Session::request_locate (samplepos_t target_sample, bool with_roll, TransportReq return; } - SessionEvent *ev = new SessionEvent (with_roll ? SessionEvent::LocateRoll : SessionEvent::Locate, SessionEvent::Add, SessionEvent::Immediate, target_sample, 0, false); - DEBUG_TRACE (DEBUG::Transport, string_compose ("Request locate to %1\n", target_sample)); + SessionEvent::Type type; + + switch (ltd) { + case MustRoll: + type = SessionEvent::LocateRoll; + break; + case MustStop: + type = SessionEvent::Locate; + break; + case DoTheRightThing: + if (config.get_auto_play()) { + type = SessionEvent::LocateRoll; + } else { + type = SessionEvent::Locate; + } + break; + } + + SessionEvent *ev = new SessionEvent (type, SessionEvent::Add, SessionEvent::Immediate, target_sample, 0, false); + ev->locate_transport_disposition = ltd; + DEBUG_TRACE (DEBUG::Transport, string_compose ("Request locate to %1 ltd = %2\n", target_sample, enum_2_string (ltd))); queue_event (ev); } @@ -954,7 +973,7 @@ Session::request_preroll_record_trim (samplepos_t rec_in, samplecnt_t preroll) samplepos_t pos = std::max ((samplepos_t)0, rec_in - preroll); _preroll_record_trim_len = preroll; maybe_enable_record (); - request_locate (pos, true); + request_locate (pos, MustRoll); set_requested_return_sample (rec_in); } @@ -1367,7 +1386,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) _have_captured = true; } - DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: DS stop\n")); + DEBUG_TRACE (DEBUG::Transport, X_("Butler post-transport-work, non realtime stop\n")); if (abort && did_record) { /* no reason to save the session file when we remove sources @@ -1612,10 +1631,10 @@ Session::set_play_loop (bool yn, bool change_transport_state) crude mechanism. Got a better idea? */ loop_changing = true; - TFSM_LOCATE (loc->start(), true, true, false, true); + TFSM_LOCATE (loc->start(), MustRoll, true, false, true); } else if (!transport_rolling()) { /* loop-is-mode: not rolling, just locate to loop start */ - TFSM_LOCATE (loc->start(), false, true, false, true); + TFSM_LOCATE (loc->start(), MustStop, true, false, true); } } |