# HG changeset patch # User Chris Cannam # Date 1476968818 -3600 # Node ID c2207877689d76fda9c6b4f71b03fed97d7fbe88 # Parent 771a179255767433678439f2f0315329db136087 Avoid instantiating all plugins (in piper client) on startup, using plugin static data instead. Problem of where to get the units field from is still pending. diff -r 771a17925576 -r c2207877689d plugin/FeatureExtractionPluginFactory.cpp --- a/plugin/FeatureExtractionPluginFactory.cpp Thu Oct 20 11:19:34 2016 +0100 +++ b/plugin/FeatureExtractionPluginFactory.cpp Thu Oct 20 14:06:58 2016 +0100 @@ -31,6 +31,9 @@ #include "base/Profiler.h" +#include "vamp-client/ProcessQtTransport.h" +#include "vamp-client/CapnpRRClient.h" + using namespace std; //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1 @@ -60,9 +63,7 @@ } FeatureExtractionPluginFactory::FeatureExtractionPluginFactory() : - m_serverName("piper-cpp/bin/piper-vamp-server"), - m_transport(m_serverName), - m_client(&m_transport) + m_serverName("piper-cpp/bin/piper-vamp-server") //!!! { } @@ -128,16 +129,37 @@ } } +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) { - return m_taxonomy[identifier]; + if (m_taxonomy.find(identifier) != m_taxonomy.end()) { + return m_taxonomy[identifier]; + } else { + return {}; + } } void FeatureExtractionPluginFactory::populate() { - piper_vamp::ListResponse lr = m_client.listPluginData(); + 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) { @@ -149,6 +171,7 @@ for (const auto &cs: pd.category) { catlist.push_back(QString::fromStdString(cs)); } + m_taxonomy[identifier] = catlist.join(" > "); } } diff -r 771a17925576 -r c2207877689d plugin/FeatureExtractionPluginFactory.h --- a/plugin/FeatureExtractionPluginFactory.h Thu Oct 20 11:19:34 2016 +0100 +++ b/plugin/FeatureExtractionPluginFactory.h Thu Oct 20 14:06:58 2016 +0100 @@ -26,8 +26,7 @@ #include "base/Debug.h" #include "base/BaseTypes.h" -#include "vamp-client/ProcessQtTransport.h" -#include "vamp-client/CapnpRRClient.h" +#include "vamp-support/PluginStaticData.h" class FeatureExtractionPluginFactory { @@ -41,6 +40,8 @@ virtual std::vector getPluginIdentifiers(); + virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier); + // We don't set blockSize or channels on this -- they're // negotiated and handled via initialize() on the plugin virtual Vamp::Plugin *instantiatePlugin(QString identifier, @@ -53,10 +54,6 @@ protected: std::string m_serverName; - - piper_vamp::client::ProcessQtTransport m_transport; - piper_vamp::client::CapnpRRClient m_client; - QMutex m_mutex; std::vector m_pluginData; std::map m_taxonomy; diff -r 771a17925576 -r c2207877689d transform/TransformFactory.cpp --- a/transform/TransformFactory.cpp Thu Oct 20 11:19:34 2016 +0100 +++ b/transform/TransformFactory.cpp Thu Oct 20 14:06:58 2016 +0100 @@ -418,64 +418,62 @@ continue; } - Vamp::Plugin *plugin = - factory->instantiatePlugin(pluginId, 44100); + piper_vamp::PluginStaticData psd = factory->getPluginStaticData(pluginId); - if (!plugin) { - cerr << "WARNING: TransformFactory::populateTransforms: Failed to instantiate plugin " << pluginId << endl; - continue; - } - - QString pluginName = plugin->getName().c_str(); + if (psd.pluginKey == "") { + cerr << "WARNING: TransformFactory::populateTransforms: No plugin static data available for instance " << pluginId << endl; + continue; + } + + QString pluginName = QString::fromStdString(psd.basic.name); QString category = factory->getPluginCategory(pluginId); + + const auto &basicOutputs = psd.basicOutputInfo; - Vamp::Plugin::OutputList outputs = - plugin->getOutputDescriptors(); + for (const auto &o: basicOutputs) { - for (int j = 0; j < (int)outputs.size(); ++j) { + QString outputName = QString::fromStdString(o.name); QString transformId = QString("%1:%2") - .arg(pluginId).arg(outputs[j].identifier.c_str()); + .arg(pluginId).arg(QString::fromStdString(o.identifier)); QString userName; QString friendlyName; - QString units = outputs[j].unit.c_str(); - QString description = plugin->getDescription().c_str(); - QString maker = plugin->getMaker().c_str(); +//!!! return to this QString units = outputs[j].unit.c_str(); + QString description = QString::fromStdString(psd.basic.description); + QString maker = QString::fromStdString(psd.maker); if (maker == "") maker = tr(""); QString longDescription = description; if (longDescription == "") { - if (outputs.size() == 1) { + if (basicOutputs.size() == 1) { longDescription = tr("Extract features using \"%1\" plugin (from %2)") .arg(pluginName).arg(maker); } else { longDescription = tr("Extract features using \"%1\" output of \"%2\" plugin (from %3)") - .arg(outputs[j].name.c_str()).arg(pluginName).arg(maker); + .arg(outputName).arg(pluginName).arg(maker); } } else { - if (outputs.size() == 1) { + if (basicOutputs.size() == 1) { longDescription = tr("%1 using \"%2\" plugin (from %3)") .arg(longDescription).arg(pluginName).arg(maker); } else { longDescription = tr("%1 using \"%2\" output of \"%3\" plugin (from %4)") - .arg(longDescription).arg(outputs[j].name.c_str()).arg(pluginName).arg(maker); + .arg(longDescription).arg(outputName).arg(pluginName).arg(maker); } } - if (outputs.size() == 1) { + if (basicOutputs.size() == 1) { userName = pluginName; friendlyName = pluginName; } else { - userName = QString("%1: %2") - .arg(pluginName) - .arg(outputs[j].name.c_str()); - friendlyName = outputs[j].name.c_str(); + userName = QString("%1: %2").arg(pluginName).arg(outputName); + friendlyName = outputName; } - bool configurable = (!plugin->getPrograms().empty() || - !plugin->getParameterDescriptors().empty()); + bool configurable = (!psd.programs.empty() || + !psd.parameters.empty()); #ifdef DEBUG_TRANSFORM_FACTORY cerr << "Feature extraction plugin transform: " << transformId << " friendly name: " << friendlyName << endl; @@ -490,11 +488,10 @@ description, longDescription, maker, - units, +//!!! units, + "", configurable); } - - delete plugin; } }