Mercurial > hg > svcore
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); |