annotate knownplugins.cpp @ 4:6f891a9c6434

Make checker with hard-coded knowledge about various plugin types and paths; fix some process management problems
author Chris Cannam
date Wed, 13 Apr 2016 12:00:07 +0100
parents
children 74064d6f5e07
rev   line source
Chris@4 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@4 2
Chris@4 3 #include "knownplugins.h"
Chris@4 4
Chris@4 5 #include <sstream>
Chris@4 6
Chris@4 7 using namespace std;
Chris@4 8
Chris@4 9 #if defined(_WIN32)
Chris@4 10 #define PATH_SEPARATOR ';'
Chris@4 11 #else
Chris@4 12 #define PATH_SEPARATOR ':'
Chris@4 13 #endif
Chris@4 14
Chris@4 15 KnownPlugins::KnownPlugins() :
Chris@4 16 m_candidates("./helper") //!!!??? wot to do
Chris@4 17 {
Chris@4 18 m_known = {
Chris@4 19 {
Chris@4 20 VampPlugin,
Chris@4 21 {
Chris@4 22 "vamp",
Chris@4 23 expandConventionalPath(VampPlugin, "VAMP_PATH"),
Chris@4 24 "vampGetPluginDescriptor"
Chris@4 25 },
Chris@4 26 }, {
Chris@4 27 LADSPAPlugin,
Chris@4 28 {
Chris@4 29 "ladspa",
Chris@4 30 expandConventionalPath(LADSPAPlugin, "LADSPA_PATH"),
Chris@4 31 "ladspa_descriptor"
Chris@4 32 },
Chris@4 33 }, {
Chris@4 34 DSSIPlugin,
Chris@4 35 {
Chris@4 36 "dssi",
Chris@4 37 expandConventionalPath(DSSIPlugin, "DSSI_PATH"),
Chris@4 38 "dssi_descriptor"
Chris@4 39 }
Chris@4 40 }
Chris@4 41 };
Chris@4 42
Chris@4 43 for (const auto &k: m_known) {
Chris@4 44 m_candidates.scan(k.second.tag, k.second.path, k.second.descriptor);
Chris@4 45 }
Chris@4 46 }
Chris@4 47
Chris@4 48 string
Chris@4 49 KnownPlugins::getDefaultPath(PluginType type)
Chris@4 50 {
Chris@4 51 switch (type) {
Chris@4 52
Chris@4 53 #if defined(_WIN32)
Chris@4 54
Chris@4 55 case VampPlugin:
Chris@4 56 return "%ProgramFiles%\\Vamp Plugins";
Chris@4 57 case LADSPAPlugin:
Chris@4 58 return "%ProgramFiles%\\LADSPA Plugins;%ProgramFiles%\\Audacity\\Plug-Ins";
Chris@4 59 case DSSIPlugin:
Chris@4 60 return "%ProgramFiles%\\DSSI Plugins";
Chris@4 61
Chris@4 62 #elif defined(__APPLE__)
Chris@4 63
Chris@4 64 case VampPlugin:
Chris@4 65 return "$HOME/Library/Audio/Plug-Ins/Vamp:/Library/Audio/Plug-Ins/Vamp";
Chris@4 66 case LADSPAPlugin:
Chris@4 67 return "$HOME/Library/Audio/Plug-Ins/LADSPA:/Library/Audio/Plug-Ins/LADSPA";
Chris@4 68 case DSSIPlugin:
Chris@4 69 return "$HOME/Library/Audio/Plug-Ins/DSSI:/Library/Audio/Plug-Ins/DSSI";
Chris@4 70
Chris@4 71 #else /* Linux, BSDs, etc */
Chris@4 72
Chris@4 73 case VampPlugin:
Chris@4 74 return "$HOME/vamp:$HOME/.vamp:/usr/local/lib/vamp:/usr/lib/vamp";
Chris@4 75 case LADSPAPlugin:
Chris@4 76 return "$HOME/ladspa:$HOME/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa";
Chris@4 77 case DSSIPlugin:
Chris@4 78 return "$HOME/dssi:$HOME/.dssi:/usr/local/lib/dssi:/usr/lib/dssi";
Chris@4 79 #endif
Chris@4 80 }
Chris@4 81
Chris@4 82 throw logic_error("unknown or unhandled plugin type");
Chris@4 83 }
Chris@4 84
Chris@4 85 vector<string>
Chris@4 86 KnownPlugins::expandConventionalPath(PluginType type, string var)
Chris@4 87 {
Chris@4 88 vector<string> pathList;
Chris@4 89 string path;
Chris@4 90
Chris@4 91 char *cpath = getenv(var.c_str());
Chris@4 92 if (cpath) path = cpath;
Chris@4 93
Chris@4 94 if (path == "") {
Chris@4 95
Chris@4 96 path = getDefaultPath(type);
Chris@4 97
Chris@4 98 if (path != "") {
Chris@4 99
Chris@4 100 char *home = getenv("HOME");
Chris@4 101 if (home) {
Chris@4 102 string::size_type f;
Chris@4 103 while ((f = path.find("$HOME")) != string::npos &&
Chris@4 104 f < path.length()) {
Chris@4 105 path.replace(f, 5, home);
Chris@4 106 }
Chris@4 107 }
Chris@4 108
Chris@4 109 #ifdef _WIN32
Chris@4 110 char *pfiles = getenv("ProgramFiles");
Chris@4 111 if (!pfiles) pfiles = "C:\\Program Files";
Chris@4 112 {
Chris@4 113 string::size_type f;
Chris@4 114 while ((f = path.find("%ProgramFiles%")) != string::npos &&
Chris@4 115 f < path.length()) {
Chris@4 116 path.replace(f, 14, pfiles);
Chris@4 117 }
Chris@4 118 }
Chris@4 119 #endif
Chris@4 120 }
Chris@4 121 }
Chris@4 122
Chris@4 123 string::size_type index = 0, newindex = 0;
Chris@4 124
Chris@4 125 while ((newindex = path.find(PATH_SEPARATOR, index)) < path.size()) {
Chris@4 126 pathList.push_back(path.substr(index, newindex - index).c_str());
Chris@4 127 index = newindex + 1;
Chris@4 128 }
Chris@4 129
Chris@4 130 pathList.push_back(path.substr(index));
Chris@4 131
Chris@4 132 return pathList;
Chris@4 133 }
Chris@4 134
Chris@4 135 string
Chris@4 136 KnownPlugins::getFailureReport() const
Chris@4 137 {
Chris@4 138 vector<PluginCandidates::FailureRec> failures;
Chris@4 139
Chris@4 140 for (auto t: getKnownPluginTypes()) {
Chris@4 141 auto ff = m_candidates.getFailedLibrariesFor(getTagFor(t));
Chris@4 142 failures.insert(failures.end(), ff.begin(), ff.end());
Chris@4 143 }
Chris@4 144
Chris@4 145 if (failures.empty()) return "";
Chris@4 146
Chris@4 147 int n = failures.size();
Chris@4 148 int i = 0;
Chris@4 149
Chris@4 150 ostringstream os;
Chris@4 151
Chris@4 152 os << "<ul>";
Chris@4 153 for (auto f: failures) {
Chris@4 154 os << "<li>" + f.library;
Chris@4 155 if (f.message != "") {
Chris@4 156 os << " (" + f.message + ")";
Chris@4 157 } else {
Chris@4 158 os << " (unknown error)";
Chris@4 159 }
Chris@4 160 os << "</li>";
Chris@4 161
Chris@4 162 if (n > 10) {
Chris@4 163 if (++i == 5) {
Chris@4 164 os << "<li>(... and " << (n - i) << " further failures)</li>";
Chris@4 165 break;
Chris@4 166 }
Chris@4 167 }
Chris@4 168 }
Chris@4 169 os << "</ul>";
Chris@4 170
Chris@4 171 return os.str();
Chris@4 172 }