Chris@49: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@52: Sonic Visualiser Chris@52: An audio file viewer and annotation editor. Chris@52: Centre for Digital Music, Queen Mary, University of London. Chris@1225: This file copyright 2006-2016 Chris Cannam and QMUL. Chris@0: Chris@52: This program is free software; you can redistribute it and/or Chris@52: modify it under the terms of the GNU General Public License as Chris@52: published by the Free Software Foundation; either version 2 of the Chris@52: License, or (at your option) any later version. See the file Chris@52: COPYING included with this distribution for more information. Chris@0: */ Chris@0: Chris@1225: #ifndef SV_PIPER_VAMP_PLUGIN_FACTORY_H Chris@1225: #define SV_PIPER_VAMP_PLUGIN_FACTORY_H Chris@0: Chris@1249: #ifdef HAVE_PIPER Chris@1249: Chris@1225: #include "FeatureExtractionPluginFactory.h" Chris@1225: Chris@1209: #include Chris@0: #include Chris@165: #include Chris@0: Chris@1225: #include "base/Debug.h" Chris@1246: #include "base/HelperExecPath.h" Chris@0: Chris@1225: /** Chris@1225: * FeatureExtractionPluginFactory type for Vamp plugins hosted in a Chris@1225: * separate process using Piper protocol. Chris@1225: */ Chris@1225: class PiperVampPluginFactory : public FeatureExtractionPluginFactory Chris@0: { Chris@0: public: lucas@1376: using ServerName = std::string; lucas@1376: using DesiredSubset = std::vector; lucas@1376: struct DesiredExtractors lucas@1376: { lucas@1376: DesiredExtractors() : allAvailable(false) {} // filtered, but invalid, by default (from should not be empty) lucas@1376: lucas@1376: DesiredExtractors(DesiredSubset subset) lucas@1376: : allAvailable(subset.empty()), from(subset) {} // if empty assume all available are wanted, can populate struct manually if not lucas@1376: lucas@1376: bool allAvailable; // used to disambiguate an empty filter list from wanting all available extractors, client code should inspect both to determine validity lucas@1376: DesiredSubset from; // this should only be populated if allAvailable is false lucas@1376: }; lucas@1376: lucas@1376: struct ServerDescription lucas@1376: { lucas@1376: ServerDescription(ServerName n) lucas@1376: : name(n), hasDesiredExtractors(false) {} // fall back to populating using PluginScan internally lucas@1376: ServerDescription(ServerName n, DesiredSubset desired) lucas@1376: : name(n), hasDesiredExtractors(true), extractors(desired) {} lucas@1376: ServerName name; lucas@1376: bool hasDesiredExtractors; // indicates whether to override the ListRequest made internally lucas@1376: DesiredExtractors extractors; // for populating the from field in a ListRequest lucas@1376: }; lucas@1376: Chris@1225: PiperVampPluginFactory(); lucas@1376: PiperVampPluginFactory(std::initializer_list servers); lucas@1376: lucas@1377: virtual void setDesiredExtractors(ServerDescription description); lucas@1376: Chris@1264: virtual ~PiperVampPluginFactory(); Chris@0: Chris@1227: virtual std::vector getPluginIdentifiers(QString &errorMessage) Chris@1227: override; Chris@0: Chris@1225: virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier) Chris@1225: override; Chris@1223: Chris@66: virtual Vamp::Plugin *instantiatePlugin(QString identifier, Chris@1225: sv_samplerate_t inputSampleRate) Chris@1225: override; Chris@0: Chris@1225: virtual QString getPluginCategory(QString identifier) override; Chris@165: Chris@0: protected: Chris@1225: QMutex m_mutex; Chris@1246: QList m_servers; // executable file paths Chris@1240: std::map m_origins; // plugin identifier -> server path Chris@1225: std::map m_pluginData; // identifier -> data Chris@1225: std::map m_taxonomy; // identifier -> category string lucas@1376: std::map m_overrideDesiredExtractors; Chris@1240: Chris@1227: void populate(QString &errorMessage); Chris@1246: void populateFrom(const HelperExecPath::HelperExec &, QString &errorMessage); Chris@1264: Chris@1264: class Logger; Chris@1264: Logger *m_logger; Chris@0: }; Chris@0: Chris@0: #endif Chris@1249: Chris@1249: #endif