diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-02-20 00:25:25 -0700 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-02-20 00:25:25 -0700 |
commit | 4b10beec08c9c1d5ba6fd9cdb8c95ff019b00f65 (patch) | |
tree | 04265a39e6a0cf1d2a7eb14a3449d080c2f39387 /libs/ardour/session_transport.cc | |
parent | efd6a856f895aa125de6b95c635e0368ef057d0c (diff) |
change transport API, session API, transportFSM API to move reverse management and motion state (partially) into TFSM
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r-- | libs/ardour/session_transport.cc | 67 |
1 files changed, 21 insertions, 46 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 1b7f3c7593..2cc62118b5 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -99,10 +99,9 @@ Session::realtime_stop (bool abort, bool clear_state) DEBUG_TRACE (DEBUG::Transport, string_compose ("realtime stop @ %1 speed = %2\n", _transport_sample, _transport_speed)); PostTransportWork todo = PostTransportWork (0); - if (_last_transport_speed < 0.0f) { - todo = (PostTransportWork (todo | PostTransportStop | PostTransportReverse)); + if (_transport_speed < 0.0f) { + todo = (PostTransportWork (todo | PostTransportStop)); _default_transport_speed = 1.0; - DiskReader::inc_no_disk_output (); // for the buffer reversal } else { todo = PostTransportWork (todo | PostTransportStop); } @@ -195,7 +194,7 @@ Session::locate (samplepos_t target_sample, bool with_roll, bool with_flush, boo */ if (with_roll) { - set_transport_speed (1.0, 0, false); + set_transport_speed (1.0, false, false, false); } loop_changing = false; TFSM_EVENT (TransportFSM::LocateDone); @@ -383,11 +382,17 @@ void Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default) { ENSURE_PROCESS_THREAD; - DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %6\n", - speed, abort, clear_state, _transport_speed, _transport_sample, as_default)); + DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1 from %4 (es = %7), abort = %2 clear_state = %3, as_default %6\n", + speed, abort, clear_state, _transport_speed, _transport_sample, as_default, _engine_speed)); + + if ((_engine_speed != 1) && (_engine_speed == fabs (speed)) && (speed * _transport_speed) >= 0) { + /* engine speed is not changing and no direction change, do nothing */ + DEBUG_TRACE (DEBUG::Transport, "no reason to change speed, do nothing\n"); + return; + } /* max speed is somewhat arbitrary but based on guestimates regarding disk i/o capability - and user needs. We really need CD-style "skip" playback for ffwd and rewind. + and user needs. XXX We really need CD-style "skip" playback for ffwd and rewind. */ if (speed > 0) { @@ -397,6 +402,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a } double new_engine_speed = 1.0; + if (speed != 0) { new_engine_speed = fabs (speed); if (speed < 0) speed = -1; @@ -510,26 +516,12 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a before the last stop, then we have to do extra work. */ - PostTransportWork todo = PostTransportWork (0); - - if ((_transport_speed && speed * _transport_speed < 0.0) || (_last_transport_speed * speed < 0.0) || (_last_transport_speed == 0.0 && speed < 0.0)) { - todo = PostTransportWork (todo | PostTransportReverse); - DiskReader::inc_no_disk_output (); // for the buffer reversal - _last_roll_or_reversal_location = _transport_sample; - } - - _last_transport_speed = _transport_speed; _transport_speed = speed; if (as_default) { _default_transport_speed = speed; } - if (todo) { - add_post_transport_work (todo); - TFSM_EVENT (TransportFSM::ButlerRequired); - } - DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC3 with speed = %1\n", _transport_speed)); /* throttle signal emissions. @@ -537,7 +529,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a * usually changes every cycle (tiny amounts due to DLL). * Emitting a signal every cycle is overkill and unwarranted. * - * Using _last_transport_speed is not acceptable, + * Using _transport_speed is not acceptable, * since it allows for large changes over a long period * of time. Hence we introduce a dedicated variable to keep track * @@ -713,7 +705,7 @@ Session::butler_completed_transport_work () bool start_after_butler_done_msg = false; - if ((ptw & (PostTransportReverse|PostTransportRoll))) { + if (ptw & PostTransportRoll) { start_after_butler_done_msg = true; } @@ -1188,29 +1180,6 @@ Session::butler_transport_work () } } - if (ptw & PostTransportReverse) { - - clear_clicks(); - - /* don't seek if locate will take care of that in non_realtime_stop() */ - - if (!(ptw & PostTransportLocate)) { - for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - (*i)->non_realtime_locate (_transport_sample); - - if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) { - /* new request, stop seeking, and start again */ - g_atomic_int_dec_and_test (&_butler->should_do_transport_work); - goto restart; - } - } - VCAList v = _vca_manager->vcas (); - for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) { - (*i)->non_realtime_locate (_transport_sample); - } - } - } - if (ptw & PostTransportLocate) { DEBUG_TRACE (DEBUG::Transport, "nonrealtime locate invoked from BTW\n"); non_realtime_locate (); @@ -2043,3 +2012,9 @@ Session::declick_in_progress () const { return _transport_fsm->declick_in_progress(); } + +bool +Session::transport_will_roll_forwards () const +{ + return _transport_fsm->will_roll_fowards (); +} |