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