summaryrefslogtreecommitdiff
path: root/libs/ardour/session_process.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-11-30 17:05:36 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-11-30 17:05:36 +0000
commit1ab566216617d12b932699081836135fa2ab36d3 (patch)
treee68f56a8515e8c65e012b1b8094749493347f60b /libs/ardour/session_process.cc
parent0afbd9c3352dcf28d672442ddecff696560237b1 (diff)
try locating when master is way ahead or behind the slave (ardour)
git-svn-id: svn://localhost/ardour2/branches/3.0@6217 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/session_process.cc')
-rw-r--r--libs/ardour/session_process.cc46
1 files changed, 26 insertions, 20 deletions
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index e277a2dbcc..801e1037b5 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -493,7 +493,7 @@ Session::follow_slave (nframes_t nframes)
_slave->speed_and_position (slave_speed, slave_transport_frame);
- DEBUG_TRACE (DEBUG::Slave, string_compose ("Slave @ %1 speed %2\n", slave_speed, slave_transport_frame));
+ DEBUG_TRACE (DEBUG::Slave, string_compose ("Slave @ %2 speed %1\n", slave_speed, slave_transport_frame));
if (!_slave->locked()) {
goto noroll;
@@ -543,30 +543,36 @@ Session::follow_slave (nframes_t nframes)
float delta;
- #ifdef USE_MOVING_AVERAGE_OF_SLAVE
- if (average_slave_delta == 0) {
- delta = this_delta;
- delta *= dir;
- } else {
- delta = average_slave_delta;
- delta *= average_dir;
- }
- #else
+#ifdef USE_MOVING_AVERAGE_OF_SLAVE
+ if (average_slave_delta == 0) {
delta = this_delta;
delta *= dir;
- #endif
-
- float adjusted_speed = slave_speed + (delta / float(_current_frame_rate));
-
- if (_slave->give_slave_full_control_over_transport_speed()) {
- request_transport_speed(slave_speed);
} else {
- request_transport_speed(adjusted_speed);
- DEBUG_TRACE (DEBUG::Slave, string_compose ("adjust using %1 towards %2 ratio %3 current %4 slave @ %5\n",
- delta, adjusted_speed, adjusted_speed/slave_speed, _transport_speed,
- slave_speed));
+ delta = average_slave_delta;
+ delta *= average_dir;
}
+#else
+ delta = this_delta;
+ delta *= dir;
+#endif
+ if (fabs(delta) > frames_per_cycle()) {
+ /* too far off, so locate and keep rolling */
+ DEBUG_TRACE (DEBUG::Slave, string_compose ("slave delta is too big, locate to %1\n", slave_transport_frame));
+ request_locate (slave_transport_frame, true);
+ } else {
+ float adjusted_speed = slave_speed + (delta / float(_current_frame_rate));
+
+ if (_slave->give_slave_full_control_over_transport_speed()) {
+ request_transport_speed(slave_speed);
+ } else {
+ request_transport_speed(adjusted_speed);
+ DEBUG_TRACE (DEBUG::Slave, string_compose ("adjust using %1 towards %2 ratio %3 current %4 slave @ %5\n",
+ delta, adjusted_speed, adjusted_speed/slave_speed, _transport_speed,
+ slave_speed));
+ }
+ }
+
if (abs(average_slave_delta) > (long) _slave->resolution()) {
cerr << "average slave delta greater than slave resolution, going to silent motion\n";
goto silent_motion;