diff data/model/AlignmentModel.cpp @ 312:df707a61b23f

* interpolate in AlignmentModel
author Chris Cannam
date Wed, 10 Oct 2007 16:21:27 +0000
parents c022976d18e8
children 29485aa03da4
line wrap: on
line diff
--- a/data/model/AlignmentModel.cpp	Wed Oct 10 15:32:16 2007 +0000
+++ b/data/model/AlignmentModel.cpp	Wed Oct 10 16:21:27 2007 +0000
@@ -177,7 +177,7 @@
             (SparseTimeValueModel::Point(rframe, rvalue, ""));
     }
 
-    std::cerr << "AlignmentModel::constructReversePath: " << m_reversePath->getPointCount() << " points" << std::endl;
+    std::cerr << "AlignmentModel::constructReversePath: " << m_reversePath->getPointCount() << " points, at least " << (2 * m_reversePath->getPointCount() * (3 * sizeof(void *) + sizeof(int) + sizeof(SparseTimeValueModel::Point))) << " bytes" << std::endl;
 }
 
 size_t
@@ -198,13 +198,37 @@
     SparseTimeValueModel::Point point(frame);
     SparseTimeValueModel::PointList::const_iterator i = points.lower_bound(point);
     if (i == points.end()) --i;
-    float time = i->value;
-    size_t rv = lrintf(time * getSampleRate());
+    while (i != points.begin() && i->frame > frame) --i;
 
-    //!!! interpolate!
+    long foundFrame = i->frame;
+    float foundTime = i->value;
 
-//    std::cerr << "AlignmentModel::align: rv = " << rv << std::endl;
+    long followingFrame = foundFrame;
+    float followingTime = foundTime;
 
-    return rv;
+    if (++i != points.end()) {
+        followingFrame = i->frame;
+        followingTime = i->value;
+    }
+
+    float resultTime = foundTime;
+
+    if (followingFrame != foundFrame && frame > foundFrame) {
+
+        std::cerr << "AlignmentModel::align: foundFrame = " << foundFrame << ", frame = " << frame << ", followingFrame = " << followingFrame << std::endl;
+
+        float interp = float(frame - foundFrame) / float(followingFrame - foundFrame);
+        std::cerr << "AlignmentModel::align: interp = " << interp << ", result " << resultTime << " -> ";
+
+        resultTime += (followingTime - foundTime) * interp;
+
+        std::cerr << resultTime << std::endl;
+    }
+
+    size_t resultFrame = lrintf(resultTime * getSampleRate());
+
+    std::cerr << "AlignmentModel::align: resultFrame = " << resultFrame << std::endl;
+
+    return resultFrame;
 }