diff transform/FeatureExtractionModelTransformer.h @ 851:c9846844ac11 tonioni

Merge branch tonioni_multi_transform
author Chris Cannam
date Mon, 02 Dec 2013 15:47:06 +0000
parents dba8a02b0413
children 13803edd513d
line wrap: on
line diff
--- a/transform/FeatureExtractionModelTransformer.h	Tue Nov 26 14:37:01 2013 +0000
+++ b/transform/FeatureExtractionModelTransformer.h	Mon Dec 02 15:47:06 2013 +0000
@@ -13,8 +13,8 @@
     COPYING included with this distribution for more information.
 */
 
-#ifndef _FEATURE_EXTRACTION_PLUGIN_TRANSFORMER_H_
-#define _FEATURE_EXTRACTION_PLUGIN_TRANSFORMER_H_
+#ifndef _FEATURE_EXTRACTION_MODEL_TRANSFORMER_H_
+#define _FEATURE_EXTRACTION_MODEL_TRANSFORMER_H_
 
 #include "ModelTransformer.h"
 
@@ -31,33 +31,43 @@
     Q_OBJECT
 
 public:
-	enum PreferredOutputModel {
-		NoteOutputModel,
-		FlexiNoteOutputModel,
-		UndefinedOutputModel = 255
-	    };
+    enum PreferredOutputModel {
+        NoteOutputModel,
+        FlexiNoteOutputModel,
+        UndefinedOutputModel = 255
+    };
 	    
     FeatureExtractionModelTransformer(Input input,
                                       const Transform &transform,
-									  const PreferredOutputModel outputmodel);
+                                      const PreferredOutputModel outputmodel);
+
+    // Obtain outputs for a set of transforms that all use the same
+    // plugin and input (but with different outputs). i.e. run the
+    // plugin once only and collect more than one output from it.
+    FeatureExtractionModelTransformer(Input input,
+                                      const Transforms &relatedTransforms,
+                                      const PreferredOutputModel outputmodel);
 
     virtual ~FeatureExtractionModelTransformer();
 
 protected:
+    bool initialise();
+
     virtual void run();
 
     Vamp::Plugin *m_plugin;
-    Vamp::Plugin::OutputDescriptor *m_descriptor;
-    int m_fixedRateFeatureNo; // to assign times to FixedSampleRate features
-    int m_outputNo;
+    std::vector<Vamp::Plugin::OutputDescriptor *> m_descriptors; // per transform
+    std::vector<int> m_fixedRateFeatureNos; // to assign times to FixedSampleRate features
+    std::vector<int> m_outputNos;
     PreferredOutputModel m_preferredOutputModel;
 
-    void createOutputModel();
+    void createOutputModel(int n);
 
-    void addFeature(size_t blockFrame,
+    void addFeature(int n,
+                    size_t blockFrame,
 		    const Vamp::Plugin::Feature &feature);
 
-    void setCompletion(int);
+    void setCompletion(int, int);
 
     void getFrames(int channelCount, long startFrame, long size,
                    float **buffer);
@@ -66,16 +76,21 @@
 
     DenseTimeValueModel *getConformingInput();
 
-    template <typename ModelClass> bool isOutput() {
-        return dynamic_cast<ModelClass *>(m_output) != 0;
+    template <typename ModelClass> bool isOutput(int n) {
+        return dynamic_cast<ModelClass *>(m_outputs[n]) != 0;
     }
 
-    template <typename ModelClass> ModelClass *getConformingOutput() {
-	ModelClass *mc = dynamic_cast<ModelClass *>(m_output);
-	if (!mc) {
-	    std::cerr << "FeatureExtractionModelTransformer::getOutput: Output model not conformable" << std::endl;
-	}
-	return mc;
+    template <typename ModelClass> ModelClass *getConformingOutput(int n) {
+        if ((int)m_outputs.size() > n) {
+            ModelClass *mc = dynamic_cast<ModelClass *>(m_outputs[n]);
+            if (!mc) {
+                std::cerr << "FeatureExtractionModelTransformer::getOutput: Output model not conformable" << std::endl;
+            }
+            return mc;
+        } else {
+            std::cerr << "FeatureExtractionModelTransformer::getOutput: No such output number " << n << std::endl;
+            return 0;
+        }
     }
 };