changeset 182:21a76c9ed5c3

* Merge transform directory from sv-match-alignment branch (the previous comment included notes for this stuff, but I missed it in the actual merge) * Fix crash when a transform fails to create an output model and the thread that created the transform then deletes its input model thinking it's no longer needed, even though the transform run thread is still using it -- fix is to wait() on the transform before returning the null output model
author Chris Cannam
date Fri, 28 Sep 2007 16:15:06 +0000
parents a65a01870d8c
children 3fdaf3157eea
files transform/FeatureExtractionPluginTransform.cpp transform/PluginTransform.cpp transform/PluginTransform.h transform/TransformFactory.cpp
diffstat 4 files changed, 59 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/transform/FeatureExtractionPluginTransform.cpp	Fri Sep 28 14:32:45 2007 +0000
+++ b/transform/FeatureExtractionPluginTransform.cpp	Fri Sep 28 16:15:06 2007 +0000
@@ -220,6 +220,7 @@
 
 FeatureExtractionPluginTransform::~FeatureExtractionPluginTransform()
 {
+    std::cerr << "FeatureExtractionPluginTransform::~FeatureExtractionPluginTransform()" << std::endl;
     delete m_plugin;
     delete m_descriptor;
 }
@@ -241,6 +242,8 @@
     DenseTimeValueModel *input = getInput();
     if (!input) return;
 
+    if (!m_output) return;
+
     while (!input->isReady()) {
 /*
         if (dynamic_cast<WaveFileModel *>(input)) {
@@ -253,8 +256,6 @@
         sleep(1);
     }
 
-    if (!m_output) return;
-
     size_t sampleRate = m_input->getSampleRate();
 
     size_t channelCount = input->getChannelCount();
@@ -297,16 +298,35 @@
 
     long startFrame = m_input->getStartFrame();
     long   endFrame = m_input->getEndFrame();
-    long blockFrame = startFrame;
+
+    long contextStart = m_context.startFrame;
+    long contextDuration = m_context.duration;
+
+    if (contextStart == 0 || contextStart < startFrame) {
+        contextStart = startFrame;
+    }
+
+    if (contextDuration == 0) {
+        contextDuration = endFrame - contextStart;
+    }
+    if (contextStart + contextDuration > endFrame) {
+        contextDuration = endFrame - contextStart;
+    }
+
+    long blockFrame = contextStart;
 
     long prevCompletion = 0;
 
+    setCompletion(0);
+
     while (!m_abandoned) {
 
         if (frequencyDomain) {
-            if (blockFrame - int(m_context.blockSize)/2 > endFrame) break;
+            if (blockFrame - int(m_context.blockSize)/2 >
+                contextStart + contextDuration) break;
         } else {
-            if (blockFrame >= endFrame) break;
+            if (blockFrame >= 
+                contextStart + contextDuration) break;
         }
 
 //	std::cerr << "FeatureExtractionPluginTransform::run: blockFrame "
@@ -314,8 +334,8 @@
 //                  << m_context.blockSize << std::endl;
 
 	long completion =
-	    (((blockFrame - startFrame) / m_context.stepSize) * 99) /
-	    (   (endFrame - startFrame) / m_context.stepSize);
+	    (((blockFrame - contextStart) / m_context.stepSize) * 99) /
+	    (contextDuration / m_context.stepSize);
 
 	// channelCount is either m_input->channelCount or 1
 
@@ -341,7 +361,7 @@
 	    addFeature(blockFrame, feature);
 	}
 
-	if (blockFrame == startFrame || completion > prevCompletion) {
+	if (blockFrame == contextStart || completion > prevCompletion) {
 	    setCompletion(completion);
 	    prevCompletion = completion;
 	}
@@ -500,8 +520,8 @@
 	binCount = m_descriptor->binCount;
     }
 
-//    std::cerr << "FeatureExtractionPluginTransform::setCompletion("
-//              << completion << ")" << std::endl;
+    std::cerr << "FeatureExtractionPluginTransform::setCompletion("
+              << completion << ")" << std::endl;
 
     if (binCount == 0) {
 
--- a/transform/PluginTransform.cpp	Fri Sep 28 14:32:45 2007 +0000
+++ b/transform/PluginTransform.cpp	Fri Sep 28 16:15:06 2007 +0000
@@ -30,7 +30,10 @@
     domain(Vamp::Plugin::TimeDomain),
     stepSize(_bs ? _bs : 1024),
     blockSize(_bs ? _bs : 1024),
-    windowType(HanningWindow)
+    windowType(HanningWindow),
+    startFrame(0),
+    duration(0),
+    sampleRate(0)
 {
 }
 
@@ -40,7 +43,10 @@
     domain(Vamp::Plugin::FrequencyDomain),
     stepSize(_ss ? _ss : (_bs ? _bs / 2 : 512)),
     blockSize(_bs ? _bs : 1024),
-    windowType(_wt)
+    windowType(_wt),
+    startFrame(0),
+    duration(0),
+    sampleRate(0)
 {
 }
 
@@ -50,7 +56,10 @@
     domain(Vamp::Plugin::TimeDomain),
     stepSize(0),
     blockSize(0),
-    windowType(HanningWindow)
+    windowType(HanningWindow),
+    startFrame(0),
+    duration(0),
+    sampleRate(0)
 {
     makeConsistentWithPlugin(_plugin);
 }
@@ -62,7 +71,10 @@
             c.domain == domain &&
             c.stepSize == stepSize &&
             c.blockSize == blockSize &&
-            c.windowType == windowType);
+            c.windowType == windowType &&
+            c.startFrame == startFrame &&
+            c.duration == duration &&
+            c.sampleRate == sampleRate);
 }
 
 void
--- a/transform/PluginTransform.h	Fri Sep 28 14:32:45 2007 +0000
+++ b/transform/PluginTransform.h	Fri Sep 28 16:15:06 2007 +0000
@@ -48,6 +48,9 @@
         size_t stepSize;
         size_t blockSize;
         WindowType windowType;
+        size_t startFrame;
+        size_t duration;    // 0 -> whole thing
+        float sampleRate;   // 0 -> model's rate
     };
 
 protected:
--- a/transform/TransformFactory.cpp	Fri Sep 28 14:32:45 2007 +0000
+++ b/transform/TransformFactory.cpp	Fri Sep 28 16:15:06 2007 +0000
@@ -292,6 +292,8 @@
                               units,
                               configurable);
 	}
+
+        delete plugin;
     }
 }
 
@@ -553,6 +555,8 @@
 
     if (FeatureExtractionPluginFactory::instanceFor(id)) {
 
+        std::cerr << "getConfigurationForTransform: instantiating Vamp plugin" << std::endl;
+
         Vamp::Plugin *vp =
             FeatureExtractionPluginFactory::instanceFor(id)->instantiatePlugin
             (id, inputModel->getSampleRate());
@@ -709,8 +713,10 @@
             FeatureExtractionPluginFactory::instanceFor(id)->instantiatePlugin
             (id, inputModel ? inputModel->getSampleRate() : 48000);
 
-        if (vp) context = PluginTransform::ExecutionContext(-1, vp);
-
+        if (vp) {
+            context = PluginTransform::ExecutionContext(-1, vp);
+            delete vp;
+        }
     }
 
     return context;
@@ -779,6 +785,8 @@
         } else if (trn != "") {
             model->setObjectName(trn);
         }
+    } else {
+        t->wait();
     }
 
     return model;