diff options
author | Hans Baier <hansfbaier@googlemail.com> | 2008-10-29 08:15:57 +0000 |
---|---|---|
committer | Hans Baier <hansfbaier@googlemail.com> | 2008-10-29 08:15:57 +0000 |
commit | 0c72237f1312648843fdb0cbf8f093edb94026b7 (patch) | |
tree | 8e6d415662c470c589a01bae00f91cddb33aaf50 /libs | |
parent | 75e918080093a6ca88abe010c07d883afc697520 (diff) |
* fixed bug in Session::follow_slave: average_slave_delta wrapped around to huge positive values when slave lags behind master (ie deltas become negative)
* enabled some debugging output in Session::follow_slave (session_process.cc), beware!
git-svn-id: svn://localhost/ardour2/branches/3.0@4027 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/slave.h | 5 | ||||
-rw-r--r-- | libs/ardour/session_process.cc | 36 |
2 files changed, 20 insertions, 21 deletions
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index 80fac38a2a..8f217d2a46 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -96,8 +96,6 @@ class Slave { * <li> * Slave::resolution() should be greater than the maximum distance of * ardours transport position to the slaves requested transport position. - * (Otherwise Session:average_slave_delta will become negative, and - * the transport will move silently) * </li> * <li>Slave::locked() should return true, otherwise Session::no_roll will be called</li> * <li>Slave::starting() should be false, otherwise the transport will not move until it becomes true</li> * @@ -134,8 +132,7 @@ class Slave { /** * @return - the timing resolution of the Slave - If the distance of ardours transport - * to the slave becomes negative or greater than the resolution, sound will stop - * (Session::follow_slave label silent_motion) + * to the slave becomes greater than the resolution, sound will stop */ virtual nframes_t resolution() const = 0; diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 5a28fd5890..a574b8ce7d 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -487,7 +487,7 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) slave_speed = 0.0f; } -#if 0 +#if 1 cerr << "delta = " << (int) (dir * this_delta) << " speed = " << slave_speed << " ts = " << _transport_speed @@ -519,18 +519,18 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) } if (delta_accumulator_cnt != 0 || this_delta < _current_frame_rate) { - delta_accumulator[delta_accumulator_cnt++] = dir*this_delta; + delta_accumulator[delta_accumulator_cnt++] = long(dir) * long(this_delta); } if (have_first_delta_accumulator) { - average_slave_delta = 0; + average_slave_delta = 0L; for (int i = 0; i < delta_accumulator_size; ++i) { average_slave_delta += delta_accumulator[i]; } - average_slave_delta /= delta_accumulator_size; - if (average_slave_delta < 0) { + average_slave_delta /= long(delta_accumulator_size); + if (average_slave_delta < 0L) { average_dir = -1; - average_slave_delta = -average_slave_delta; + average_slave_delta = abs(average_slave_delta); } else { average_dir = 1; } @@ -606,8 +606,8 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) /* XXX what? */ } - memset (delta_accumulator, 0, sizeof (nframes_t) * delta_accumulator_size); - average_slave_delta = 0; + memset (delta_accumulator, 0, sizeof (long) * delta_accumulator_size); + average_slave_delta = 0L; this_delta = 0; } } @@ -667,18 +667,19 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) float adjusted_speed = slave_speed + (delta / (adjust_seconds * _current_frame_rate)); - // cerr << "adjust using " << delta - // << " towards " << adjusted_speed - // << " ratio = " << adjusted_speed / slave_speed - // << " current = " << _transport_speed - // << " slave @ " << slave_speed - // << endl; - +#if 1 + cerr << "adjust using " << delta + << " towards " << adjusted_speed + << " ratio = " << adjusted_speed / slave_speed + << " current = " << _transport_speed + << " slave @ " << slave_speed + << endl; +#endif request_transport_speed (adjusted_speed); #if 1 - if ((nframes_t) average_slave_delta > _slave->resolution()) { - // cerr << "not locked\n"; + if (abs(average_slave_delta) > (long) _slave->resolution()) { + cerr << "average slave delta greater than slave resolution, going to silent motion\n"; goto silent_motion; } #endif @@ -733,6 +734,7 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) noroll: /* don't move at all */ + cerr << "********* noroll" << endl; no_roll (nframes, 0); return false; } |