summaryrefslogtreecommitdiff
path: root/libs/ardour/session_transport.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-10-29 18:32:17 +0100
committerRobin Gareus <robin@gareus.org>2017-10-29 20:04:03 +0100
commit6e118448890222518cd150283b31799cd3a7a798 (patch)
tree9895cda4302fee77855d22e9ce8fef3eb14b37e0 /libs/ardour/session_transport.cc
parent927788a0b0bf6a621e7cee60365f4e8cbd67d829 (diff)
Quick hack to test engine vari-speed (1/2)
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r--libs/ardour/session_transport.cc43
1 files changed, 28 insertions, 15 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index e7475ffc2c..b777097e98 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -323,6 +323,7 @@ Session::realtime_stop (bool abort, bool clear_state)
_transport_speed = 0;
_target_transport_speed = 0;
+ _engine_speed = 1.0;
g_atomic_int_set (&_playback_load, 100);
g_atomic_int_set (&_capture_load, 100);
@@ -1373,31 +1374,41 @@ Session::set_transport_speed (double speed, samplepos_t destination_sample, bool
DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %6\n",
speed, abort, clear_state, _transport_speed, _transport_sample, as_default));
- if (_transport_speed == speed) {
+ /* max speed is somewhat arbitrary but based on guestimates regarding disk i/o capability
+ and user needs. We really need CD-style "skip" playback for ffwd and rewind.
+ */
+
+ if (speed > 0) {
+ speed = min (8.0, speed);
+ } else if (speed < 0) {
+ speed = max (-8.0, speed);
+ }
+
+ double new_engine_speed = 1.0;
+ if (speed != 0) {
+ new_engine_speed = fabs (speed);
+ if (speed < 0) speed = -1;
+ if (speed > 0) speed = 1;
+ }
+
+ if (_transport_speed == speed && new_engine_speed == _engine_speed) {
if (as_default && speed == 0.0) { // => reset default transport speed. hacky or what?
_default_transport_speed = 1.0;
}
return;
}
+#if 0 // TODO pref: allow vari-speed recording
if (actively_recording() && speed != 1.0 && speed != 0.0) {
/* no varispeed during recording */
DEBUG_TRACE (DEBUG::Transport, string_compose ("No varispeed during recording cur_speed %1, sample %2\n",
_transport_speed, _transport_sample));
return;
}
+#endif
_target_transport_speed = fabs(speed);
-
- /* 8.0 max speed is somewhat arbitrary but based on guestimates regarding disk i/o capability
- and user needs. We really need CD-style "skip" playback for ffwd and rewind.
- */
-
- if (speed > 0) {
- speed = min (8.0, speed);
- } else if (speed < 0) {
- speed = max (-8.0, speed);
- }
+ _engine_speed = new_engine_speed;
if (transport_rolling() && speed == 0.0) {
@@ -1479,9 +1490,11 @@ Session::set_transport_speed (double speed, samplepos_t destination_sample, bool
return;
}
+#if 0
if (actively_recording()) {
return;
}
+#endif
if (speed > 0.0 && _transport_sample == current_end_sample()) {
return;
@@ -1530,14 +1543,14 @@ Session::set_transport_speed (double speed, samplepos_t destination_sample, bool
* The 0.2% dead-zone is somewhat arbitrary. Main use-case
* for TransportStateChange() here is the ShuttleControl display.
*/
- if (fabs (_signalled_varispeed - speed) > .002
+ if (fabs (_signalled_varispeed - actual_speed ()) > .002
// still, signal hard changes to 1.0 and 0.0:
- || ( speed == 1.0 && _signalled_varispeed != 1.0)
- || ( speed == 0.0 && _signalled_varispeed != 0.0)
+ || (actual_speed () == 1.0 && _signalled_varispeed != 1.0)
+ || (actual_speed () == 0.0 && _signalled_varispeed != 0.0)
)
{
TransportStateChange (); /* EMIT SIGNAL */
- _signalled_varispeed = speed;
+ _signalled_varispeed = actual_speed ();
}
}
}