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 }
|