when calculating average slave/master delta, use absolute value.
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 27 Jul 2017 18:59:22 +0000 (14:59 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 18 Sep 2017 15:40:53 +0000 (11:40 -0400)
We're interested in average distance between slave/master, the direction is irrelevant and
using sign as direction causes the computed average to be absurd

libs/ardour/session_process.cc

index b9af7c5ad6fa5da88f8d0226d884dbcab6d3bd3f..badddf2fbab2a5971ed12725e36adf6011863387 100644 (file)
@@ -598,7 +598,7 @@ Session::follow_slave (pframes_t nframes)
                */
 
                if (_slave_state == Running) {
-                       calculate_moving_average_of_slave_delta(dir, this_delta);
+                       calculate_moving_average_of_slave_delta(dir, abs(this_delta));
                }
        }
 
@@ -651,8 +651,8 @@ Session::follow_slave (pframes_t nframes)
                                                                           slave_speed));
                        }
 
-                       if (!actively_recording() && (framecnt_t) abs(average_slave_delta) > _slave->resolution()) {
-                               DEBUG_TRACE (DEBUG::Slave, string_compose ("average slave delta %1 greater than slave resolution %2 => silent motion\n", abs(average_slave_delta), _slave->resolution()));
+                       if (!actively_recording() && (framecnt_t) average_slave_delta > _slave->resolution()) {
+                               DEBUG_TRACE (DEBUG::Slave, string_compose ("average slave delta %1 greater than slave resolution %2 => silent motion\n", average_slave_delta, _slave->resolution()));
                                /* run routes as normal, but no disk output */
                                cerr << "sync too far apart " << average_slave_delta << ", NO disk audio for now\n";
                                DiskReader::set_no_disk_output (true);
@@ -709,7 +709,7 @@ Session::calculate_moving_average_of_slave_delta (int dir, framecnt_t this_delta
                average_slave_delta /= (int32_t) delta_accumulator_size;
                if (average_slave_delta < 0L) {
                        average_dir = -1;
-                       average_slave_delta = abs(average_slave_delta);
+                       average_slave_delta = average_slave_delta;
                } else {
                        average_dir = 1;
                }