Mercurial > hg > svcore
diff plugin/PiperVampPluginFactory.cpp @ 1230:9ae2ce9190e6 project-file-rework
Merge
author | Chris Cannam |
---|---|
date | Tue, 25 Oct 2016 11:04:26 +0100 |
parents | 5d886b7b4029 |
children | fac1666e429b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/PiperVampPluginFactory.cpp Tue Oct 25 11:04:26 2016 +0100 @@ -0,0 +1,170 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + 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 program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "PiperVampPluginFactory.h" +#include "PluginIdentifier.h" + +#include "system/System.h" + +#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 <QCoreApplication> + +#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 + +PiperVampPluginFactory::PiperVampPluginFactory() : + // No server unless we find one - don't run arbitrary stuff from the path: + m_serverName() +{ + // Server must exist either in the same directory as this one or + // (preferably) a subdirectory called "piper-bin". + //!!! todo: merge this with plugin scan checker thingy used in main.cpp? + QString myDir = QCoreApplication::applicationDirPath(); + QString name = "piper-vamp-server"; + QString path = myDir + "/piper-bin/" + name; + QString suffix = ""; +#ifdef _WIN32 + suffix = ".exe"; +#endif + if (!QFile(path + suffix).exists()) { + cerr << "NOTE: Piper Vamp server not found at " << (path + suffix) + << ", trying in my own directory" << endl; + path = myDir + "/" + name; + } + if (!QFile(path + suffix).exists()) { + cerr << "NOTE: Piper Vamp server not found at " << (path + suffix) + << endl; + } else { + m_serverName = (path + suffix).toStdString(); + } +} + +vector<QString> +PiperVampPluginFactory::getPluginIdentifiers(QString &errorMessage) +{ + Profiler profiler("PiperVampPluginFactory::getPluginIdentifiers"); + + QMutexLocker locker(&m_mutex); + + if (m_serverName == "") { + errorMessage = QObject::tr("External plugin host executable does not appear to be installed"); + return {}; + } + + if (m_pluginData.empty()) { + populate(errorMessage); + } + + vector<QString> rv; + + for (const auto &d: m_pluginData) { + rv.push_back(QString("vamp:") + QString::fromStdString(d.second.pluginKey)); + } + + return rv; +} + +Vamp::Plugin * +PiperVampPluginFactory::instantiatePlugin(QString identifier, + sv_samplerate_t inputSampleRate) +{ + Profiler profiler("PiperVampPluginFactory::instantiatePlugin"); + + auto psd = getPluginStaticData(identifier); + if (psd.pluginKey == "") { + return 0; + } + + auto ap = new piper_vamp::client::AutoPlugin + (m_serverName, psd.pluginKey, float(inputSampleRate), 0); + if (!ap->isOK()) { + delete ap; + return 0; + } + + return ap; +} + +piper_vamp::PluginStaticData +PiperVampPluginFactory::getPluginStaticData(QString identifier) +{ + if (m_pluginData.find(identifier) != m_pluginData.end()) { + return m_pluginData[identifier]; + } else { + return {}; + } +} + +QString +PiperVampPluginFactory::getPluginCategory(QString identifier) +{ + if (m_taxonomy.find(identifier) != m_taxonomy.end()) { + return m_taxonomy[identifier]; + } else { + return {}; + } +} + +void +PiperVampPluginFactory::populate(QString &errorMessage) +{ + if (m_serverName == "") return; + + piper_vamp::client::ProcessQtTransport transport(m_serverName); + if (!transport.isOK()) { + errorMessage = QObject::tr("Could not start external plugin host"); + return; + } + + piper_vamp::client::CapnpRRClient client(&transport); + piper_vamp::ListResponse lr = client.listPluginData(); + + for (const auto &pd: lr.available) { + + QString identifier = + QString("vamp:") + QString::fromStdString(pd.pluginKey); + + m_pluginData[identifier] = pd; + + QStringList catlist; + for (const auto &cs: pd.category) { + catlist.push_back(QString::fromStdString(cs)); + } + + m_taxonomy[identifier] = catlist.join(" > "); + } +} +