changeset 1241:c6bdf247016a 3.0-integration

Support multiple plugin checker helpers, as for multiple piper servers
author Chris Cannam
date Tue, 01 Nov 2016 14:06:47 +0000 (2016-11-01)
parents 42a4b058f8ba
children c401e738793f 67aee57e32c8
files files.pri plugin/PiperVampPluginFactory.cpp plugin/PluginScan.cpp plugin/PluginScan.h
diffstat 4 files changed, 53 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- 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 \
--- 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 <iostream>
 
 #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;
+        }
     }
 }
 
--- 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?</p>")
             .arg(QCoreApplication::applicationName());
     }
-    if (!m_kp) {
+    if (m_kp.empty()) {
 	return QObject::tr("<b>Did not scan for plugins</b>"
 			   "<p>Apparently no scan for plugins was attempted "
 			   "(internal error?)</p>");
     }
 
-    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("<b>Failed to load plugins</b>"
 		       "<p>Failed to load one or more plugin libraries:</p>")
-	+ QString(report.c_str())
+	+ report
         + QObject::tr("<p>These plugins may be incompatible with the system, "
                       "and will be ignored during this run of %1.</p>")
         .arg(QCoreApplication::applicationName());
--- 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 <QStringList>
+#include <vector>
 
 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<KnownPlugins *> m_kp;
     bool m_succeeded;
 
     class Logger;