Mercurial > hg > svcore
diff plugin/FeatureExtractionPluginFactory.cpp @ 1230:9ae2ce9190e6 project-file-rework
Merge
author | Chris Cannam |
---|---|
date | Tue, 25 Oct 2016 11:04:26 +0100 |
parents | ab050519c4ba e699bdeef63c |
children | d45a16c232bd |
line wrap: on
line diff
--- a/plugin/FeatureExtractionPluginFactory.cpp Mon Oct 24 17:53:33 2016 +0100 +++ b/plugin/FeatureExtractionPluginFactory.cpp Tue Oct 25 11:04:26 2016 +0100 @@ -4,7 +4,7 @@ Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. - This file copyright 2006 Chris Cannam and QMUL. + This file copyright 2006-2016 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -13,171 +13,32 @@ COPYING included with this distribution for more information. */ -#include "FeatureExtractionPluginFactory.h" -#include "PluginIdentifier.h" +#include "PiperVampPluginFactory.h" +#include "NativeVampPluginFactory.h" -#include "system/System.h" +#include <QMutex> +#include <QMutexLocker> -#include "PluginScan.h" - -#ifdef _WIN32 -#undef VOID -#undef ERROR -#define CAPNP_LITE 1 -#endif -#include "vamp-client/AutoPlugin.h" - -#include <QDir> -#include <QFile> -#include <QFileInfo> -#include <QTextStream> - -#include <iostream> - -#include "base/Profiler.h" - -#include "vamp-client/ProcessQtTransport.h" -#include "vamp-client/CapnpRRClient.h" - -using namespace std; - -//#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1 - -static FeatureExtractionPluginFactory *_nativeInstance = 0; +#include "base/Preferences.h" FeatureExtractionPluginFactory * -FeatureExtractionPluginFactory::instance(QString pluginType) +FeatureExtractionPluginFactory::instance() { - if (pluginType == "vamp") { - if (!_nativeInstance) { -// SVDEBUG << "FeatureExtractionPluginFactory::instance(" << pluginType// << "): creating new FeatureExtractionPluginFactory" << endl; - _nativeInstance = new FeatureExtractionPluginFactory(); - } - return _nativeInstance; + static QMutex mutex; + static FeatureExtractionPluginFactory *instance = 0; + + QMutexLocker locker(&mutex); + + if (!instance) { + + if (Preferences::getInstance()->getRunPluginsInProcess()) { + cerr << "creating native instance" << endl; + instance = new NativeVampPluginFactory(); + } else { + cerr << "creating piper instance" << endl; + instance = new PiperVampPluginFactory(); + } } - else return 0; + return instance; } - -FeatureExtractionPluginFactory * -FeatureExtractionPluginFactory::instanceFor(QString identifier) -{ - QString type, soName, label; - PluginIdentifier::parseIdentifier(identifier, type, soName, label); - return instance(type); -} - -FeatureExtractionPluginFactory::FeatureExtractionPluginFactory() : - m_serverName("piper-cpp/bin/piper-vamp-server") //!!! -{ -} - -vector<QString> -FeatureExtractionPluginFactory::getAllPluginIdentifiers() -{ - FeatureExtractionPluginFactory *factory; - vector<QString> rv; - - factory = instance("vamp"); - if (factory) { - vector<QString> tmp = factory->getPluginIdentifiers(); - for (size_t i = 0; i < tmp.size(); ++i) { -// cerr << "identifier: " << tmp[i] << endl; - rv.push_back(tmp[i]); - } - } - - // Plugins can change the locale, revert it to default. - RestoreStartupLocale(); - - return rv; -} - -vector<QString> -FeatureExtractionPluginFactory::getPluginIdentifiers() -{ - Profiler profiler("FeatureExtractionPluginFactory::getPluginIdentifiers"); - - QMutexLocker locker(&m_mutex); - - if (m_pluginData.empty()) { - populate(); - } - - vector<QString> rv; - - for (const auto &d: m_pluginData) { - rv.push_back(QString("vamp:") + QString::fromStdString(d.pluginKey)); - } - - return rv; -} - -Vamp::Plugin * -FeatureExtractionPluginFactory::instantiatePlugin(QString identifier, - sv_samplerate_t inputSampleRate) -{ - Profiler profiler("FeatureExtractionPluginFactory::instantiatePlugin"); - - QString type, soname, label; - PluginIdentifier::parseIdentifier(identifier, type, soname, label); - std::string pluginKey = (soname + ":" + label).toStdString(); - - auto ap = new piper_vamp::client::AutoPlugin - (m_serverName, pluginKey, float(inputSampleRate), 0); - - if (!ap->isOK()) { - delete ap; - return 0; - } else { - return ap; - } -} - -piper_vamp::PluginStaticData -FeatureExtractionPluginFactory::getPluginStaticData(QString identifier) -{ - QString type, soname, label; - PluginIdentifier::parseIdentifier(identifier, type, soname, label); - std::string pluginKey = (soname + ":" + label).toStdString(); - - for (const auto &d: m_pluginData) { - if (d.pluginKey == pluginKey) { - return d; - } - } - return {}; -} - -QString -FeatureExtractionPluginFactory::getPluginCategory(QString identifier) -{ - if (m_taxonomy.find(identifier) != m_taxonomy.end()) { - return m_taxonomy[identifier]; - } else { - return {}; - } -} - -void -FeatureExtractionPluginFactory::populate() -{ - piper_vamp::client::ProcessQtTransport transport(m_serverName); - piper_vamp::client::CapnpRRClient client(&transport); - piper_vamp::ListResponse lr = client.listPluginData(); - m_pluginData = lr.available; - - for (const auto &pd: m_pluginData) { - - QString identifier = - QString("vamp:") + QString::fromStdString(pd.pluginKey); - - QStringList catlist; - for (const auto &cs: pd.category) { - catlist.push_back(QString::fromStdString(cs)); - } - - m_taxonomy[identifier] = catlist.join(" > "); - } -} -