comparison plugin/transform/TransformerFactory.cpp @ 329:3179d8b29336

* Another incremental Transform update
author Chris Cannam
date Tue, 06 Nov 2007 17:08:11 +0000
parents 21bd032ae791
children
comparison
equal deleted inserted replaced
328:21bd032ae791 329:3179d8b29336
46 46
47 TransformerFactory::~TransformerFactory() 47 TransformerFactory::~TransformerFactory()
48 { 48 {
49 } 49 }
50 50
51 TransformerFactory::TransformerList 51 TransformList
52 TransformerFactory::getAllTransformers() 52 TransformerFactory::getAllTransforms()
53 { 53 {
54 if (m_transforms.empty()) populateTransformers(); 54 if (m_transforms.empty()) populateTransforms();
55 55
56 std::set<TransformerDesc> dset; 56 std::set<TransformDescription> dset;
57 for (TransformerDescriptionMap::const_iterator i = m_transforms.begin(); 57 for (TransformDescriptionMap::const_iterator i = m_transforms.begin();
58 i != m_transforms.end(); ++i) { 58 i != m_transforms.end(); ++i) {
59 dset.insert(i->second); 59 dset.insert(i->second);
60 } 60 }
61 61
62 TransformerList list; 62 TransformList list;
63 for (std::set<TransformerDesc>::const_iterator i = dset.begin(); 63 for (std::set<TransformDescription>::const_iterator i = dset.begin();
64 i != dset.end(); ++i) { 64 i != dset.end(); ++i) {
65 list.push_back(*i); 65 list.push_back(*i);
66 } 66 }
67 67
68 return list; 68 return list;
69 } 69 }
70 70
71 std::vector<QString> 71 std::vector<QString>
72 TransformerFactory::getAllTransformerTypes() 72 TransformerFactory::getAllTransformerTypes()
73 { 73 {
74 if (m_transforms.empty()) populateTransformers(); 74 if (m_transforms.empty()) populateTransforms();
75 75
76 std::set<QString> types; 76 std::set<QString> types;
77 for (TransformerDescriptionMap::const_iterator i = m_transforms.begin(); 77 for (TransformDescriptionMap::const_iterator i = m_transforms.begin();
78 i != m_transforms.end(); ++i) { 78 i != m_transforms.end(); ++i) {
79 types.insert(i->second.type); 79 types.insert(i->second.type);
80 } 80 }
81 81
82 std::vector<QString> rv; 82 std::vector<QString> rv;
88 } 88 }
89 89
90 std::vector<QString> 90 std::vector<QString>
91 TransformerFactory::getTransformerCategories(QString transformType) 91 TransformerFactory::getTransformerCategories(QString transformType)
92 { 92 {
93 if (m_transforms.empty()) populateTransformers(); 93 if (m_transforms.empty()) populateTransforms();
94 94
95 std::set<QString> categories; 95 std::set<QString> categories;
96 for (TransformerDescriptionMap::const_iterator i = m_transforms.begin(); 96 for (TransformDescriptionMap::const_iterator i = m_transforms.begin();
97 i != m_transforms.end(); ++i) { 97 i != m_transforms.end(); ++i) {
98 if (i->second.type == transformType) { 98 if (i->second.type == transformType) {
99 categories.insert(i->second.category); 99 categories.insert(i->second.category);
100 } 100 }
101 } 101 }
115 } 115 }
116 116
117 std::vector<QString> 117 std::vector<QString>
118 TransformerFactory::getTransformerMakers(QString transformType) 118 TransformerFactory::getTransformerMakers(QString transformType)
119 { 119 {
120 if (m_transforms.empty()) populateTransformers(); 120 if (m_transforms.empty()) populateTransforms();
121 121
122 std::set<QString> makers; 122 std::set<QString> makers;
123 for (TransformerDescriptionMap::const_iterator i = m_transforms.begin(); 123 for (TransformDescriptionMap::const_iterator i = m_transforms.begin();
124 i != m_transforms.end(); ++i) { 124 i != m_transforms.end(); ++i) {
125 if (i->second.type == transformType) { 125 if (i->second.type == transformType) {
126 makers.insert(i->second.maker); 126 makers.insert(i->second.maker);
127 } 127 }
128 } 128 }
140 140
141 return rv; 141 return rv;
142 } 142 }
143 143
144 void 144 void
145 TransformerFactory::populateTransformers() 145 TransformerFactory::populateTransforms()
146 { 146 {
147 TransformerDescriptionMap transforms; 147 TransformDescriptionMap transforms;
148 148
149 populateFeatureExtractionPlugins(transforms); 149 populateFeatureExtractionPlugins(transforms);
150 populateRealTimePlugins(transforms); 150 populateRealTimePlugins(transforms);
151 151
152 // disambiguate plugins with similar names 152 // disambiguate plugins with similar names
153 153
154 std::map<QString, int> names; 154 std::map<QString, int> names;
155 std::map<QString, QString> pluginSources; 155 std::map<QString, QString> pluginSources;
156 std::map<QString, QString> pluginMakers; 156 std::map<QString, QString> pluginMakers;
157 157
158 for (TransformerDescriptionMap::iterator i = transforms.begin(); 158 for (TransformDescriptionMap::iterator i = transforms.begin();
159 i != transforms.end(); ++i) { 159 i != transforms.end(); ++i) {
160 160
161 TransformerDesc desc = i->second; 161 TransformDescription desc = i->second;
162 162
163 QString td = desc.name; 163 QString td = desc.name;
164 QString tn = td.section(": ", 0, 0); 164 QString tn = td.section(": ", 0, 0);
165 QString pn = desc.identifier.section(":", 1, 1); 165 QString pn = desc.identifier.section(":", 1, 1);
166 166
176 } 176 }
177 177
178 std::map<QString, int> counts; 178 std::map<QString, int> counts;
179 m_transforms.clear(); 179 m_transforms.clear();
180 180
181 for (TransformerDescriptionMap::iterator i = transforms.begin(); 181 for (TransformDescriptionMap::iterator i = transforms.begin();
182 i != transforms.end(); ++i) { 182 i != transforms.end(); ++i) {
183 183
184 TransformerDesc desc = i->second; 184 TransformDescription desc = i->second;
185 QString identifier = desc.identifier; 185 QString identifier = desc.identifier;
186 QString maker = desc.maker; 186 QString maker = desc.maker;
187 187
188 QString td = desc.name; 188 QString td = desc.name;
189 QString tn = td.section(": ", 0, 0); 189 QString tn = td.section(": ", 0, 0);
203 m_transforms[identifier] = desc; 203 m_transforms[identifier] = desc;
204 } 204 }
205 } 205 }
206 206
207 void 207 void
208 TransformerFactory::populateFeatureExtractionPlugins(TransformerDescriptionMap &transforms) 208 TransformerFactory::populateFeatureExtractionPlugins(TransformDescriptionMap &transforms)
209 { 209 {
210 std::vector<QString> plugs = 210 std::vector<QString> plugs =
211 FeatureExtractionPluginFactory::getAllPluginIdentifiers(); 211 FeatureExtractionPluginFactory::getAllPluginIdentifiers();
212 212
213 for (size_t i = 0; i < plugs.size(); ++i) { 213 for (size_t i = 0; i < plugs.size(); ++i) {
216 216
217 FeatureExtractionPluginFactory *factory = 217 FeatureExtractionPluginFactory *factory =
218 FeatureExtractionPluginFactory::instanceFor(pluginId); 218 FeatureExtractionPluginFactory::instanceFor(pluginId);
219 219
220 if (!factory) { 220 if (!factory) {
221 std::cerr << "WARNING: TransformerFactory::populateTransformers: No feature extraction plugin factory for instance " << pluginId.toLocal8Bit().data() << std::endl; 221 std::cerr << "WARNING: TransformerFactory::populateTransforms: No feature extraction plugin factory for instance " << pluginId.toLocal8Bit().data() << std::endl;
222 continue; 222 continue;
223 } 223 }
224 224
225 Vamp::Plugin *plugin = 225 Vamp::Plugin *plugin =
226 factory->instantiatePlugin(pluginId, 48000); 226 factory->instantiatePlugin(pluginId, 48000);
227 227
228 if (!plugin) { 228 if (!plugin) {
229 std::cerr << "WARNING: TransformerFactory::populateTransformers: Failed to instantiate plugin " << pluginId.toLocal8Bit().data() << std::endl; 229 std::cerr << "WARNING: TransformerFactory::populateTransforms: Failed to instantiate plugin " << pluginId.toLocal8Bit().data() << std::endl;
230 continue; 230 continue;
231 } 231 }
232 232
233 QString pluginName = plugin->getName().c_str(); 233 QString pluginName = plugin->getName().c_str();
234 QString category = factory->getPluginCategory(pluginId); 234 QString category = factory->getPluginCategory(pluginId);
280 !plugin->getParameterDescriptors().empty()); 280 !plugin->getParameterDescriptors().empty());
281 281
282 // std::cerr << "Feature extraction plugin transform: " << transformId.toStdString() << std::endl; 282 // std::cerr << "Feature extraction plugin transform: " << transformId.toStdString() << std::endl;
283 283
284 transforms[transformId] = 284 transforms[transformId] =
285 TransformerDesc(tr("Analysis"), 285 TransformDescription(tr("Analysis"),
286 category, 286 category,
287 transformId, 287 transformId,
288 userName, 288 userName,
289 friendlyName, 289 friendlyName,
290 description, 290 description,
296 delete plugin; 296 delete plugin;
297 } 297 }
298 } 298 }
299 299
300 void 300 void
301 TransformerFactory::populateRealTimePlugins(TransformerDescriptionMap &transforms) 301 TransformerFactory::populateRealTimePlugins(TransformDescriptionMap &transforms)
302 { 302 {
303 std::vector<QString> plugs = 303 std::vector<QString> plugs =
304 RealTimePluginFactory::getAllPluginIdentifiers(); 304 RealTimePluginFactory::getAllPluginIdentifiers();
305 305
306 static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$"); 306 static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$");
311 311
312 RealTimePluginFactory *factory = 312 RealTimePluginFactory *factory =
313 RealTimePluginFactory::instanceFor(pluginId); 313 RealTimePluginFactory::instanceFor(pluginId);
314 314
315 if (!factory) { 315 if (!factory) {
316 std::cerr << "WARNING: TransformerFactory::populateTransformers: No real time plugin factory for instance " << pluginId.toLocal8Bit().data() << std::endl; 316 std::cerr << "WARNING: TransformerFactory::populateTransforms: No real time plugin factory for instance " << pluginId.toLocal8Bit().data() << std::endl;
317 continue; 317 continue;
318 } 318 }
319 319
320 const RealTimePluginDescriptor *descriptor = 320 const RealTimePluginDescriptor *descriptor =
321 factory->getPluginDescriptor(pluginId); 321 factory->getPluginDescriptor(pluginId);
322 322
323 if (!descriptor) { 323 if (!descriptor) {
324 std::cerr << "WARNING: TransformerFactory::populateTransformers: Failed to query plugin " << pluginId.toLocal8Bit().data() << std::endl; 324 std::cerr << "WARNING: TransformerFactory::populateTransforms: Failed to query plugin " << pluginId.toLocal8Bit().data() << std::endl;
325 continue; 325 continue;
326 } 326 }
327 327
328 //!!! if (descriptor->controlOutputPortCount == 0 || 328 //!!! if (descriptor->controlOutputPortCount == 0 ||
329 // descriptor->audioInputPortCount == 0) continue; 329 // descriptor->audioInputPortCount == 0) continue;
382 .arg(pluginName) 382 .arg(pluginName)
383 .arg(maker); 383 .arg(maker);
384 } 384 }
385 385
386 transforms[transformId] = 386 transforms[transformId] =
387 TransformerDesc(tr("Effects Data"), 387 TransformDescription(tr("Effects Data"),
388 category, 388 category,
389 transformId, 389 transformId,
390 userName, 390 userName,
391 userName, 391 userName,
392 description, 392 description,
413 .arg(pluginName) 413 .arg(pluginName)
414 .arg(maker); 414 .arg(maker);
415 } 415 }
416 416
417 transforms[transformId] = 417 transforms[transformId] =
418 TransformerDesc(type, 418 TransformDescription(type,
419 category, 419 category,
420 transformId, 420 transformId,
421 pluginName, 421 pluginName,
422 pluginName, 422 pluginName,
423 description, 423 description,
428 } 428 }
429 } 429 }
430 } 430 }
431 431
432 bool 432 bool
433 TransformerFactory::haveTransformer(TransformerId identifier) 433 TransformerFactory::haveTransformer(TransformId identifier)
434 { 434 {
435 return (m_transforms.find(identifier) != m_transforms.end()); 435 return (m_transforms.find(identifier) != m_transforms.end());
436 } 436 }
437 437
438 QString 438 QString
439 TransformerFactory::getTransformerName(TransformerId identifier) 439 TransformerFactory::getTransformerName(TransformId identifier)
440 { 440 {
441 if (m_transforms.find(identifier) != m_transforms.end()) { 441 if (m_transforms.find(identifier) != m_transforms.end()) {
442 return m_transforms[identifier].name; 442 return m_transforms[identifier].name;
443 } else return ""; 443 } else return "";
444 } 444 }
445 445
446 QString 446 QString
447 TransformerFactory::getTransformerFriendlyName(TransformerId identifier) 447 TransformerFactory::getTransformerFriendlyName(TransformId identifier)
448 { 448 {
449 if (m_transforms.find(identifier) != m_transforms.end()) { 449 if (m_transforms.find(identifier) != m_transforms.end()) {
450 return m_transforms[identifier].friendlyName; 450 return m_transforms[identifier].friendlyName;
451 } else return ""; 451 } else return "";
452 } 452 }
453 453
454 QString 454 QString
455 TransformerFactory::getTransformerUnits(TransformerId identifier) 455 TransformerFactory::getTransformerUnits(TransformId identifier)
456 { 456 {
457 if (m_transforms.find(identifier) != m_transforms.end()) { 457 if (m_transforms.find(identifier) != m_transforms.end()) {
458 return m_transforms[identifier].units; 458 return m_transforms[identifier].units;
459 } else return ""; 459 } else return "";
460 } 460 }
461 461
462 bool 462 bool
463 TransformerFactory::isTransformerConfigurable(TransformerId identifier) 463 TransformerFactory::isTransformerConfigurable(TransformId identifier)
464 { 464 {
465 if (m_transforms.find(identifier) != m_transforms.end()) { 465 if (m_transforms.find(identifier) != m_transforms.end()) {
466 return m_transforms[identifier].configurable; 466 return m_transforms[identifier].configurable;
467 } else return false; 467 } else return false;
468 } 468 }
469 469
470 bool 470 bool
471 TransformerFactory::getTransformerChannelRange(TransformerId identifier, 471 TransformerFactory::getTransformerChannelRange(TransformId identifier,
472 int &min, int &max) 472 int &min, int &max)
473 { 473 {
474 QString id = identifier.section(':', 0, 2); 474 QString id = identifier.section(':', 0, 2);
475 475
476 if (FeatureExtractionPluginFactory::instanceFor(id)) { 476 if (FeatureExtractionPluginFactory::instanceFor(id)) {
501 501
502 return false; 502 return false;
503 } 503 }
504 504
505 bool 505 bool
506 TransformerFactory::getChannelRange(TransformerId identifier, Vamp::PluginBase *plugin, 506 TransformerFactory::getChannelRange(TransformId identifier, Vamp::PluginBase *plugin,
507 int &minChannels, int &maxChannels) 507 int &minChannels, int &maxChannels)
508 { 508 {
509 Vamp::Plugin *vp = 0; 509 Vamp::Plugin *vp = 0;
510 if ((vp = dynamic_cast<Vamp::Plugin *>(plugin)) || 510 if ((vp = dynamic_cast<Vamp::Plugin *>(plugin)) ||
511 (vp = dynamic_cast<Vamp::PluginHostAdapter *>(plugin))) { 511 (vp = dynamic_cast<Vamp::PluginHostAdapter *>(plugin))) {
516 return getTransformerChannelRange(identifier, minChannels, maxChannels); 516 return getTransformerChannelRange(identifier, minChannels, maxChannels);
517 } 517 }
518 } 518 }
519 519
520 Model * 520 Model *
521 TransformerFactory::getConfigurationForTransformer(TransformerId identifier, 521 TransformerFactory::getConfigurationForTransformer(TransformId identifier,
522 const std::vector<Model *> &candidateInputModels, 522 const std::vector<Model *> &candidateInputModels,
523 PluginTransformer::ExecutionContext &context, 523 PluginTransformer::ExecutionContext &context,
524 QString &configurationXml, 524 QString &configurationXml,
525 AudioCallbackPlaySource *source, 525 AudioCallbackPlaySource *source,
526 size_t startFrame, 526 size_t startFrame,
717 717
718 return ok ? inputModel : 0; 718 return ok ? inputModel : 0;
719 } 719 }
720 720
721 PluginTransformer::ExecutionContext 721 PluginTransformer::ExecutionContext
722 TransformerFactory::getDefaultContextForTransformer(TransformerId identifier, 722 TransformerFactory::getDefaultContextForTransformer(TransformId identifier,
723 Model *inputModel) 723 Model *inputModel)
724 { 724 {
725 PluginTransformer::ExecutionContext context(-1); 725 PluginTransformer::ExecutionContext context(-1);
726 726
727 QString id = identifier.section(':', 0, 2); 727 QString id = identifier.section(':', 0, 2);
740 740
741 return context; 741 return context;
742 } 742 }
743 743
744 Transformer * 744 Transformer *
745 TransformerFactory::createTransformer(TransformerId identifier, Model *inputModel, 745 TransformerFactory::createTransformer(TransformId identifier, Model *inputModel,
746 const PluginTransformer::ExecutionContext &context, 746 const PluginTransformer::ExecutionContext &context,
747 QString configurationXml) 747 QString configurationXml)
748 { 748 {
749 Transformer *transform = 0; 749 Transformer *transform = 0;
750 750
774 if (transform) transform->setObjectName(identifier); 774 if (transform) transform->setObjectName(identifier);
775 return transform; 775 return transform;
776 } 776 }
777 777
778 Model * 778 Model *
779 TransformerFactory::transform(TransformerId identifier, Model *inputModel, 779 TransformerFactory::transform(TransformId identifier, Model *inputModel,
780 const PluginTransformer::ExecutionContext &context, 780 const PluginTransformer::ExecutionContext &context,
781 QString configurationXml) 781 QString configurationXml)
782 { 782 {
783 Transformer *t = createTransformer(identifier, inputModel, context, 783 Transformer *t = createTransformer(identifier, inputModel, context,
784 configurationXml); 784 configurationXml);