comparison plugin/FeatureExtractionPluginFactory.cpp @ 1182:a1f410f895d3 3.0-integration

Merge from branch pluginscan
author Chris Cannam
date Fri, 15 Apr 2016 16:26:15 +0100
parents 98664afd518b
children 385deb828b4a
comparison
equal deleted inserted replaced
1175:4018fc0189bc 1182:a1f410f895d3
19 #include <vamp-hostsdk/PluginHostAdapter.h> 19 #include <vamp-hostsdk/PluginHostAdapter.h>
20 #include <vamp-hostsdk/PluginWrapper.h> 20 #include <vamp-hostsdk/PluginWrapper.h>
21 21
22 #include "system/System.h" 22 #include "system/System.h"
23 23
24 #include "PluginScan.h"
25
24 #include <QDir> 26 #include <QDir>
25 #include <QFile> 27 #include <QFile>
26 #include <QFileInfo> 28 #include <QFileInfo>
27 #include <QTextStream> 29 #include <QTextStream>
28 30
109 111
110 return rv; 112 return rv;
111 } 113 }
112 114
113 vector<QString> 115 vector<QString>
114 FeatureExtractionPluginFactory::getPluginCandidateFiles()
115 {
116 vector<QString> path = getPluginPath();
117 vector<QString> candidates;
118
119 for (QString dirname : path) {
120
121 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
122 cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: scanning directory " << dirname << endl;
123 #endif
124
125 QDir pluginDir(dirname, PLUGIN_GLOB,
126 QDir::Name | QDir::IgnoreCase,
127 QDir::Files | QDir::Readable);
128
129 for (unsigned int j = 0; j < pluginDir.count(); ++j) {
130 QString soname = pluginDir.filePath(pluginDir[j]);
131 candidates.push_back(soname);
132 }
133 }
134
135 return candidates;
136 }
137
138 vector<QString>
139 FeatureExtractionPluginFactory::winnowPluginCandidates(vector<QString> candidates,
140 QString &warningMessage)
141 {
142 vector<QString> good, bad;
143 vector<PluginLoadStatus> badStatuses;
144
145 for (QString c: candidates) {
146
147 PluginLoadStatus status =
148 TestPluginLoadability(c, "vampGetPluginDescriptor");
149
150 if (status == PluginLoadOK) {
151 good.push_back(c);
152 } else if (status == UnknownPluginLoadStatus) {
153 cerr << "WARNING: Unknown load status for plugin candidate \""
154 << c << "\", continuing" << endl;
155 good.push_back(c);
156 } else {
157 bad.push_back(c);
158 badStatuses.push_back(status);
159 }
160 }
161
162 if (!bad.empty()) {
163 warningMessage =
164 QObject::tr("<b>Failed to load plugins</b>"
165 "<p>Failed to load one or more plugin libraries:</p>\n");
166 warningMessage += "<ul>";
167 for (int i = 0; in_range_for(bad, i); ++i) {
168 QString m;
169 if (badStatuses[i] == PluginLoadFailedToLoadLibrary) {
170 m = QObject::tr("Failed to load library");
171 } else if (badStatuses[i] == PluginLoadFailedToFindDescriptor) {
172 m = QObject::tr("Failed to query plugins from library after loading");
173 } else if (badStatuses[i] == PluginLoadFailedElsewhere) {
174 m = QObject::tr("Unknown failure");
175 } else {
176 m = QObject::tr("Success: internal error?");
177 }
178 warningMessage += QString("<li>%1 (%2)</li>\n")
179 .arg(bad[i])
180 .arg(m);
181 }
182 warningMessage += "</ul>";
183 }
184 return good;
185 }
186
187 vector<QString>
188 FeatureExtractionPluginFactory::getPluginIdentifiers() 116 FeatureExtractionPluginFactory::getPluginIdentifiers()
189 { 117 {
190 Profiler profiler("FeatureExtractionPluginFactory::getPluginIdentifiers"); 118 Profiler profiler("FeatureExtractionPluginFactory::getPluginIdentifiers");
191 119
192 vector<QString> rv; 120 vector<QString> rv;
193 vector<QString> candidates = winnowPluginCandidates(getPluginCandidateFiles(), 121
194 m_pluginScanError); 122 QStringList candidates = PluginScan::getInstance()->getCandidateLibrariesFor
123 (PluginScan::VampPlugin);
195 124
196 for (QString soname : candidates) { 125 for (QString soname : candidates) {
197 126
198 void *libraryHandle = DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL); 127 void *libraryHandle = DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL);
199 128