Fix controller iteration / linear interpolation.

Add unit test for controller iteration / linear interpolation.


git-svn-id: svn://localhost/ardour2/branches/3.0@5886 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard 2009-10-23 04:24:20 +00:00
parent 653a487bbd
commit 82a0c02af1
4 changed files with 92 additions and 6 deletions

View file

@ -97,7 +97,7 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
for (Controls::const_iterator i = seq._controls.begin(); i != seq._controls.end(); ++i) {
DUMP(format("Iterator: control: %1%\n") % seq._type_map.to_symbol(i->first));
double x, y;
bool ret = i->second->list()->rt_safe_earliest_event_unlocked(t, DBL_MAX, x, y);
bool ret = i->second->list()->rt_safe_earliest_event_unlocked(t, DBL_MAX, x, y, true);
if (!ret) {
DUMP(format("Iterator: CC %1% (size %2%) has no events past %3%\n")
% i->first.id() % i->second->list()->size() % t);
@ -128,6 +128,7 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
if (found) {
_control_iter = _control_iters.begin() + earliest_control_index;
assert(_control_iter != _control_iters.end());
} else {
_control_iter = _control_iters.end();
}
@ -140,14 +141,15 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
earliest_t = (*_note_iter)->time();
}
if (_sysex_iter != seq.sysexes().end() && (*_sysex_iter)->time() < earliest_t) {
if (_sysex_iter != seq.sysexes().end()
&& ((*_sysex_iter)->time() < earliest_t || _type == NIL)) {
_type = SYSEX;
earliest_t = (*_sysex_iter)->time();
}
if (_control_iter != _control_iters.end()
&& earliest_control.list && earliest_control.x >= t
&& earliest_control.x < earliest_t) {
&& (earliest_control.x < earliest_t || _type == NIL)) {
_type = CONTROL;
earliest_t = earliest_control.x;
}