diff options
-rw-r--r-- | gtk2_ardour/shuttle_control.cc | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 7 | ||||
-rw-r--r-- | libs/ardour/ardour/session_event.h | 7 | ||||
-rw-r--r-- | libs/ardour/session_process.cc | 2 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 1 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 21 |
6 files changed, 27 insertions, 15 deletions
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc index 68d91ef162..88159fe020 100644 --- a/gtk2_ardour/shuttle_control.cc +++ b/gtk2_ardour/shuttle_control.cc @@ -278,7 +278,7 @@ ShuttleControl::on_button_release_event (GdkEventButton* ev) case 2: if (_session->transport_rolling()) { - _session->request_transport_speed (1.0); + _session->request_transport_speed (1.0, Config->get_shuttle_behaviour() == Wheel); } return true; @@ -479,7 +479,7 @@ ShuttleControl::use_shuttle_fract (bool force) speed = shuttle_max_speed * shuttle_fract; } - _session->request_transport_speed_nonzero (speed); + _session->request_transport_speed_nonzero (speed, true); } bool diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f89c43ac16..7f73d3ae77 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -329,8 +329,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void goto_start (); void use_rf_shuttle_speed (); void allow_auto_play (bool yn); - void request_transport_speed (double speed); - void request_transport_speed_nonzero (double); + void request_transport_speed (double speed, bool as_default = false); + void request_transport_speed_nonzero (double, bool as_default = false); void request_overwrite_buffer (Track *); void adjust_playback_buffering(); void adjust_capture_buffering(); @@ -905,6 +905,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi // varispeed playback double _transport_speed; + double _default_transport_speed; double _last_transport_speed; double _target_transport_speed; CubicInterpolation interpolation; @@ -1210,7 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void start_locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false); void force_locate (framepos_t frame, bool with_roll = false); void set_track_speed (Track *, double speed); - void set_transport_speed (double speed, bool abort = false, bool clear_state = false); + void set_transport_speed (double speed, bool abort = false, bool clear_state = false, bool as_default = false); void stop_transport (bool abort = false, bool clear_state = false); void start_transport (); void realtime_stop (bool abort, bool clear_state); diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h index c917e4b3cf..d8a48123a2 100644 --- a/libs/ardour/ardour/session_event.h +++ b/libs/ardour/ardour/session_event.h @@ -71,6 +71,10 @@ public: bool second_yes_or_no; }; + union { + bool third_yes_or_no; + }; + /* 4 members to handle a multi-group event handled in RT context */ typedef boost::function<void (SessionEvent*)> RTeventCallback; @@ -85,7 +89,7 @@ public: boost::shared_ptr<Region> region; - SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false) + SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false) : type (t) , action (a) , action_frame (when) @@ -93,6 +97,7 @@ public: , speed (spd) , yes_or_no (yn) , second_yes_or_no (yn2) + , third_yes_or_no (yn3) , event_loop (0) {} void set_ptr (void* p) { diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 0c3b0a57ea..6cebc13b0d 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -1065,7 +1065,7 @@ Session::process_event (SessionEvent* ev) case SessionEvent::SetTransportSpeed: - set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no); + set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no, ev->third_yes_or_no); break; case SessionEvent::PunchIn: diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 347c4ee35b..2f69ff2dee 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -169,6 +169,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) _solo_isolated_cnt = 0; g_atomic_int_set (&processing_prohibited, 0); _transport_speed = 0; + _default_transport_speed = 1.0; _last_transport_speed = 0; _target_transport_speed = 0; auto_play_legal = false; diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 20ac737575..27896f6e67 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -103,10 +103,11 @@ Session::request_sync_source (Slave* new_slave) } void -Session::request_transport_speed (double speed) +Session::request_transport_speed (double speed, bool as_default) { SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed); - DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1\n", speed)); + ev->third_yes_or_no = true; + DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed, as_default)); queue_event (ev); } @@ -115,13 +116,13 @@ Session::request_transport_speed (double speed) * be used by callers who are varying transport speed but don't ever want to stop it. */ void -Session::request_transport_speed_nonzero (double speed) +Session::request_transport_speed_nonzero (double speed, bool as_default) { if (speed == 0) { speed = DBL_EPSILON; } - request_transport_speed (speed); + request_transport_speed (speed, as_default); } void @@ -995,10 +996,10 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool * @param speed New speed */ void -Session::set_transport_speed (double speed, bool abort, bool clear_state) +Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default) { - DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4\n", - speed, abort, clear_state, _transport_speed, _transport_frame)); + DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %5\n", + speed, abort, clear_state, _transport_speed, _transport_frame, as_default)); if (_transport_speed == speed) { return; @@ -1098,6 +1099,10 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state) _last_transport_speed = _transport_speed; _transport_speed = speed; + if (as_default) { + _default_transport_speed = speed; + } + boost::shared_ptr<RouteList> rl = routes.reader(); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); @@ -1213,7 +1218,7 @@ Session::start_transport () transport_sub_state |= PendingDeclickIn; - _transport_speed = 1.0; + _transport_speed = _default_transport_speed; _target_transport_speed = _transport_speed; boost::shared_ptr<RouteList> rl = routes.reader(); |