diff options
author | Carl Hetherington <carl@carlh.net> | 2011-02-07 01:12:47 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-02-07 01:12:47 +0000 |
commit | 49869c98f359c68baa4ef6e26f7d5b36c348341c (patch) | |
tree | a957b1349c2aa7acb9a4a26e83f4d039b6550449 | |
parent | 6be56d78b199452e5dba726f2d7aaab2777d2b49 (diff) |
Prevent various things from stopping the transport by requesting a transport speed of exactly 0 when they are really just continuously varying it. Fixes strange playhead behaviour during varispeed when the user varispeeds to exactly 0 and auto-return is triggered.
git-svn-id: svn://localhost/ardour2/branches/3.0@8733 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/ardour_ui2.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 1 | ||||
-rw-r--r-- | libs/ardour/session_midi.cc | 8 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 14 | ||||
-rw-r--r-- | libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc | 4 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_jog_wheel.cc | 6 | ||||
-rw-r--r-- | libs/surfaces/tranzport/wheel.cc | 4 |
8 files changed, 34 insertions, 18 deletions
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 4cd9b71307..1a9b7e53dd 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -816,17 +816,16 @@ ARDOUR_UI::use_shuttle_fract (bool force) last_shuttle_request = now; + double speed = 0; + if (Config->get_shuttle_units() == Semitones) { const double step = 1.0 / 24.0; // range is 24 semitones up & down double semitones; - double speed; semitones = round (shuttle_fract / step); speed = pow (2.0, (semitones / 12.0)); - _session->request_transport_speed (speed); - } else { bool neg; @@ -840,9 +839,11 @@ ARDOUR_UI::use_shuttle_fract (bool force) fract = -fract; } - _session->request_transport_speed (shuttle_max_speed * fract); + speed = shuttle_max_speed * fract; } - + + _session->request_transport_speed_nonzero (speed); + shuttle_box.queue_draw (); } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index d1d9afc985..e73975ba85 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1920,7 +1920,7 @@ Editor::scrub (framepos_t frame, double current_x) scrub_reverse_distance = 0; delta = 0.01 * (last_scrub_x - current_x); - _session->request_transport_speed (_session->transport_speed() - delta); + _session->request_transport_speed_nonzero (_session->transport_speed() - delta); } } else { @@ -1939,7 +1939,7 @@ Editor::scrub (framepos_t frame, double current_x) scrub_reverse_distance = 0; delta = 0.01 * (current_x - last_scrub_x); - _session->request_transport_speed (_session->transport_speed() + delta); + _session->request_transport_speed_nonzero (_session->transport_speed() + delta); } } diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index ba39ee47f9..44ab172720 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -303,6 +303,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi 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_overwrite_buffer (Track *); void adjust_playback_buffering(); void adjust_capture_buffering(); diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 8dfcec3b5b..ae6d383092 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -235,7 +235,7 @@ Session::mmc_step (MIDI::MachineControl &/*mmc*/, int steps) << endl; #endif - request_transport_speed (step_speed); + request_transport_speed_nonzero (step_speed); last_mmc_step = now; if (!step_queued) { @@ -317,9 +317,9 @@ Session::mmc_shuttle (MIDI::MachineControl &/*mmc*/, float speed, bool forw) } if (forw) { - request_transport_speed (speed); + request_transport_speed_nonzero (speed); } else { - request_transport_speed (-speed); + request_transport_speed_nonzero (-speed); } } @@ -535,7 +535,7 @@ Session::mmc_step_timeout () /* slow it down */ - request_transport_speed (_transport_speed * 0.75); + request_transport_speed_nonzero (_transport_speed * 0.75); return true; } diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index de94db6f07..0aab6a7e27 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -107,6 +107,20 @@ Session::request_transport_speed (double speed) queue_event (ev); } +/** Request a new transport speed, but if the speed parameter is exactly zero then use + * a very small +ve value to prevent the transport actually stopping. This method should + * 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) +{ + if (speed == 0) { + speed = DBL_EPSILON; + } + + request_transport_speed (speed); +} + void Session::request_track_speed (Track* tr, double speed) { diff --git a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc index 7bda9a3e5d..550daef37b 100644 --- a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc +++ b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc @@ -1708,13 +1708,13 @@ TranzportControlProtocol::shuttle () if (session->transport_speed() < 0) { session->request_transport_speed (1.0); } else { - session->request_transport_speed (session->transport_speed() + 0.1); + session->request_transport_speed_nonzero (session->transport_speed() + 0.1); } } else { if (session->transport_speed() > 0) { session->request_transport_speed (-1.0); } else { - session->request_transport_speed (session->transport_speed() - 0.1); + session->request_transport_speed_nonzero (session->transport_speed() - 0.1); } } } diff --git a/libs/surfaces/mackie/mackie_jog_wheel.cc b/libs/surfaces/mackie/mackie_jog_wheel.cc index 13ea85a7e9..95ab97c5f7 100644 --- a/libs/surfaces/mackie/mackie_jog_wheel.cc +++ b/libs/surfaces/mackie/mackie_jog_wheel.cc @@ -76,7 +76,7 @@ void JogWheel::jog_event (SurfacePort &, Control &, const ControlState & state) } // translate _transport_speed speed to a signed transport velocity - _mcp.get_session().request_transport_speed( transport_speed() * transport_direction() ); + _mcp.get_session().request_transport_speed_nonzero (transport_speed() * transport_direction()); break; case scrub: @@ -86,7 +86,7 @@ void JogWheel::jog_event (SurfacePort &, Control &, const ControlState & state) add_scrub_interval( _scrub_timer.restart() ); // x clicks per second => speed == 1.0 float speed = _mcp.surface().scrub_scaling_factor() / average_scrub_interval() * state.ticks; - _mcp.get_session().request_transport_speed( speed * state.sign ); + _mcp.get_session().request_transport_speed_nonzero (speed * state.sign); } else { @@ -99,7 +99,7 @@ void JogWheel::jog_event (SurfacePort &, Control &, const ControlState & state) case shuttle: _shuttle_speed = _mcp.get_session().transport_speed(); _shuttle_speed += _mcp.surface().scaled_delta( state, _mcp.get_session().transport_speed() ); - _mcp.get_session().request_transport_speed( _shuttle_speed ); + _mcp.get_session().request_transport_speed_nonzero (_shuttle_speed); break; case select: diff --git a/libs/surfaces/tranzport/wheel.cc b/libs/surfaces/tranzport/wheel.cc index 87b935da4b..baa4ba079b 100644 --- a/libs/surfaces/tranzport/wheel.cc +++ b/libs/surfaces/tranzport/wheel.cc @@ -194,13 +194,13 @@ TranzportControlProtocol::shuttle () if (session->transport_speed() < 0) { session->request_transport_speed (1.0); } else { - session->request_transport_speed (session->transport_speed() + 0.1); + session->request_transport_speed_nonzero (session->transport_speed() + 0.1); } } else { if (session->transport_speed() > 0) { session->request_transport_speed (-1.0); } else { - session->request_transport_speed (session->transport_speed() - 0.1); + session->request_transport_speed_nonzero (session->transport_speed() - 0.1); } } } |