summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-02-07 01:12:47 +0000
committerCarl Hetherington <carl@carlh.net>2011-02-07 01:12:47 +0000
commit49869c98f359c68baa4ef6e26f7d5b36c348341c (patch)
treea957b1349c2aa7acb9a4a26e83f4d039b6550449
parent6be56d78b199452e5dba726f2d7aaab2777d2b49 (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.cc11
-rw-r--r--gtk2_ardour/editor_mouse.cc4
-rw-r--r--libs/ardour/ardour/session.h1
-rw-r--r--libs/ardour/session_midi.cc8
-rw-r--r--libs/ardour/session_transport.cc14
-rw-r--r--libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc4
-rw-r--r--libs/surfaces/mackie/mackie_jog_wheel.cc6
-rw-r--r--libs/surfaces/tranzport/wheel.cc4
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);
}
}
}