diff options
author | Robin Gareus <robin@gareus.org> | 2019-10-15 14:04:26 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2019-10-15 14:04:26 +0200 |
commit | 0b377fc393c6d383fd08aa51963dd8115e2db2ee (patch) | |
tree | 05f439026d3f1b42d90e970b538062f0dfc403d6 /libs/ardour/plugin_manager.cc | |
parent | 7e5120e7c9f0f30f72f56b168aeb33b389e17a47 (diff) |
Detect plugin-name ambiguities
Diffstat (limited to 'libs/ardour/plugin_manager.cc')
-rw-r--r-- | libs/ardour/plugin_manager.cc | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 34190471ce..f2c4b0322c 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -264,6 +264,72 @@ PluginManager::~PluginManager() } } +struct PluginInfoPtrNameSorter { + bool operator () (PluginInfoPtr const& a, PluginInfoPtr const& b) const { + return PBD::downcase (a->name) < PBD::downcase (b->name); + } +}; + +void +PluginManager::detect_name_ambiguities (PluginInfoList* pil) +{ + if (!pil) { + return; + } + pil->sort (PluginInfoPtrNameSorter ()); + + for (PluginInfoList::iterator i = pil->begin(); i != pil->end();) { + PluginInfoPtr& p = *i; + ++i; + if (i != pil->end() && (*i)->name == p->name) { + /* mark name as ambiguous IFF ambiguity can be resolved + * by listing number of audio outputs. + * This is used in the instrument selector. + */ + bool r = p->n_outputs.n_audio() != (*i)->n_outputs.n_audio(); + p->multichannel_name_ambiguity = r; + (*i)->multichannel_name_ambiguity = r; + } + } +} + +void +PluginManager::detect_type_ambiguities (PluginInfoList& pil) +{ + PluginInfoList dup; + pil.sort (PluginInfoPtrNameSorter ()); + for (PluginInfoList::iterator i = pil.begin(); i != pil.end(); ++i) { + switch (dup.size ()) { + case 0: + break; + case 1: + if (dup.back()->name != (*i)->name) { + dup.clear (); + } + break; + default: + if (dup.back()->name != (*i)->name) { + /* found multiple plugins with same name */ + bool typediff = false; + for (PluginInfoList::iterator j = dup.begin(); j != dup.end(); ++j) { + if (dup.front()->type != (*j)->type) { + typediff = true; + break; + } + } + if (typediff) { + for (PluginInfoList::iterator j = dup.begin(); j != dup.end(); ++j) { + (*j)->plugintype_name_ambiguity = true; + } + } + dup.clear (); + } + break; + } + dup.push_back (*i); + } +} + void PluginManager::refresh (bool cache_only) { @@ -372,6 +438,40 @@ PluginManager::refresh (bool cache_only) PluginListChanged (); /* EMIT SIGNAL */ PluginScanMessage(X_("closeme"), "", false); _cancel_scan = false; + + BootMessage (_("Indexing Plugins...")); + + detect_name_ambiguities (_windows_vst_plugin_info); + detect_name_ambiguities (_lxvst_plugin_info); + detect_name_ambiguities (_mac_vst_plugin_info); + detect_name_ambiguities (_au_plugin_info); + detect_name_ambiguities (_ladspa_plugin_info); + detect_name_ambiguities (_lv2_plugin_info); + detect_name_ambiguities (_lua_plugin_info); + + PluginInfoList all_plugs; + if (_windows_vst_plugin_info) { + all_plugs.insert(all_plugs.end(), _windows_vst_plugin_info->begin(), _windows_vst_plugin_info->end()); + } + if (_lxvst_plugin_info) { + all_plugs.insert(all_plugs.end(), _lxvst_plugin_info->begin(), _lxvst_plugin_info->end()); + } + if (_mac_vst_plugin_info) { + all_plugs.insert(all_plugs.end(), _mac_vst_plugin_info->begin(), _mac_vst_plugin_info->end()); + } + if (_au_plugin_info) { + all_plugs.insert(all_plugs.end(), _au_plugin_info->begin(), _au_plugin_info->end()); + } + if (_ladspa_plugin_info) { + all_plugs.insert(all_plugs.end(), _ladspa_plugin_info->begin(), _ladspa_plugin_info->end()); + } + if (_lv2_plugin_info) { + all_plugs.insert(all_plugs.end(), _lv2_plugin_info->begin(), _lv2_plugin_info->end()); + } + if (_lua_plugin_info) { + all_plugs.insert(all_plugs.end(), _lua_plugin_info->begin(), _lua_plugin_info->end()); + } + detect_type_ambiguities (all_plugs); } void |