diff vamp/CQVamp.cpp @ 53:a25abb7a21c0

Further tidying, compensate for latency in Vamp plugin
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 28 Nov 2013 11:46:39 +0000
parents cb072f01435b
children 2a21b4506d7f
line wrap: on
line diff
--- a/vamp/CQVamp.cpp	Thu Nov 28 11:26:53 2013 +0000
+++ b/vamp/CQVamp.cpp	Thu Nov 28 11:46:39 2013 +0000
@@ -14,7 +14,9 @@
     m_cq(0),
     m_maxFrequency(inputSampleRate/2),
     m_minFrequency(46),
-    m_bpo(24)
+    m_bpo(24),
+    m_haveStartTime(false),
+    m_columnCount(0)
 {
 }
 
@@ -160,6 +162,8 @@
 	    (m_inputSampleRate, m_minFrequency, m_maxFrequency, m_bpo);
     }
     m_prevFeature.clear();
+    m_haveStartTime = false;
+    m_columnCount = 0;
 }
 
 size_t
@@ -197,7 +201,7 @@
 
 CQVamp::FeatureSet
 CQVamp::process(const float *const *inputBuffers,
-		Vamp::RealTime /* timestamp */)
+		Vamp::RealTime timestamp)
 {
     if (!m_cq) {
 	cerr << "ERROR: CQVamp::process: "
@@ -206,6 +210,11 @@
 	return FeatureSet();
     }
 
+    if (!m_haveStartTime) {
+        m_startTime = timestamp;
+        m_haveStartTime = true;
+    }
+
     vector<double> data;
     for (int i = 0; i < m_blockSize; ++i) data.push_back(inputBuffers[0][i]);
     
@@ -223,7 +232,6 @@
 CQVamp::FeatureSet
 CQVamp::convertToFeatures(const vector<vector<double> > &cqout)
 {
-    
     FeatureSet returnFeatures;
 
     for (int i = 0; i < (int)cqout.size(); ++i) {
@@ -242,10 +250,20 @@
 	m_prevFeature = column;
 
 	Feature feature;
-	feature.hasTimestamp = false;
+	feature.hasTimestamp = true;
+        feature.timestamp = m_startTime + Vamp::RealTime::frame2RealTime
+            (m_columnCount * m_cq->getColumnHop() - m_cq->getLatency(),
+             m_inputSampleRate);
 	feature.values = column;
 	feature.label = "";
-	returnFeatures[0].push_back(feature);
+
+        cerr << "timestamp = " << feature.timestamp << " (latency = " << m_cq->getLatency() << ", sample rate " << m_inputSampleRate << ")" << endl;
+
+        if (feature.timestamp >= m_startTime) {
+            returnFeatures[0].push_back(feature);
+        }
+
+        ++m_columnCount;
     }
 
     return returnFeatures;