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(" > ");
-    }
-}
-