libardour: default speed requires transport *and* engine speed
Retain engine speed across stop/start/locate, so that it is possible to run a loop at non-unity speed. User must explicitly reset to 1.0 if default speeds are set to !1.0
This commit is contained in:
parent
fb954f50d4
commit
c2aad41e46
|
@ -1354,6 +1354,7 @@ private:
|
||||||
double _engine_speed;
|
double _engine_speed;
|
||||||
double _transport_speed; // only: -1, 0, +1
|
double _transport_speed; // only: -1, 0, +1
|
||||||
double _default_transport_speed;
|
double _default_transport_speed;
|
||||||
|
double _default_engine_speed;
|
||||||
double _last_transport_speed;
|
double _last_transport_speed;
|
||||||
double _signalled_varispeed;
|
double _signalled_varispeed;
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,7 @@ Session::Session (AudioEngine &eng,
|
||||||
, _engine_speed (1.0)
|
, _engine_speed (1.0)
|
||||||
, _transport_speed (0)
|
, _transport_speed (0)
|
||||||
, _default_transport_speed (1.0)
|
, _default_transport_speed (1.0)
|
||||||
|
, _default_engine_speed (1.0)
|
||||||
, _signalled_varispeed (0)
|
, _signalled_varispeed (0)
|
||||||
, auto_play_legal (false)
|
, auto_play_legal (false)
|
||||||
, _requested_return_sample (-1)
|
, _requested_return_sample (-1)
|
||||||
|
|
|
@ -99,15 +99,6 @@ Session::realtime_stop (bool abort, bool clear_state)
|
||||||
DEBUG_TRACE (DEBUG::Transport, string_compose ("realtime stop @ %1 speed = %2\n", _transport_sample, _transport_speed));
|
DEBUG_TRACE (DEBUG::Transport, string_compose ("realtime stop @ %1 speed = %2\n", _transport_sample, _transport_speed));
|
||||||
PostTransportWork todo = PostTransportStop;
|
PostTransportWork todo = PostTransportStop;
|
||||||
|
|
||||||
/* this resets the speed we will start at if just requested to roll
|
|
||||||
* again. Don't do it if we are stopping to locate ... in those
|
|
||||||
* conditions, keep the current default speed so that when we start
|
|
||||||
* again we resume that speed
|
|
||||||
*/
|
|
||||||
if (!_transport_fsm->declicking_for_locate()) {
|
|
||||||
_default_transport_speed = 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call routes */
|
/* call routes */
|
||||||
|
|
||||||
boost::shared_ptr<RouteList> r = routes.reader ();
|
boost::shared_ptr<RouteList> r = routes.reader ();
|
||||||
|
@ -143,7 +134,6 @@ Session::realtime_stop (bool abort, bool clear_state)
|
||||||
reset_punch_loop_constraint ();
|
reset_punch_loop_constraint ();
|
||||||
|
|
||||||
_transport_speed = 0;
|
_transport_speed = 0;
|
||||||
_engine_speed = 1.0;
|
|
||||||
|
|
||||||
g_atomic_int_set (&_playback_load, 100);
|
g_atomic_int_set (&_playback_load, 100);
|
||||||
g_atomic_int_set (&_capture_load, 100);
|
g_atomic_int_set (&_capture_load, 100);
|
||||||
|
@ -189,7 +179,7 @@ Session::locate (samplepos_t target_sample, bool with_roll, bool with_flush, boo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (with_roll) {
|
if (with_roll) {
|
||||||
set_transport_speed (1.0, false, false, false);
|
set_transport_speed (_default_transport_speed, false, false, false);
|
||||||
}
|
}
|
||||||
TFSM_EVENT (TransportFSM::LocateDone);
|
TFSM_EVENT (TransportFSM::LocateDone);
|
||||||
Located (); /* EMIT SIGNAL */
|
Located (); /* EMIT SIGNAL */
|
||||||
|
@ -362,8 +352,8 @@ void
|
||||||
Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default)
|
Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default)
|
||||||
{
|
{
|
||||||
ENSURE_PROCESS_THREAD;
|
ENSURE_PROCESS_THREAD;
|
||||||
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",
|
DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1 from %4 (es = %7) (def %8), abort = %2 clear_state = %3, as_default %6\n",
|
||||||
speed, abort, clear_state, _transport_speed, _transport_sample, as_default, _engine_speed));
|
speed, abort, clear_state, _transport_speed, _transport_sample, as_default, _engine_speed, _default_transport_speed));
|
||||||
|
|
||||||
if ((_engine_speed != 1) && (_engine_speed == fabs (speed)) && (speed * _transport_speed) >= 0) {
|
if ((_engine_speed != 1) && (_engine_speed == fabs (speed)) && (speed * _transport_speed) >= 0) {
|
||||||
/* engine speed is not changing and no direction change, do nothing */
|
/* engine speed is not changing and no direction change, do nothing */
|
||||||
|
@ -392,6 +382,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
|
||||||
if (_transport_speed == speed && new_engine_speed == _engine_speed) {
|
if (_transport_speed == speed && new_engine_speed == _engine_speed) {
|
||||||
if (as_default && speed == 0.0) { // => reset default transport speed. hacky or what?
|
if (as_default && speed == 0.0) { // => reset default transport speed. hacky or what?
|
||||||
_default_transport_speed = 1.0;
|
_default_transport_speed = 1.0;
|
||||||
|
_default_engine_speed = 1.0;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -406,6 +397,9 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_engine_speed = new_engine_speed;
|
_engine_speed = new_engine_speed;
|
||||||
|
if (as_default) {
|
||||||
|
_default_engine_speed = new_engine_speed;
|
||||||
|
}
|
||||||
|
|
||||||
if (transport_rolling() && speed == 0.0) {
|
if (transport_rolling() && speed == 0.0) {
|
||||||
|
|
||||||
|
@ -587,6 +581,7 @@ Session::start_transport ()
|
||||||
maybe_allow_only_punch ();
|
maybe_allow_only_punch ();
|
||||||
|
|
||||||
_transport_speed = _default_transport_speed;
|
_transport_speed = _default_transport_speed;
|
||||||
|
_engine_speed = _default_engine_speed;
|
||||||
|
|
||||||
if (!_engine.freewheeling()) {
|
if (!_engine.freewheeling()) {
|
||||||
Timecode::Time time;
|
Timecode::Time time;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user