diff transform/TransformFactory.cpp @ 0:da6937383da8

initial import
author Chris Cannam
date Tue, 10 Jan 2006 16:33:16 +0000
parents
children d86891498eef
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/transform/TransformFactory.cpp	Tue Jan 10 16:33:16 2006 +0000
@@ -0,0 +1,144 @@
+/* -*- c-basic-offset: 4 -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    A waveform viewer and audio annotation editor.
+    Chris Cannam, Queen Mary University of London, 2005
+   
+    This is experimental software.  Not for distribution.
+*/
+
+#include "TransformFactory.h"
+
+#include "BeatDetectTransform.h"
+#include "BeatDetectionFunctionTransform.h"
+#include "FeatureExtractionPluginTransform.h"
+
+#include "plugin/FeatureExtractionPluginFactory.h"
+
+#include <iostream>
+
+TransformFactory *
+TransformFactory::m_instance = new TransformFactory;
+
+TransformFactory *
+TransformFactory::instance()
+{
+    return m_instance;
+}
+
+TransformFactory::~TransformFactory()
+{
+}
+
+TransformFactory::TransformList
+TransformFactory::getAllTransforms()
+{
+    TransformList list;
+//!!!    list.push_back(BeatDetectTransform::getName());
+//    list.push_back(BeatDetectionFunctionTransform::getName());
+
+    //!!!
+    std::vector<QString> fexplugs =
+	FeatureExtractionPluginFactory::getAllPluginIdentifiers();
+
+    for (size_t i = 0; i < fexplugs.size(); ++i) {
+
+	QString pluginId = fexplugs[i];
+
+	FeatureExtractionPluginFactory *factory =
+	    FeatureExtractionPluginFactory::instanceFor(pluginId);
+
+	if (factory) {
+	    //!!! well, really we want to be able to query this without having to instantiate
+
+	    FeatureExtractionPlugin *plugin = 
+		factory->instantiatePlugin(pluginId, 48000);
+
+	    QString pluginDescription = plugin->getDescription().c_str();
+
+	    if (plugin) {
+
+		FeatureExtractionPlugin::OutputList outputs =
+		    plugin->getOutputDescriptors();
+
+		if (outputs.size() == 1) {
+		    list.push_back
+			(TransformDesc
+			 (QString("%1:%2").arg(pluginId).arg(outputs[0].name.c_str()),
+			  pluginDescription));
+		} else {
+		    for (size_t j = 0; j < outputs.size(); ++j) {
+			list.push_back
+			    (TransformDesc
+			     (QString("%1:%2").arg(pluginId).arg(outputs[j].name.c_str()),
+			      QString("%1: %2").arg(pluginDescription)
+			      .arg(outputs[j].description.c_str())));
+		    }
+		}
+	    }
+	}
+    }
+    
+    return list;
+}
+
+Transform *
+TransformFactory::createTransform(TransformName name, Model *inputModel)
+{
+    return createTransform(name, inputModel, true);
+}
+
+Transform *
+TransformFactory::createTransform(TransformName name, Model *inputModel,
+				  bool start)
+{
+    Transform *transform = 0;
+
+    if (name == BeatDetectTransform::getName()) {
+	transform = new BeatDetectTransform(inputModel);
+    } else if (name == BeatDetectionFunctionTransform::getName()) {
+	transform = new BeatDetectionFunctionTransform(inputModel);
+    } else {
+	QString id = name.section(':', 0, 2);
+	QString output = name.section(':', 3);
+	if (FeatureExtractionPluginFactory::instanceFor(id)) {
+	    transform = new FeatureExtractionPluginTransform(inputModel,
+							     id, output);
+	} else {
+	    std::cerr << "TransformFactory::createTransform: Unknown transform "
+		      << name.toStdString() << std::endl;
+	}
+    }
+
+    if (start && transform) transform->start();
+    return transform;
+}
+
+Model *
+TransformFactory::transform(TransformName name, Model *inputModel)
+{
+    Transform *t = createTransform(name, inputModel, false);
+
+    if (!t) return 0;
+
+    connect(t, SIGNAL(finished()), this, SLOT(transformFinished()));
+
+    t->start();
+    return t->detachOutputModel();
+}
+
+void
+TransformFactory::transformFinished()
+{
+    QObject *s = sender();
+    Transform *transform = dynamic_cast<Transform *>(s);
+    
+    if (!transform) {
+	std::cerr << "WARNING: TransformFactory::transformFinished: sender is not a transform" << std::endl;
+	return;
+    }
+
+    transform->wait(); // unnecessary but reassuring
+    delete transform;
+}
+