annotate plugin/FeatureExtractionPluginFactory.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "FeatureExtractionPluginFactory.h"
lbajardsilogic@0 17 #include "PluginIdentifier.h"
lbajardsilogic@0 18
lbajardsilogic@0 19 #include "vamp/vamp.h"
lbajardsilogic@0 20 #include "vamp-sdk/PluginHostAdapter.h"
lbajardsilogic@0 21
lbajardsilogic@0 22 #include "system/System.h"
lbajardsilogic@0 23
lbajardsilogic@0 24 #include <QDir>
lbajardsilogic@0 25 #include <QFile>
lbajardsilogic@0 26 #include <QFileInfo>
lbajardsilogic@0 27 #include <QTextStream>
lbajardsilogic@0 28
lbajardsilogic@0 29 #include <iostream>
lbajardsilogic@0 30
lbajardsilogic@0 31 //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1
lbajardsilogic@0 32
lbajardsilogic@0 33 static FeatureExtractionPluginFactory *_nativeInstance = 0;
lbajardsilogic@0 34
lbajardsilogic@0 35 FeatureExtractionPluginFactory *
lbajardsilogic@0 36 FeatureExtractionPluginFactory::instance(QString pluginType)
lbajardsilogic@0 37 {
lbajardsilogic@0 38 if (pluginType == "vamp") {
lbajardsilogic@0 39 if (!_nativeInstance) {
lbajardsilogic@0 40 // std::cerr << "FeatureExtractionPluginFactory::instance(" << pluginType.toStdString()
lbajardsilogic@0 41 // << "): creating new FeatureExtractionPluginFactory" << std::endl;
lbajardsilogic@0 42 _nativeInstance = new FeatureExtractionPluginFactory();
lbajardsilogic@0 43 }
lbajardsilogic@0 44 return _nativeInstance;
lbajardsilogic@0 45 }
lbajardsilogic@0 46
lbajardsilogic@0 47 else return 0;
lbajardsilogic@0 48 }
lbajardsilogic@0 49
lbajardsilogic@0 50 FeatureExtractionPluginFactory *
lbajardsilogic@0 51 FeatureExtractionPluginFactory::instanceFor(QString identifier)
lbajardsilogic@0 52 {
lbajardsilogic@0 53 QString type, soName, label;
lbajardsilogic@0 54 PluginIdentifier::parseIdentifier(identifier, type, soName, label);
lbajardsilogic@0 55 return instance(type);
lbajardsilogic@0 56 }
lbajardsilogic@0 57
lbajardsilogic@0 58 std::vector<QString>
lbajardsilogic@0 59 FeatureExtractionPluginFactory::getPluginPath()
lbajardsilogic@0 60 {
lbajardsilogic@0 61 if (!m_pluginPath.empty()) return m_pluginPath;
lbajardsilogic@0 62
lbajardsilogic@0 63 std::vector<std::string> p = Vamp::PluginHostAdapter::getPluginPath();
lbajardsilogic@0 64 for (size_t i = 0; i < p.size(); ++i) m_pluginPath.push_back(p[i].c_str());
lbajardsilogic@0 65 return m_pluginPath;
lbajardsilogic@0 66 }
lbajardsilogic@0 67
lbajardsilogic@0 68 std::vector<QString>
lbajardsilogic@0 69 FeatureExtractionPluginFactory::getAllPluginIdentifiers()
lbajardsilogic@0 70 {
lbajardsilogic@0 71 FeatureExtractionPluginFactory *factory;
lbajardsilogic@0 72 std::vector<QString> rv;
lbajardsilogic@0 73
lbajardsilogic@0 74 factory = instance("vamp");
lbajardsilogic@0 75 if (factory) {
lbajardsilogic@0 76 std::vector<QString> tmp = factory->getPluginIdentifiers();
lbajardsilogic@0 77 for (size_t i = 0; i < tmp.size(); ++i) {
lbajardsilogic@0 78 rv.push_back(tmp[i]);
lbajardsilogic@0 79 }
lbajardsilogic@0 80 }
lbajardsilogic@0 81
lbajardsilogic@0 82 // Plugins can change the locale, revert it to default.
lbajardsilogic@0 83 setlocale(LC_ALL, "C");
lbajardsilogic@0 84 return rv;
lbajardsilogic@0 85 }
lbajardsilogic@0 86
lbajardsilogic@0 87 std::vector<QString>
lbajardsilogic@0 88 FeatureExtractionPluginFactory::getPluginIdentifiers()
lbajardsilogic@0 89 {
lbajardsilogic@0 90 std::vector<QString> rv;
lbajardsilogic@0 91 std::vector<QString> path = getPluginPath();
lbajardsilogic@0 92
lbajardsilogic@0 93 for (std::vector<QString>::iterator i = path.begin(); i != path.end(); ++i) {
lbajardsilogic@0 94
lbajardsilogic@0 95 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 96 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: scanning directory " << i->toStdString() << std::endl;
lbajardsilogic@0 97 #endif
lbajardsilogic@0 98
lbajardsilogic@0 99 QDir pluginDir(*i, PLUGIN_GLOB,
lbajardsilogic@0 100 QDir::Name | QDir::IgnoreCase,
lbajardsilogic@0 101 QDir::Files | QDir::Readable);
lbajardsilogic@0 102
lbajardsilogic@0 103 for (unsigned int j = 0; j < pluginDir.count(); ++j) {
lbajardsilogic@0 104
lbajardsilogic@0 105 QString soname = pluginDir.filePath(pluginDir[j]);
lbajardsilogic@0 106
lbajardsilogic@0 107 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 108 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: trying potential library " << soname.toStdString() << std::endl;
lbajardsilogic@0 109 #endif
lbajardsilogic@0 110
lbajardsilogic@0 111 void *libraryHandle = DLOPEN(soname, RTLD_LAZY);
lbajardsilogic@0 112
lbajardsilogic@0 113 if (!libraryHandle) {
lbajardsilogic@0 114 std::cerr << "WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to load library " << soname.toStdString() << ": " << DLERROR() << std::endl;
lbajardsilogic@0 115 continue;
lbajardsilogic@0 116 }
lbajardsilogic@0 117
lbajardsilogic@0 118 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 119 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: It's a library all right, checking for descriptor" << std::endl;
lbajardsilogic@0 120 #endif
lbajardsilogic@0 121
lbajardsilogic@0 122 VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)
lbajardsilogic@0 123 DLSYM(libraryHandle, "vampGetPluginDescriptor");
lbajardsilogic@0 124
lbajardsilogic@0 125 if (!fn) {
lbajardsilogic@0 126 std::cerr << "WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: No descriptor function in " << soname.toStdString() << std::endl;
lbajardsilogic@0 127 if (DLCLOSE(libraryHandle) != 0) {
lbajardsilogic@0 128 std::cerr << "WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to unload library " << soname.toStdString() << std::endl;
lbajardsilogic@0 129 }
lbajardsilogic@0 130 continue;
lbajardsilogic@0 131 }
lbajardsilogic@0 132
lbajardsilogic@0 133 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 134 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: Vamp descriptor found" << std::endl;
lbajardsilogic@0 135 #endif
lbajardsilogic@0 136
lbajardsilogic@0 137 const VampPluginDescriptor *descriptor = 0;
lbajardsilogic@0 138 int index = 0;
lbajardsilogic@0 139
lbajardsilogic@0 140 std::map<std::string, int> known;
lbajardsilogic@0 141 bool ok = true;
lbajardsilogic@0 142
lbajardsilogic@0 143 while ((descriptor = fn(VAMP_API_VERSION, index))) {
lbajardsilogic@0 144
lbajardsilogic@0 145 if (known.find(descriptor->identifier) != known.end()) {
lbajardsilogic@0 146 std::cerr << "WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Plugin library "
lbajardsilogic@0 147 << soname.toStdString()
lbajardsilogic@0 148 << " returns the same plugin identifier \""
lbajardsilogic@0 149 << descriptor->identifier << "\" at indices "
lbajardsilogic@0 150 << known[descriptor->identifier] << " and "
lbajardsilogic@0 151 << index << std::endl;
lbajardsilogic@0 152 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: Avoiding this library (obsolete API?)" << std::endl;
lbajardsilogic@0 153 ok = false;
lbajardsilogic@0 154 break;
lbajardsilogic@0 155 } else {
lbajardsilogic@0 156 known[descriptor->identifier] = index;
lbajardsilogic@0 157 }
lbajardsilogic@0 158
lbajardsilogic@0 159 ++index;
lbajardsilogic@0 160 }
lbajardsilogic@0 161
lbajardsilogic@0 162 if (ok) {
lbajardsilogic@0 163
lbajardsilogic@0 164 index = 0;
lbajardsilogic@0 165
lbajardsilogic@0 166 while ((descriptor = fn(VAMP_API_VERSION, index))) {
lbajardsilogic@0 167
lbajardsilogic@0 168 QString id = PluginIdentifier::createIdentifier
lbajardsilogic@0 169 ("vamp", soname, descriptor->identifier);
lbajardsilogic@0 170 rv.push_back(id);
lbajardsilogic@0 171 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 172 std::cerr << "FeatureExtractionPluginFactory::getPluginIdentifiers: Found plugin id " << id.toStdString() << " at index " << index << std::endl;
lbajardsilogic@0 173 #endif
lbajardsilogic@0 174 ++index;
lbajardsilogic@0 175 }
lbajardsilogic@0 176 }
lbajardsilogic@0 177
lbajardsilogic@0 178 if (DLCLOSE(libraryHandle) != 0) {
lbajardsilogic@0 179 std::cerr << "WARNING: FeatureExtractionPluginFactory::getPluginIdentifiers: Failed to unload library " << soname.toStdString() << std::endl;
lbajardsilogic@0 180 }
lbajardsilogic@0 181 }
lbajardsilogic@0 182 }
lbajardsilogic@0 183
lbajardsilogic@0 184 generateTaxonomy();
lbajardsilogic@0 185
lbajardsilogic@0 186 return rv;
lbajardsilogic@0 187 }
lbajardsilogic@0 188
lbajardsilogic@0 189 QString
lbajardsilogic@0 190 FeatureExtractionPluginFactory::findPluginFile(QString soname, QString inDir)
lbajardsilogic@0 191 {
lbajardsilogic@0 192 QString file = "";
lbajardsilogic@0 193
lbajardsilogic@0 194 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 195 std::cerr << "FeatureExtractionPluginFactory::findPluginFile(\""
lbajardsilogic@0 196 << soname.toStdString() << "\", \"" << inDir.toStdString() << "\")"
lbajardsilogic@0 197 << std::endl;
lbajardsilogic@0 198 #endif
lbajardsilogic@0 199
lbajardsilogic@0 200 if (inDir != "") {
lbajardsilogic@0 201
lbajardsilogic@0 202 QDir dir(inDir, PLUGIN_GLOB,
lbajardsilogic@0 203 QDir::Name | QDir::IgnoreCase,
lbajardsilogic@0 204 QDir::Files | QDir::Readable);
lbajardsilogic@0 205 if (!dir.exists()) return "";
lbajardsilogic@0 206
lbajardsilogic@0 207 file = dir.filePath(QFileInfo(soname).fileName());
lbajardsilogic@0 208
lbajardsilogic@0 209 if (QFileInfo(file).exists() && QFileInfo(file).isFile()) {
lbajardsilogic@0 210
lbajardsilogic@0 211 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 212 std::cerr << "FeatureExtractionPluginFactory::findPluginFile: "
lbajardsilogic@0 213 << "found trivially at " << file.toStdString() << std::endl;
lbajardsilogic@0 214 #endif
lbajardsilogic@0 215
lbajardsilogic@0 216 return file;
lbajardsilogic@0 217 }
lbajardsilogic@0 218
lbajardsilogic@0 219 for (unsigned int j = 0; j < dir.count(); ++j) {
lbajardsilogic@0 220 file = dir.filePath(dir[j]);
lbajardsilogic@0 221 if (QFileInfo(file).baseName() == QFileInfo(soname).baseName()) {
lbajardsilogic@0 222
lbajardsilogic@0 223 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 224 std::cerr << "FeatureExtractionPluginFactory::findPluginFile: "
lbajardsilogic@0 225 << "found at " << file.toStdString() << std::endl;
lbajardsilogic@0 226 #endif
lbajardsilogic@0 227
lbajardsilogic@0 228 return file;
lbajardsilogic@0 229 }
lbajardsilogic@0 230 }
lbajardsilogic@0 231
lbajardsilogic@0 232 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 233 std::cerr << "FeatureExtractionPluginFactory::findPluginFile (with dir): "
lbajardsilogic@0 234 << "not found" << std::endl;
lbajardsilogic@0 235 #endif
lbajardsilogic@0 236
lbajardsilogic@0 237 return "";
lbajardsilogic@0 238
lbajardsilogic@0 239 } else {
lbajardsilogic@0 240
lbajardsilogic@0 241 QFileInfo fi(soname);
lbajardsilogic@0 242
lbajardsilogic@0 243 if (fi.isAbsolute() && fi.exists() && fi.isFile()) {
lbajardsilogic@0 244 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 245 std::cerr << "FeatureExtractionPluginFactory::findPluginFile: "
lbajardsilogic@0 246 << "found trivially at " << soname.toStdString() << std::endl;
lbajardsilogic@0 247 #endif
lbajardsilogic@0 248 return soname;
lbajardsilogic@0 249 }
lbajardsilogic@0 250
lbajardsilogic@0 251 if (fi.isAbsolute() && fi.absolutePath() != "") {
lbajardsilogic@0 252 file = findPluginFile(soname, fi.absolutePath());
lbajardsilogic@0 253 if (file != "") return file;
lbajardsilogic@0 254 }
lbajardsilogic@0 255
lbajardsilogic@0 256 std::vector<QString> path = getPluginPath();
lbajardsilogic@0 257 for (std::vector<QString>::iterator i = path.begin();
lbajardsilogic@0 258 i != path.end(); ++i) {
lbajardsilogic@0 259 if (*i != "") {
lbajardsilogic@0 260 file = findPluginFile(soname, *i);
lbajardsilogic@0 261 if (file != "") return file;
lbajardsilogic@0 262 }
lbajardsilogic@0 263 }
lbajardsilogic@0 264
lbajardsilogic@0 265 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 266 std::cerr << "FeatureExtractionPluginFactory::findPluginFile: "
lbajardsilogic@0 267 << "not found" << std::endl;
lbajardsilogic@0 268 #endif
lbajardsilogic@0 269
lbajardsilogic@0 270 return "";
lbajardsilogic@0 271 }
lbajardsilogic@0 272 }
lbajardsilogic@0 273
lbajardsilogic@0 274 Vamp::Plugin *
lbajardsilogic@0 275 FeatureExtractionPluginFactory::instantiatePlugin(QString identifier,
lbajardsilogic@0 276 float inputSampleRate)
lbajardsilogic@0 277 {
lbajardsilogic@0 278 Vamp::Plugin *rv = 0;
lbajardsilogic@0 279
lbajardsilogic@0 280 const VampPluginDescriptor *descriptor = 0;
lbajardsilogic@0 281 int index = 0;
lbajardsilogic@0 282
lbajardsilogic@0 283 QString type, soname, label;
lbajardsilogic@0 284 PluginIdentifier::parseIdentifier(identifier, type, soname, label);
lbajardsilogic@0 285 if (type != "vamp") {
lbajardsilogic@0 286 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Wrong factory for plugin type " << type.toStdString() << std::endl;
lbajardsilogic@0 287 return 0;
lbajardsilogic@0 288 }
lbajardsilogic@0 289
lbajardsilogic@0 290 QString found = findPluginFile(soname);
lbajardsilogic@0 291
lbajardsilogic@0 292 if (found == "") {
lbajardsilogic@0 293 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Failed to find library file " << soname.toStdString() << std::endl;
lbajardsilogic@0 294 return 0;
lbajardsilogic@0 295 } else if (found != soname) {
lbajardsilogic@0 296
lbajardsilogic@0 297 #ifdef DEBUG_PLUGIN_SCAN_AND_INSTANTIATE
lbajardsilogic@0 298 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Given library name was " << soname.toStdString() << ", found at " << found.toStdString() << std::endl;
lbajardsilogic@0 299 std::cerr << soname.toStdString() << " -> " << found.toStdString() << std::endl;
lbajardsilogic@0 300 #endif
lbajardsilogic@0 301
lbajardsilogic@0 302 }
lbajardsilogic@0 303
lbajardsilogic@0 304 soname = found;
lbajardsilogic@0 305
lbajardsilogic@0 306 void *libraryHandle = DLOPEN(soname, RTLD_LAZY);
lbajardsilogic@0 307
lbajardsilogic@0 308 if (!libraryHandle) {
lbajardsilogic@0 309 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Failed to load library " << soname.toStdString() << ": " << DLERROR() << std::endl;
lbajardsilogic@0 310 return 0;
lbajardsilogic@0 311 }
lbajardsilogic@0 312
lbajardsilogic@0 313 VampGetPluginDescriptorFunction fn = (VampGetPluginDescriptorFunction)
lbajardsilogic@0 314 DLSYM(libraryHandle, "vampGetPluginDescriptor");
lbajardsilogic@0 315
lbajardsilogic@0 316 if (!fn) {
lbajardsilogic@0 317 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: No descriptor function in " << soname.toStdString() << std::endl;
lbajardsilogic@0 318 goto done;
lbajardsilogic@0 319 }
lbajardsilogic@0 320
lbajardsilogic@0 321 while ((descriptor = fn(VAMP_API_VERSION, index))) {
lbajardsilogic@0 322 if (label == descriptor->identifier) break;
lbajardsilogic@0 323 ++index;
lbajardsilogic@0 324 }
lbajardsilogic@0 325
lbajardsilogic@0 326 if (!descriptor) {
lbajardsilogic@0 327 std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Failed to find plugin \"" << label.toStdString() << "\" in library " << soname.toStdString() << std::endl;
lbajardsilogic@0 328 goto done;
lbajardsilogic@0 329 }
lbajardsilogic@0 330
lbajardsilogic@0 331 rv = new Vamp::PluginHostAdapter(descriptor, inputSampleRate);
lbajardsilogic@0 332
lbajardsilogic@0 333 // std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Constructed Vamp plugin, rv is " << rv << std::endl;
lbajardsilogic@0 334
lbajardsilogic@0 335 //!!! need to dlclose() when plugins from a given library are unloaded
lbajardsilogic@0 336
lbajardsilogic@0 337 done:
lbajardsilogic@0 338 if (!rv) {
lbajardsilogic@0 339 if (DLCLOSE(libraryHandle) != 0) {
lbajardsilogic@0 340 std::cerr << "WARNING: FeatureExtractionPluginFactory::instantiatePlugin: Failed to unload library " << soname.toStdString() << std::endl;
lbajardsilogic@0 341 }
lbajardsilogic@0 342 }
lbajardsilogic@0 343
lbajardsilogic@0 344 // std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Instantiated plugin " << label.toStdString() << " from library " << soname.toStdString() << ": descriptor " << descriptor << ", rv "<< rv << ", label " << rv->getName() << ", outputs " << rv->getOutputDescriptors().size() << std::endl;
lbajardsilogic@0 345
lbajardsilogic@0 346 return rv;
lbajardsilogic@0 347 }
lbajardsilogic@0 348
lbajardsilogic@0 349 QString
lbajardsilogic@0 350 FeatureExtractionPluginFactory::getPluginCategory(QString identifier)
lbajardsilogic@0 351 {
lbajardsilogic@0 352 return m_taxonomy[identifier];
lbajardsilogic@0 353 }
lbajardsilogic@0 354
lbajardsilogic@0 355 void
lbajardsilogic@0 356 FeatureExtractionPluginFactory::generateTaxonomy()
lbajardsilogic@0 357 {
lbajardsilogic@0 358 std::vector<QString> pluginPath = getPluginPath();
lbajardsilogic@0 359 std::vector<QString> path;
lbajardsilogic@0 360
lbajardsilogic@0 361 for (size_t i = 0; i < pluginPath.size(); ++i) {
lbajardsilogic@0 362 if (pluginPath[i].contains("/lib/")) {
lbajardsilogic@0 363 QString p(pluginPath[i]);
lbajardsilogic@0 364 path.push_back(p);
lbajardsilogic@0 365 p.replace("/lib/", "/share/");
lbajardsilogic@0 366 path.push_back(p);
lbajardsilogic@0 367 }
lbajardsilogic@0 368 path.push_back(pluginPath[i]);
lbajardsilogic@0 369 }
lbajardsilogic@0 370
lbajardsilogic@0 371 for (size_t i = 0; i < path.size(); ++i) {
lbajardsilogic@0 372
lbajardsilogic@0 373 QDir dir(path[i], "*.cat");
lbajardsilogic@0 374
lbajardsilogic@0 375 // std::cerr << "LADSPAPluginFactory::generateFallbackCategories: directory " << path[i].toStdString() << " has " << dir.count() << " .cat files" << std::endl;
lbajardsilogic@0 376 for (unsigned int j = 0; j < dir.count(); ++j) {
lbajardsilogic@0 377
lbajardsilogic@0 378 QFile file(path[i] + "/" + dir[j]);
lbajardsilogic@0 379
lbajardsilogic@0 380 // std::cerr << "LADSPAPluginFactory::generateFallbackCategories: about to open " << (path[i].toStdString() + "/" + dir[j].toStdString()) << std::endl;
lbajardsilogic@0 381
lbajardsilogic@0 382 if (file.open(QIODevice::ReadOnly)) {
lbajardsilogic@0 383 // std::cerr << "...opened" << std::endl;
lbajardsilogic@0 384 QTextStream stream(&file);
lbajardsilogic@0 385 QString line;
lbajardsilogic@0 386
lbajardsilogic@0 387 while (!stream.atEnd()) {
lbajardsilogic@0 388 line = stream.readLine();
lbajardsilogic@0 389 // std::cerr << "line is: \"" << line.toStdString() << "\"" << std::endl;
lbajardsilogic@0 390 QString id = PluginIdentifier::canonicalise
lbajardsilogic@0 391 (line.section("::", 0, 0));
lbajardsilogic@0 392 QString cat = line.section("::", 1, 1);
lbajardsilogic@0 393 m_taxonomy[id] = cat;
lbajardsilogic@0 394 // std::cerr << "FeatureExtractionPluginFactory: set id \"" << id.toStdString() << "\" to cat \"" << cat.toStdString() << "\"" << std::endl;
lbajardsilogic@0 395 }
lbajardsilogic@0 396 }
lbajardsilogic@0 397 }
lbajardsilogic@0 398 }
lbajardsilogic@0 399 }