annotate plugin/PiperVampPluginFactory.h @ 1376:d9511f9e04d7 dev/refactor-piper-related

Introduce some POD structs for describing an external server application and the desired libraries to load from it, and disambiguating between empty list request and invalid list request. This allows for overriding PiperVampPluginFactory behaviour for using a PluginScan to populate the list request.
author Lucas Thompson <lucas.thompson@qmul.ac.uk>
date Fri, 10 Feb 2017 11:15:19 +0000
parents da5f4d37988d
children f1c4ca3ccaa3
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1225 7 This file copyright 2006-2016 Chris Cannam and QMUL.
Chris@0 8
Chris@52 9 This program is free software; you can redistribute it and/or
Chris@52 10 modify it under the terms of the GNU General Public License as
Chris@52 11 published by the Free Software Foundation; either version 2 of the
Chris@52 12 License, or (at your option) any later version. See the file
Chris@52 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@1225 16 #ifndef SV_PIPER_VAMP_PLUGIN_FACTORY_H
Chris@1225 17 #define SV_PIPER_VAMP_PLUGIN_FACTORY_H
Chris@0 18
Chris@1249 19 #ifdef HAVE_PIPER
Chris@1249 20
Chris@1225 21 #include "FeatureExtractionPluginFactory.h"
Chris@1225 22
Chris@1209 23 #include <QMutex>
Chris@0 24 #include <vector>
Chris@165 25 #include <map>
Chris@0 26
Chris@1225 27 #include "base/Debug.h"
Chris@1246 28 #include "base/HelperExecPath.h"
Chris@0 29
Chris@1225 30 /**
Chris@1225 31 * FeatureExtractionPluginFactory type for Vamp plugins hosted in a
Chris@1225 32 * separate process using Piper protocol.
Chris@1225 33 */
Chris@1225 34 class PiperVampPluginFactory : public FeatureExtractionPluginFactory
Chris@0 35 {
Chris@0 36 public:
lucas@1376 37 using ServerName = std::string;
lucas@1376 38 using DesiredSubset = std::vector<std::string>;
lucas@1376 39 struct DesiredExtractors
lucas@1376 40 {
lucas@1376 41 DesiredExtractors() : allAvailable(false) {} // filtered, but invalid, by default (from should not be empty)
lucas@1376 42
lucas@1376 43 DesiredExtractors(DesiredSubset subset)
lucas@1376 44 : allAvailable(subset.empty()), from(subset) {} // if empty assume all available are wanted, can populate struct manually if not
lucas@1376 45
lucas@1376 46 bool allAvailable; // used to disambiguate an empty filter list from wanting all available extractors, client code should inspect both to determine validity
lucas@1376 47 DesiredSubset from; // this should only be populated if allAvailable is false
lucas@1376 48 };
lucas@1376 49
lucas@1376 50 struct ServerDescription
lucas@1376 51 {
lucas@1376 52 ServerDescription(ServerName n)
lucas@1376 53 : name(n), hasDesiredExtractors(false) {} // fall back to populating using PluginScan internally
lucas@1376 54 ServerDescription(ServerName n, DesiredSubset desired)
lucas@1376 55 : name(n), hasDesiredExtractors(true), extractors(desired) {}
lucas@1376 56 ServerName name;
lucas@1376 57 bool hasDesiredExtractors; // indicates whether to override the ListRequest made internally
lucas@1376 58 DesiredExtractors extractors; // for populating the from field in a ListRequest
lucas@1376 59 };
lucas@1376 60
Chris@1225 61 PiperVampPluginFactory();
lucas@1376 62 PiperVampPluginFactory(std::initializer_list<ServerDescription> servers);
lucas@1376 63
lucas@1376 64 virtual void setDesiredExtractors(ServerName name, DesiredExtractors extractors);
lucas@1376 65
Chris@1264 66 virtual ~PiperVampPluginFactory();
Chris@0 67
Chris@1227 68 virtual std::vector<QString> getPluginIdentifiers(QString &errorMessage)
Chris@1227 69 override;
Chris@0 70
Chris@1225 71 virtual piper_vamp::PluginStaticData getPluginStaticData(QString identifier)
Chris@1225 72 override;
Chris@1223 73
Chris@66 74 virtual Vamp::Plugin *instantiatePlugin(QString identifier,
Chris@1225 75 sv_samplerate_t inputSampleRate)
Chris@1225 76 override;
Chris@0 77
Chris@1225 78 virtual QString getPluginCategory(QString identifier) override;
Chris@165 79
Chris@0 80 protected:
Chris@1225 81 QMutex m_mutex;
Chris@1246 82 QList<HelperExecPath::HelperExec> m_servers; // executable file paths
Chris@1240 83 std::map<QString, QString> m_origins; // plugin identifier -> server path
Chris@1225 84 std::map<QString, piper_vamp::PluginStaticData> m_pluginData; // identifier -> data
Chris@1225 85 std::map<QString, QString> m_taxonomy; // identifier -> category string
lucas@1376 86 std::map<ServerName, DesiredExtractors> m_overrideDesiredExtractors;
Chris@1240 87
Chris@1227 88 void populate(QString &errorMessage);
Chris@1246 89 void populateFrom(const HelperExecPath::HelperExec &, QString &errorMessage);
Chris@1264 90
Chris@1264 91 class Logger;
Chris@1264 92 Logger *m_logger;
Chris@0 93 };
Chris@0 94
Chris@0 95 #endif
Chris@1249 96
Chris@1249 97 #endif