23 #include <vamp-hostsdk/Plugin.h> 24 #include <vamp-hostsdk/PluginHostAdapter.h> 25 #include <vamp-hostsdk/PluginWrapper.h> 36 #include <QTextStream> 54 SVDEBUG <<
"TransformFactory::deleteInstance called" << endl;
60 m_transformsPopulated(false),
61 m_uninstalledTransformsPopulated(false),
64 m_populatingSlowly(false)
72 #ifdef DEBUG_TRANSFORM_FACTORY 73 SVDEBUG <<
"TransformFactory::~TransformFactory: waiting on thread" << endl;
77 #ifdef DEBUG_TRANSFORM_FACTORY 78 SVDEBUG <<
"TransformFactory::~TransformFactory: waited and done" << endl;
112 std::set<TransformDescription> dset;
113 for (TransformDescriptionMap::const_iterator i =
m_transforms.begin();
115 #ifdef DEBUG_TRANSFORM_FACTORY 116 cerr <<
"inserting transform into set: id = " << i->second.identifier << endl;
118 dset.insert(i->second);
122 for (std::set<TransformDescription>::const_iterator i = dset.begin();
123 i != dset.end(); ++i) {
124 #ifdef DEBUG_TRANSFORM_FACTORY 125 cerr <<
"inserting transform into list: id = " << i->identifier << endl;
158 std::set<TransformDescription> dset;
161 #ifdef DEBUG_TRANSFORM_FACTORY 162 cerr <<
"inserting transform into set: id = " << i->second.identifier << endl;
164 dset.insert(i->second);
168 for (std::set<TransformDescription>::const_iterator i = dset.begin();
169 i != dset.end(); ++i) {
170 #ifdef DEBUG_TRANSFORM_FACTORY 171 cerr <<
"inserting transform into uninstalled list: id = " << i->identifier << endl;
195 if (waitForCheckToComplete) {
243 std::vector<TransformDescription::Type>
248 std::set<TransformDescription::Type> types;
249 for (TransformDescriptionMap::const_iterator i =
m_transforms.begin();
251 types.insert(i->second.type);
254 std::vector<TransformDescription::Type> rv;
255 for (std::set<TransformDescription::Type>::iterator i = types.begin(); i != types.end(); ++i) {
267 std::set<QString> categories;
268 for (TransformDescriptionMap::const_iterator i =
m_transforms.begin();
270 if (i->second.type == transformType) {
271 categories.insert(i->second.category);
275 bool haveEmpty =
false;
277 std::vector<QString> rv;
278 for (std::set<QString>::iterator i = categories.begin();
279 i != categories.end(); ++i) {
280 if (*i !=
"") rv.push_back(*i);
281 else haveEmpty =
true;
284 if (haveEmpty) rv.push_back(
"");
294 std::set<QString> makers;
295 for (TransformDescriptionMap::const_iterator i =
m_transforms.begin();
297 if (i->second.type == transformType) {
298 makers.insert(i->second.maker);
302 bool haveEmpty =
false;
304 std::vector<QString> rv;
305 for (std::set<QString>::iterator i = makers.begin();
306 i != makers.end(); ++i) {
307 if (*i !=
"") rv.push_back(*i);
308 else haveEmpty =
true;
311 if (haveEmpty) rv.push_back(
"");
333 "TransformFactory::populateTransforms");
347 std::map<QString, int> names;
348 std::map<QString, QString> pluginSources;
349 std::map<QString, QString> pluginMakers;
351 for (TransformDescriptionMap::iterator i = transforms.begin();
352 i != transforms.end(); ++i) {
356 QString td = desc.
name;
357 QString tn = td.section(
": ", 0, 0);
358 QString pn = desc.
identifier.section(
":", 1, 1);
360 if (pluginSources.find(tn) != pluginSources.end()) {
361 if (pluginSources[tn] != pn && pluginMakers[tn] != desc.
maker) {
366 pluginSources[tn] = pn;
367 pluginMakers[tn] = desc.
maker;
371 std::map<QString, int> counts;
374 for (TransformDescriptionMap::iterator i = transforms.begin();
375 i != transforms.end(); ++i) {
379 QString maker = desc.
maker;
381 QString td = desc.
name;
382 QString tn = td.section(
": ", 0, 0);
383 QString to = td.section(
": ", 1);
386 maker.replace(QRegExp(tr(
" [\\(<].*$")),
"");
387 tn = QString(
"%1 [%2]").arg(tn).arg(maker);
391 desc.
name = QString(
"%1: %2").arg(tn).arg(to);
405 std::vector<QString> plugs =
409 for (
int i = 0; i < (int)plugs.size(); ++i) {
411 QString pluginId = plugs[i];
417 cerr <<
"WARNING: TransformFactory::populateTransforms: No feature extraction plugin factory for instance " << pluginId << endl;
421 Vamp::Plugin *plugin =
425 cerr <<
"WARNING: TransformFactory::populateTransforms: Failed to instantiate plugin " << pluginId << endl;
429 QString pluginName = plugin->getName().c_str();
432 Vamp::Plugin::OutputList outputs =
433 plugin->getOutputDescriptors();
435 for (
int j = 0; j < (int)outputs.size(); ++j) {
437 QString transformId = QString(
"%1:%2")
438 .arg(pluginId).arg(outputs[j].identifier.c_str());
441 QString friendlyName;
442 QString units = outputs[j].unit.c_str();
443 QString description = plugin->getDescription().c_str();
444 QString maker = plugin->getMaker().c_str();
445 if (maker ==
"") maker = tr(
"<unknown maker>");
447 QString longDescription = description;
449 if (longDescription ==
"") {
450 if (outputs.size() == 1) {
451 longDescription = tr(
"Extract features using \"%1\" plugin (from %2)")
452 .arg(pluginName).arg(maker);
454 longDescription = tr(
"Extract features using \"%1\" output of \"%2\" plugin (from %3)")
455 .arg(outputs[j].name.c_str()).arg(pluginName).arg(maker);
458 if (outputs.size() == 1) {
459 longDescription = tr(
"%1 using \"%2\" plugin (from %3)")
460 .arg(longDescription).arg(pluginName).arg(maker);
462 longDescription = tr(
"%1 using \"%2\" output of \"%3\" plugin (from %4)")
463 .arg(longDescription).arg(outputs[j].name.c_str()).arg(pluginName).arg(maker);
467 if (outputs.size() == 1) {
468 userName = pluginName;
469 friendlyName = pluginName;
471 userName = QString(
"%1: %2")
473 .arg(outputs[j].name.c_str());
474 friendlyName = outputs[j].name.c_str();
477 bool configurable = (!plugin->getPrograms().empty() ||
478 !plugin->getParameterDescriptors().empty());
480 #ifdef DEBUG_TRANSFORM_FACTORY 481 cerr <<
"Feature extraction plugin transform: " << transformId <<
" friendly name: " << friendlyName << endl;
484 transforms[transformId] =
504 std::vector<QString> plugs =
508 static QRegExp unitRE(
"[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$");
510 for (
int i = 0; i < (int)plugs.size(); ++i) {
512 QString pluginId = plugs[i];
518 cerr <<
"WARNING: TransformFactory::populateTransforms: No real time plugin factory for instance " << pluginId << endl;
526 cerr <<
"WARNING: TransformFactory::populateTransforms: Failed to query plugin " << pluginId << endl;
535 QString pluginName = descriptor->
name.c_str();
538 QString maker = descriptor->
maker.c_str();
539 if (maker ==
"") maker = tr(
"<unknown maker>");
545 QString transformId = QString(
"%1:%2").arg(pluginId).arg(j);
555 userName = tr(
"%1: %2")
559 if (unitRE.indexIn(portName) >= 0) {
560 units = unitRE.cap(1);
565 userName = tr(
"%1: Output %2")
571 userName = pluginName;
576 if (portName !=
"") {
577 description = tr(
"Extract \"%1\" data output from \"%2\" effect plugin (from %3)")
582 description = tr(
"Extract data output %1 from \"%2\" effect plugin (from %3)")
588 transforms[transformId] =
606 QString transformId = QString(
"%1:A").arg(pluginId);
609 QString description = tr(
"Transform audio signal with \"%1\" effect plugin (from %2)")
615 QString description = tr(
"Generate audio signal using \"%1\" plugin (from %2)")
620 transforms[transformId] =
645 "TransformFactory::populateUninstalledTransforms");
655 for (QStringList::const_iterator i = ids.begin(); i != ids.end(); ++i) {
660 #ifdef DEBUG_TRANSFORM_FACTORY 662 cerr <<
"TransformFactory::populateUninstalledTransforms: " 663 <<
"No name available for plugin " << *i
664 <<
", skipping" << endl;
675 for (QStringList::const_iterator j = oids.begin(); j != oids.end(); ++j) {
680 #ifdef DEBUG_TRANSFORM_FACTORY 681 cerr <<
"TransformFactory::populateUninstalledTransforms: " 682 << tid <<
" is installed; adding info url if appropriate, skipping rest" << endl;
692 #ifdef DEBUG_TRANSFORM_FACTORY 693 cerr <<
"TransformFactory::populateUninstalledTransforms: " 694 <<
"adding " << tid << endl;
698 if (oname ==
"") oname = *j;
705 if (oids.size() == 1) {
707 }
else if (name !=
"") {
708 td.
name = tr(
"%1: %2").arg(name).arg(oname);
711 QString longDescription = description;
713 if (longDescription ==
"") {
714 if (oids.size() == 1) {
715 longDescription = tr(
"Extract features using \"%1\" plugin (from %2)")
716 .arg(name).arg(maker);
718 longDescription = tr(
"Extract features using \"%1\" output of \"%2\" plugin (from %3)")
719 .arg(oname).arg(name).arg(maker);
722 if (oids.size() == 1) {
723 longDescription = tr(
"%1 using \"%2\" plugin (from %3)")
724 .arg(longDescription).arg(name).arg(maker);
726 longDescription = tr(
"%1 using \"%2\" output of \"%3\" plugin (from %4)")
727 .arg(longDescription).arg(oname).arg(name).arg(maker);
747 #ifdef DEBUG_TRANSFORM_FACTORY 748 cerr <<
"populateUninstalledTransforms exiting" << endl;
789 if (rate == 0) rate = 44100;
792 Vamp::PluginBase *plugin = 0;
819 Vamp::Plugin *vp = dynamic_cast<Vamp::Plugin *>(plugin);
822 vp = dynamic_cast<Vamp::PluginHostAdapter *>(plugin);
826 vp = dynamic_cast<Vamp::HostExt::PluginWrapper *>(plugin);
873 Vamp::Plugin::InputDomain
880 return Vamp::Plugin::TimeDomain;
883 Vamp::Plugin *plugin =
887 Vamp::Plugin::InputDomain d = plugin->getInputDomain();
892 return Vamp::Plugin::TimeDomain;
907 QString
id = identifier.section(
':', 0, 2);
911 Vamp::Plugin *plugin =
913 instantiatePlugin(
id, 44100);
914 if (!plugin)
return false;
916 min = plugin->getMinChannelCount();
917 max = plugin->getMaxChannelCount();
928 getPluginDescriptor(
id);
929 if (!descriptor)
return false;
942 Vamp::PluginBase *plugin)
950 Vamp::PluginBase::ParameterList parameters =
951 plugin->getParameterDescriptors();
953 for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin();
954 i != parameters.end(); ++i) {
955 pmap[i->identifier.c_str()] = plugin->getParameter(i->identifier);
963 if (plugin->getPrograms().empty()) {
966 transform.
setProgram(plugin->getCurrentProgram().c_str());
970 dynamic_cast<RealTimePluginInstance *>(plugin);
979 for (RealTimePluginInstance::ConfigurationPairMap::const_iterator i
980 = configurePairs.begin(); i != configurePairs.end(); ++i) {
981 cmap[i->first.c_str()] = i->second.c_str();
990 Vamp::PluginBase *plugin)
997 dynamic_cast<RealTimePluginInstance *>(plugin);
1001 for (Transform::ConfigurationMap::const_iterator i = cmap.begin();
1002 i != cmap.end(); ++i) {
1003 rtpi->
configure(i->first.toStdString(), i->second.toStdString());
1008 plugin->selectProgram(transform.
getProgram().toStdString());
1013 Vamp::PluginBase::ParameterList parameters =
1014 plugin->getParameterDescriptors();
1016 for (Vamp::PluginBase::ParameterList::const_iterator i = parameters.begin();
1017 i != parameters.end(); ++i) {
1018 QString key = i->identifier.c_str();
1019 Transform::ParameterMap::const_iterator pmi = pmap.find(key);
1020 if (pmi != pmap.end()) {
1021 plugin->setParameter(i->identifier, pmi->second);
1028 Vamp::PluginBase *plugin)
1041 Vamp::Plugin::InputDomain domain = vp->getInputDomain();
1043 transform.
setStepSize(vp->getPreferredStepSize());
1052 if (domain == Vamp::Plugin::FrequencyDomain) {
1071 cerr <<
"TransformFactory::getPluginConfigurationXml: " 1072 <<
"Unable to instantiate plugin for transform \"" 1079 QTextStream out(&xml);
1093 cerr <<
"TransformFactory::setParametersFromPluginConfigurationXml: " 1094 <<
"Unable to instantiate plugin for transform \"" 1107 QStringList keywords;
1108 keywords << keyword;
1117 if (keywords.size() > 1) {
1119 keywords.push_back(keywords.join(
" "));
1125 for (TransformDescriptionMap::const_iterator i =
m_transforms.begin();
1130 match.
key = i->first;
1132 matcher.
test(match, keywords,
1134 tr(
"Plugin type"), 5);
1136 matcher.
test(match, keywords, i->second.category, tr(
"Category"), 20);
1137 matcher.
test(match, keywords, i->second.identifier, tr(
"System Identifier"), 6);
1138 matcher.
test(match, keywords, i->second.name, tr(
"Name"), 30);
1139 matcher.
test(match, keywords, i->second.description, tr(
"Description"), 20);
1140 matcher.
test(match, keywords, i->second.maker, tr(
"Maker"), 10);
1141 matcher.
test(match, keywords, i->second.units, tr(
"Units"), 10);
1143 if (match.
score > 0) results[i->first] = match;
1149 cerr <<
"TransformFactory::search: Uninstalled transforms mutex is held, skipping" << endl;
1155 cerr <<
"WARNING: TransformFactory::search: Uninstalled transforms are not populated yet" << endl
1156 <<
"and are not being populated either -- was the thread not started correctly?" << endl;
1168 match.
key = i->first;
1170 matcher.
test(match, keywords,
1172 tr(
"Plugin type"), 2);
1174 matcher.
test(match, keywords, i->second.category, tr(
"Category"), 10);
1175 matcher.
test(match, keywords, i->second.identifier, tr(
"System Identifier"), 3);
1176 matcher.
test(match, keywords, i->second.name, tr(
"Name"), 15);
1177 matcher.
test(match, keywords, i->second.description, tr(
"Description"), 10);
1178 matcher.
test(match, keywords, i->second.maker, tr(
"Maker"), 5);
1179 matcher.
test(match, keywords, i->second.units, tr(
"Units"), 5);
1181 if (match.
score > 0) results[i->first] = match;
virtual std::string configure(std::string, std::string)
std::vector< std::string > controlOutputPortNames
virtual void setParametersFromXml(QString xml)
Set the parameters and program of a plugin from an XML plugin element as returned by toXml.
QString getPluginDescription() const
QString getPluginInfoURL() const
QString getPluginName() const
static RealTimePluginFactory * instanceFor(QString identifier)
std::map< std::string, std::string > ConfigurationPairMap
unsigned int audioInputPortCount
unsigned int parameterCount
void test(Match &match, QStringList keywords, QString text, QString textType, int score)
static std::vector< QString > getAllPluginIdentifiers()
unsigned int controlOutputPortCount
virtual QString getPluginCategory(QString identifier)=0
Get category metadata about a plugin (without instantiating it).
QStringList getOutputIds() const
A rather eccentric interface for matching texts in differently-scored fields.
QStringList getIndexedPluginIds()
virtual RealTimePluginInstance * instantiatePlugin(QString identifier, int clientId, int position, unsigned int sampleRate, unsigned int blockSize, unsigned int channels)=0
Instantiate a plugin.
QString getOutputName(QString outputId) const
virtual ConfigurationPairMap getConfigurePairs()
virtual void toXml(QTextStream &stream, QString indent="", QString extraAttributes="") const
Export plugin settings to XML.
bool indexConfiguredURLs()
Index all URLs obtained from index files defined in the current settings.
QString getPluginMaker() const
static PluginRDFIndexer * getInstance()
virtual const RealTimePluginDescriptor * getPluginDescriptor(QString identifier) const =0
Get some basic information about a plugin (rapidly).
unsigned int audioOutputPortCount