annotate plugin/FeatureExtractionPluginFactory.cpp @ 1209:385deb828b4a piper

Bodge in piper-cpp client (not yet working)
author Chris Cannam
date Fri, 14 Oct 2016 14:33:43 +0100
parents 98664afd518b
children 584b2d7d7cd9
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@202 7 This file copyright 2006 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@0 16 #include "FeatureExtractionPluginFactory.h"
Chris@0 17 #include "PluginIdentifier.h"
Chris@0 18
Chris@475 19 #include <vamp-hostsdk/PluginHostAdapter.h>
Chris@475 20 #include <vamp-hostsdk/PluginWrapper.h>
Chris@66 21
Chris@150 22 #include "system/System.h"
Chris@66 23
Chris@1179 24 #include "PluginScan.h"
Chris@1179 25
Chris@66 26 #include <QDir>
Chris@66 27 #include <QFile>
Chris@66 28 #include <QFileInfo>
Chris@165 29 #include <QTextStream>
Chris@66 30
Chris@0 31 #include <iostream>
Chris@0 32
Chris@408 33 #include "base/Profiler.h"
Chris@408 34
Chris@1164 35 using namespace std;
Chris@1164 36
Chris@249 37 //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1
Chris@249 38
Chris@0 39 static FeatureExtractionPluginFactory *_nativeInstance = 0;
Chris@0 40
Chris@0 41 FeatureExtractionPluginFactory *
Chris@0 42 FeatureExtractionPluginFactory::instance(QString pluginType)
Chris@0 43 {
Chris@71 44 if (pluginType == "vamp") {
Chris@0 45 if (!_nativeInstance) {
Chris@690 46 // SVDEBUG << "FeatureExtractionPluginFactory::instance(" << pluginType// << "): creating new FeatureExtractionPluginFactory" << endl;
Chris@0 47 _nativeInstance = new FeatureExtractionPluginFactory();
Chris@0 48 }
Chris@0 49 return _nativeInstance;
Chris@0 50 }
Chris@0 51
Chris@0 52 else return 0;
Chris@0 53 }
Chris@0 54
Chris@0 55 FeatureExtractionPluginFactory *
Chris@0 56 FeatureExtractionPluginFactory::instanceFor(QString identifier)
Chris@0 57 {
Chris@0 58 QString type, soName, label;
Chris@0 59 PluginIdentifier::parseIdentifier(identifier, type, soName, label);
Chris@0 60 return instance(type);
Chris@0 61 }
Chris@0 62
Chris@1209 63 FeatureExtractionPluginFactory::FeatureExtractionPluginFactory() :
Chris@1209 64 m_transport("piper-cpp/bin/piper-vamp-server"),
Chris@1209 65 m_client(&m_transport)
Chris@66 66 {
Chris@66 67 }
Chris@66 68
Chris@1164 69 vector<QString>
Chris@0 70 FeatureExtractionPluginFactory::getAllPluginIdentifiers()
Chris@0 71 {
Chris@0 72 FeatureExtractionPluginFactory *factory;
Chris@1164 73 vector<QString> rv;
Chris@0 74
Chris@66 75 factory = instance("vamp");
Chris@0 76 if (factory) {
Chris@1164 77 vector<QString> tmp = factory->getPluginIdentifiers();
Chris@0 78 for (size_t i = 0; i < tmp.size(); ++i) {
Chris@843 79 // cerr << "identifier: " << tmp[i] << endl;
Chris@0 80 rv.push_back(tmp[i]);
Chris@0 81 }
Chris@0 82 }
Chris@0 83
Chris@0 84 // Plugins can change the locale, revert it to default.
Chris@608 85 RestoreStartupLocale();
Chris@608 86
Chris@0 87 return rv;
Chris@0 88 }
Chris@0 89
Chris@1164 90 vector<QString>
Chris@0 91 FeatureExtractionPluginFactory::getPluginIdentifiers()
Chris@0 92 {
Chris@408 93 Profiler profiler("FeatureExtractionPluginFactory::getPluginIdentifiers");
Chris@408 94
Chris@1209 95 QMutexLocker locker(&m_mutex);
Chris@1209 96
Chris@1209 97 if (m_pluginData.empty()) {
Chris@1209 98 populate();
Chris@1209 99 }
Chris@1209 100
Chris@1164 101 vector<QString> rv;
Chris@1179 102
Chris@1209 103 for (const auto &d: m_pluginData) {
Chris@1209 104 rv.push_back(QString("vamp:") + QString::fromStdString(d.pluginKey));
Chris@66 105 }
Chris@66 106
Chris@0 107 return rv;
Chris@0 108 }
Chris@0 109
Chris@66 110 Vamp::Plugin *
Chris@0 111 FeatureExtractionPluginFactory::instantiatePlugin(QString identifier,
Chris@1040 112 sv_samplerate_t inputSampleRate)
Chris@0 113 {
Chris@408 114 Profiler profiler("FeatureExtractionPluginFactory::instantiatePlugin");
Chris@408 115
Chris@66 116 QString type, soname, label;
Chris@66 117 PluginIdentifier::parseIdentifier(identifier, type, soname, label);
Chris@0 118
Chris@1209 119 piper_vamp::LoadRequest request;
Chris@1209 120 request.pluginKey = (soname + ":" + label).toStdString();
Chris@1209 121 request.inputSampleRate = inputSampleRate;
Chris@1209 122 request.adapterFlags = 0;
Chris@1209 123 piper_vamp::LoadResponse response = m_client.loadPlugin(request);
Chris@66 124
Chris@1209 125 return response.plugin;
Chris@298 126 }
Chris@298 127
Chris@165 128 QString
Chris@165 129 FeatureExtractionPluginFactory::getPluginCategory(QString identifier)
Chris@165 130 {
Chris@1209 131 //!!! (re)implement
Chris@1209 132 // return m_taxonomy[identifier];
Chris@1209 133 return QString();
Chris@165 134 }
Chris@165 135
Chris@165 136 void
Chris@1209 137 FeatureExtractionPluginFactory::populate()
Chris@165 138 {
Chris@1209 139 piper_vamp::ListResponse lr = m_client.listPluginData();
Chris@1209 140 m_pluginData = lr.available;
Chris@1209 141 }
Chris@165 142