Fix case where the working range for the interpolation can be chosen wrongly if start...
authorCarl Hetherington <carl@carlh.net>
Sun, 25 Jul 2010 23:20:31 +0000 (23:20 +0000)
committerCarl Hetherington <carl@carlh.net>
Sun, 25 Jul 2010 23:20:31 +0000 (23:20 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7495 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/evoral/src/ControlList.cpp

index eeadadfb528a2f0a16add520e7c1f1f4d11f3863..880198dc53ad3eb18a8a7d3c3cdacd81bb5a05af 100644 (file)
@@ -1007,8 +1007,7 @@ ControlList::rt_safe_earliest_event_discrete_unlocked (double start, double& x,
 bool
 ControlList::rt_safe_earliest_event_linear_unlocked (double start, double& x, double& y, bool inclusive) const
 {
-       //cerr << "earliest_event(start: " << start << ", end: " << end
-       //<< ", x: " << x << ", y: " << y << ", inclusive: " << inclusive <<  ")" << endl;
+       // cout << "earliest_event(start: " << start << ", x: " << x << ", y: " << y << ", inclusive: " << inclusive <<  ")" << endl;
 
        const_iterator length_check_iter = _events.begin();
        if (_events.empty()) { // 0 events
@@ -1026,9 +1025,13 @@ ControlList::rt_safe_earliest_event_linear_unlocked (double start, double& x, do
                const ControlEvent* next = NULL;
 
                /* Step is after first */
-               if (_search_cache.first == _events.begin() || (*_search_cache.first)->when == start) {
+               if (_search_cache.first == _events.begin() || (*_search_cache.first)->when <= start) {
                        first = *_search_cache.first;
-                       next = *(++_search_cache.first);
+                       ++_search_cache.first;
+                       if (_search_cache.first == _events.end()) {
+                               return false;
+                       }
+                       next = *_search_cache.first;
 
                /* Step is before first */
                } else {