# HG changeset patch # User Chris Cannam # Date 1478009207 0 # Node ID c6bdf247016a9f264a05082f9725b93171d17dac # Parent 42a4b058f8ba26c7bf35edf70784a1934e6b4d47 Support multiple plugin checker helpers, as for multiple piper servers diff -r 42a4b058f8ba -r c6bdf247016a files.pri --- a/files.pri Tue Nov 01 12:09:05 2016 +0000 +++ b/files.pri Tue Nov 01 14:06:47 2016 +0000 @@ -7,6 +7,7 @@ base/Command.h \ base/Debug.h \ base/Exceptions.h \ + base/HelperExecPath.h \ base/LogRange.h \ base/MagnitudeRange.h \ base/Pitch.h \ @@ -144,6 +145,7 @@ base/Command.cpp \ base/Debug.cpp \ base/Exceptions.cpp \ + base/HelperExecPath.cpp \ base/LogRange.cpp \ base/Pitch.cpp \ base/PlayParameterRepository.cpp \ diff -r 42a4b058f8ba -r c6bdf247016a plugin/PiperVampPluginFactory.cpp --- a/plugin/PiperVampPluginFactory.cpp Tue Nov 01 12:09:05 2016 +0000 +++ b/plugin/PiperVampPluginFactory.cpp Tue Nov 01 14:06:47 2016 +0000 @@ -4,7 +4,7 @@ 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 file copyright 2006-2016 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 @@ -37,6 +37,7 @@ #include #include "base/Profiler.h" +#include "base/HelperExecPath.h" #include "vamp-client/ProcessQtTransport.h" #include "vamp-client/CapnpRRClient.h" @@ -47,41 +48,16 @@ PiperVampPluginFactory::PiperVampPluginFactory() { - // 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-simple-server"; - QStringList suffixes = getServerSuffixes(); - QString extension = ""; -#ifdef _WIN32 - extension = ".exe"; -#endif + QString serverName = "piper-vamp-simple-server"; - for (QString s: suffixes) { - - QString path = myDir + "/piper-bin/" + name + s + extension; - - if (QFile(path).exists()) { - m_servers.push_back(path); - } else { - cerr << "NOTE: Piper Vamp server " << name << s - << " not found at " << path - << ", trying in my own directory" << endl; - path = myDir + "/" + name + s + extension; - - if (QFile(path).exists()) { - m_servers.push_back(path); - } else { - cerr << "NOTE: Piper Vamp server " << name << s - << " not found at " << path << endl; - } - } - } + m_servers = HelperExecPath::getHelperExecutables(serverName); if (m_servers.empty()) { - cerr << "NOTE: No Piper Vamp servers found" << endl; + cerr << "NOTE: No Piper Vamp servers found in installation;" + << " found none of the following:" << endl; + for (auto d: HelperExecPath::getHelperCandidatePaths(serverName)) { + cerr << "NOTE: " << d << endl; + } } } diff -r 42a4b058f8ba -r c6bdf247016a plugin/PluginScan.cpp --- a/plugin/PluginScan.cpp Tue Nov 01 12:09:05 2016 +0000 +++ b/plugin/PluginScan.cpp Tue Nov 01 14:06:47 2016 +0000 @@ -15,6 +15,7 @@ #include "PluginScan.h" #include "base/Debug.h" +#include "base/HelperExecPath.h" #include "checker/knownplugins.h" @@ -50,22 +51,36 @@ } PluginScan::~PluginScan() { - delete m_kp; + clear(); delete m_logger; } void -PluginScan::scan(QString helperExecutablePath) +PluginScan::scan() { - delete m_kp; + QStringList helperPaths = + HelperExecPath::getHelperExecutables("plugin-checker-helper"); + + clear(); + + for (auto p: helperPaths) { + try { + KnownPlugins *kp = new KnownPlugins(p.toStdString(), m_logger); + m_kp.push_back(kp); + m_succeeded = true; + } catch (const std::exception &e) { + cerr << "ERROR: PluginScan::scan: " << e.what() + << " (with helper path = " << p << ")" << endl; + } + } +} + +void +PluginScan::clear() +{ + for (auto &p: m_kp) delete p; + m_kp.clear(); m_succeeded = false; - try { - m_kp = new KnownPlugins(helperExecutablePath.toStdString(), m_logger); - m_succeeded = true; - } catch (const std::exception &e) { - cerr << "ERROR: PluginScan::scan: " << e.what() << endl; - m_kp = 0; - } } QStringList @@ -80,9 +95,10 @@ } QStringList candidates; - if (!m_kp) return candidates; - auto c = m_kp->getCandidateLibrariesFor(kpt); - for (auto s: c) candidates.push_back(s.c_str()); + for (auto kp: m_kp) { + auto c = kp->getCandidateLibrariesFor(kpt); + for (auto s: c) candidates.push_back(s.c_str()); + } return candidates; } @@ -96,20 +112,23 @@ "installed alongside %1?

") .arg(QCoreApplication::applicationName()); } - if (!m_kp) { + if (m_kp.empty()) { return QObject::tr("Did not scan for plugins" "

Apparently no scan for plugins was attempted " "(internal error?)

"); } - string report = m_kp->getFailureReport(); + QString report; + for (auto kp: m_kp) { + report += QString::fromStdString(kp->getFailureReport()); + } if (report == "") { - return QString(report.c_str()); + return report; } return QObject::tr("Failed to load plugins" "

Failed to load one or more plugin libraries:

") - + QString(report.c_str()) + + report + QObject::tr("

These plugins may be incompatible with the system, " "and will be ignored during this run of %1.

") .arg(QCoreApplication::applicationName()); diff -r 42a4b058f8ba -r c6bdf247016a plugin/PluginScan.h --- a/plugin/PluginScan.h Tue Nov 01 12:09:05 2016 +0000 +++ b/plugin/PluginScan.h Tue Nov 01 14:06:47 2016 +0000 @@ -16,6 +16,7 @@ #define PLUGIN_SCAN_H #include +#include class KnownPlugins; @@ -24,7 +25,7 @@ public: static PluginScan *getInstance(); - void scan(QString helperExecutablePath); + void scan(); bool scanSucceeded() const; @@ -40,7 +41,10 @@ private: PluginScan(); ~PluginScan(); - KnownPlugins *m_kp; + + void clear(); + + std::vector m_kp; bool m_succeeded; class Logger;