19 #include <vamp-hostsdk/PluginHostAdapter.h> 20 #include <vamp-hostsdk/PluginWrapper.h> 27 #include <QTextStream> 39 PluginWrapper(plugin),
m_factory(factory) { }
48 Vamp::Plugin *p = m_plugin;
61 if (pluginType ==
"vamp") {
75 QString type, soName, label;
85 std::vector<std::string> p = Vamp::PluginHostAdapter::getPluginPath();
86 for (
size_t i = 0; i < p.size(); ++i)
m_pluginPath.push_back(p[i].c_str());
94 std::vector<QString> rv;
99 for (
size_t i = 0; i < tmp.size(); ++i) {
101 rv.push_back(tmp[i]);
114 Profiler profiler(
"FeatureExtractionPluginFactory::getPluginIdentifiers");
116 std::vector<QString> rv;
119 for (std::vector<QString>::iterator i = path.begin(); i != path.end(); ++i) {
121 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 122 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: scanning directory " << i-<< endl;
126 QDir::Name | QDir::IgnoreCase,
127 QDir::Files | QDir::Readable);
129 for (
unsigned int j = 0; j < pluginDir.count(); ++j) {
131 QString soname = pluginDir.filePath(pluginDir[j]);
133 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 134 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: trying potential library " << soname << endl;
137 void *libraryHandle =
DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL);
139 if (!libraryHandle) {
140 cerr <<
"WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to load library " << soname <<
": " <<
DLERROR() << endl;
144 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 145 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: It's a library all right, checking for descriptor" << endl;
148 VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)
149 DLSYM(libraryHandle,
"vampGetPluginDescriptor");
152 cerr <<
"WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: No descriptor function in " << soname << endl;
153 if (
DLCLOSE(libraryHandle) != 0) {
154 cerr <<
"WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to unload library " << soname << endl;
159 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 160 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: Vamp descriptor found" << endl;
163 const VampPluginDescriptor *descriptor = 0;
166 std::map<std::string, int> known;
169 while ((descriptor = fn(VAMP_API_VERSION, index))) {
171 if (known.find(descriptor->identifier) != known.end()) {
172 cerr <<
"WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Plugin library " 174 <<
" returns the same plugin identifier \"" 175 << descriptor->identifier <<
"\" at indices " 176 << known[descriptor->identifier] <<
" and " 178 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: Avoiding this library (obsolete API?)" << endl;
182 known[descriptor->identifier] = index;
192 while ((descriptor = fn(VAMP_API_VERSION, index))) {
195 (
"vamp", soname, descriptor->identifier);
197 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 198 SVDEBUG <<
"FeatureExtractionPluginFactory::getPluginIdentifiers: Found plugin id " <<
id <<
" at index " << index << endl;
204 if (
DLCLOSE(libraryHandle) != 0) {
205 cerr <<
"WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to unload library " << soname << endl;
220 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 221 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile(\"" 222 << soname <<
"\", \"" << inDir <<
"\")" 229 QDir::Name | QDir::IgnoreCase,
230 QDir::Files | QDir::Readable);
231 if (!dir.exists())
return "";
233 file = dir.filePath(QFileInfo(soname).fileName());
235 if (QFileInfo(file).exists() && QFileInfo(file).isFile()) {
237 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 238 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile: " 239 <<
"found trivially at " << file << endl;
245 for (
unsigned int j = 0; j < dir.count(); ++j) {
246 file = dir.filePath(dir[j]);
247 if (QFileInfo(file).baseName() == QFileInfo(soname).baseName()) {
249 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 250 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile: " 251 <<
"found \"" << soname <<
"\" at " << file << endl;
258 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 259 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile (with dir): " 260 <<
"not found" << endl;
267 QFileInfo fi(soname);
269 if (fi.isAbsolute() && fi.exists() && fi.isFile()) {
270 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 271 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile: " 272 <<
"found trivially at " << soname << endl;
277 if (fi.isAbsolute() && fi.absolutePath() !=
"") {
279 if (file !=
"")
return file;
283 for (std::vector<QString>::iterator i = path.begin();
284 i != path.end(); ++i) {
287 if (file !=
"")
return file;
291 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 292 SVDEBUG <<
"FeatureExtractionPluginFactory::findPluginFile: " 293 <<
"not found" << endl;
302 float inputSampleRate)
304 Profiler profiler(
"FeatureExtractionPluginFactory::instantiatePlugin");
306 Vamp::Plugin *rv = 0;
307 Vamp::PluginHostAdapter *plugin = 0;
309 const VampPluginDescriptor *descriptor = 0;
312 QString type, soname, label;
314 if (type !=
"vamp") {
315 SVDEBUG <<
"FeatureExtractionPluginFactory::instantiatePlugin: Wrong factory for plugin type " << type << endl;
322 cerr <<
"FeatureExtractionPluginFactory::instantiatePlugin: Failed to find library file " << soname << endl;
324 }
else if (found != soname) {
326 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 327 SVDEBUG <<
"FeatureExtractionPluginFactory::instantiatePlugin: Given library name was " << soname <<
", found at " << found << endl;
328 cerr << soname <<
" -> " << found << endl;
335 void *libraryHandle =
DLOPEN(soname, RTLD_LAZY | RTLD_LOCAL);
337 if (!libraryHandle) {
338 cerr <<
"FeatureExtractionPluginFactory::instantiatePlugin: Failed to load library " << soname <<
": " <<
DLERROR() << endl;
342 VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)
343 DLSYM(libraryHandle,
"vampGetPluginDescriptor");
346 SVDEBUG <<
"FeatureExtractionPluginFactory::instantiatePlugin: No descriptor function in " << soname << endl;
350 while ((descriptor = fn(VAMP_API_VERSION, index))) {
351 if (label == descriptor->identifier)
break;
356 cerr <<
"FeatureExtractionPluginFactory::instantiatePlugin: Failed to find plugin \"" << label <<
"\" in library " << soname << endl;
360 plugin =
new Vamp::PluginHostAdapter(descriptor, inputSampleRate);
373 if (
DLCLOSE(libraryHandle) != 0) {
374 cerr <<
"WARNING: FeatureExtractionPluginFactory::instantiatePlugin: Failed to unload library " << soname << endl;
404 std::vector<QString> path;
406 for (
size_t i = 0; i < pluginPath.size(); ++i) {
407 if (pluginPath[i].contains(
"/lib/")) {
408 QString p(pluginPath[i]);
410 p.replace(
"/lib/",
"/share/");
413 path.push_back(pluginPath[i]);
416 for (
size_t i = 0; i < path.size(); ++i) {
418 QDir dir(path[i],
"*.cat");
421 for (
unsigned int j = 0; j < dir.count(); ++j) {
423 QFile file(path[i] +
"/" + dir[j]);
427 if (file.open(QIODevice::ReadOnly)) {
429 QTextStream stream(&file);
432 while (!stream.atEnd()) {
433 line = stream.readLine();
436 (line.section(
"::", 0, 0));
437 QString cat = line.section(
"::", 1, 1);
FeatureExtractionPluginFactory * m_factory
static QString canonicalise(QString identifier)
static void parseIdentifier(QString identifier, QString &type, QString &soName, QString &label)
static QString createIdentifier(QString type, QString soName, QString label)
virtual ~PluginDeletionNotifyAdapter()
PluginDeletionNotifyAdapter(Vamp::Plugin *plugin, FeatureExtractionPluginFactory *factory)
void RestoreStartupLocale()
Profile point instance class.