mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-29 09:57:44 +01:00
Detect plugin-name ambiguities
This commit is contained in:
parent
7e5120e7c9
commit
0b377fc393
3 changed files with 113 additions and 3 deletions
|
|
@ -303,7 +303,6 @@ public:
|
|||
/** Emitted for preset-load to set a control-port */
|
||||
PBD::Signal2<void, uint32_t, float> PresetPortSetValue;
|
||||
|
||||
|
||||
/** @return true if plugin has a custom plugin GUI */
|
||||
virtual bool has_editor () const = 0;
|
||||
|
||||
|
|
@ -455,7 +454,12 @@ find_plugin (ARDOUR::Session&, std::string unique_id, ARDOUR::PluginType);
|
|||
class LIBARDOUR_API PluginInfo
|
||||
{
|
||||
public:
|
||||
PluginInfo () {}
|
||||
PluginInfo ()
|
||||
: multichannel_name_ambiguity (false)
|
||||
, plugintype_name_ambiguity (false)
|
||||
, index (0)
|
||||
{}
|
||||
|
||||
virtual ~PluginInfo () {}
|
||||
|
||||
std::string name;
|
||||
|
|
@ -466,6 +470,9 @@ public:
|
|||
ChanCount n_outputs;
|
||||
ARDOUR::PluginType type;
|
||||
|
||||
bool multichannel_name_ambiguity;
|
||||
bool plugintype_name_ambiguity;
|
||||
|
||||
std::string unique_id;
|
||||
|
||||
virtual PluginPtr load (Session& session) = 0;
|
||||
|
|
@ -491,7 +498,7 @@ public:
|
|||
|
||||
protected:
|
||||
friend class PluginManager;
|
||||
uint32_t index;
|
||||
uint32_t index; //< used for LADSPA, index in module
|
||||
};
|
||||
|
||||
} // namespace ARDOUR
|
||||
|
|
|
|||
|
|
@ -193,6 +193,9 @@ private:
|
|||
bool _cancel_scan;
|
||||
bool _cancel_timeout;
|
||||
|
||||
void detect_name_ambiguities (ARDOUR::PluginInfoList*);
|
||||
void detect_type_ambiguities (ARDOUR::PluginInfoList&);
|
||||
|
||||
void ladspa_refresh ();
|
||||
void lua_refresh ();
|
||||
void lua_refresh_cb ();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue