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
This commit is contained in:
parent
6be56d78b1
commit
49869c98f3
@ -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 ();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user