From b8491014a53e236255f5803fc876f848cfc82750 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 29 Jan 2018 23:55:20 +0100 Subject: Update plugin classification * dedicated API for classes (effect, instrument, util) * prepare for tags (rather than categories) * prepare removal of per-plugin in_category() API --- libs/ardour/ardour/audio_unit.h | 5 ++++- libs/ardour/ardour/ladspa_plugin.h | 7 +++++++ libs/ardour/ardour/luaproc.h | 6 ------ libs/ardour/ardour/lv2_plugin.h | 2 -- libs/ardour/ardour/plugin.h | 12 ++++++++++-- libs/ardour/ardour/plugin_insert.h | 2 ++ libs/ardour/audio_unit.cc | 17 ++++++++++++----- libs/ardour/luaproc.cc | 1 - libs/ardour/lv2_plugin.cc | 25 ------------------------- libs/ardour/plugin.cc | 36 ++++++++++++++++++++++++++++++------ libs/ardour/plugin_insert.cc | 5 +---- libs/ardour/plugin_manager.cc | 6 +++--- libs/ardour/vst_info_file.cc | 2 +- 13 files changed, 70 insertions(+), 56 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 2e44e6ec63..407be7a6dc 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -251,10 +251,13 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { std::vector get_presets (bool user_only) const; bool needs_midi_input () const; - bool is_effect () const; bool is_effect_without_midi_input () const; bool is_effect_with_midi_input () const; + + /* note: AU's have an explicit way to prompt for instrument/fx category */ + bool is_effect () const; bool is_instrument () const; + bool is_utility () const; AUPluginCachedInfo cache; diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h index 0dca9bd5a6..97744abc34 100644 --- a/libs/ardour/ardour/ladspa_plugin.h +++ b/libs/ardour/ardour/ladspa_plugin.h @@ -151,6 +151,13 @@ class LIBARDOUR_API LadspaPluginInfo : public PluginInfo { LadspaPluginInfo (); ~LadspaPluginInfo () { }; + bool is_instrument () const { return false; } /* ladspa's are never instruments */ +#ifdef MIXBUS + /* for mixbus, relegate ladspa's to the Utils folder. */ + bool is_effect () const { return false; } + bool is_utility () const { return true; } +#endif + PluginPtr load (Session& session); std::vector get_presets (bool user_only) const; }; diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h index 6404944fbb..8ac27095ab 100644 --- a/libs/ardour/ardour/luaproc.h +++ b/libs/ardour/ardour/luaproc.h @@ -208,13 +208,7 @@ class LIBARDOUR_API LuaPluginInfo : public PluginInfo PluginPtr load (Session& session); std::vector get_presets (bool user_only) const; - bool in_category (const std::string &c) const { - return (category == c); - } - bool is_instrument () const { return _is_instrument; } bool reconfigurable_io() const { return true; } - - bool _is_instrument; }; typedef boost::shared_ptr LuaPluginInfoPtr; diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 25fda7400a..01dbaf4adc 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -364,8 +364,6 @@ public: PluginPtr load (Session& session); std::vector get_presets (bool user_only) const; - virtual bool in_category (const std::string &c) const; - virtual bool is_instrument() const; char * _plugin_uri; }; diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index e9738a61f1..fae35c33e1 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -425,9 +425,17 @@ class LIBARDOUR_API PluginInfo { std::string unique_id; virtual PluginPtr load (Session& session) = 0; - virtual bool is_instrument() const; + + /* NOTE: it is possible for a plugin to be an effect AND an instrument. + * override these funcs as necessary to support that. + */ + virtual bool is_effect () const; + virtual bool is_instrument () const; + virtual bool is_utility () const; //this includes things like "generators" and "midi filters" + virtual bool is_analyzer () const; + virtual bool needs_midi_input() const; - virtual bool in_category (const std::string &) const { return false; } + virtual bool in_category (const std::string &) const { return false; } // deprecated virtual std::vector get_presets (bool user_only) const = 0; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index e54816a00b..05d0d4043c 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -176,7 +176,9 @@ public: bool has_no_inputs() const; bool has_no_audio_inputs() const; + bool is_instrument () const; + bool has_output_presets ( ChanCount in = ChanCount (DataType::MIDI, 1), ChanCount out = ChanCount (DataType::AUDIO, 2) diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 867040a8d0..373add621b 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -38,13 +38,13 @@ #include #include "ardour/ardour.h" +#include "ardour/audio_unit.h" #include "ardour/audioengine.h" #include "ardour/audio_buffer.h" #include "ardour/debug.h" -#include "ardour/midi_buffer.h" #include "ardour/filesystem_paths.h" #include "ardour/io.h" -#include "ardour/audio_unit.h" +#include "ardour/midi_buffer.h" #include "ardour/route.h" #include "ardour/session.h" #include "ardour/tempo.h" @@ -2916,14 +2916,14 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip continue; case kAudioUnitType_Output: - info->category = _("AudioUnit Output"); + info->category = _("Output"); break; case kAudioUnitType_MusicDevice: info->category = _("Instrument"); has_midi_in = true; break; case kAudioUnitType_MusicEffect: - info->category = _("Music Effect"); + info->category = _("Effect"); has_midi_in = true; break; case kAudioUnitType_Effect: @@ -2936,7 +2936,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip info->category = _("Generator"); break; default: - info->category = _("AudioUnit (Unknown)"); + info->category = _("(Unknown)"); break; } @@ -3310,6 +3310,13 @@ AUPluginInfo::is_instrument () const return descriptor->IsMusicDevice(); } +bool +AUPluginInfo::is_utility () const +{ + return (descriptor->IsGenerator() || descriptor->componentType == 'aumi'); + // kAudioUnitType_MidiProcessor ..looks like we aren't even scanning for these yet? +} + void AUPlugin::set_info (PluginInfoPtr info) { diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index d5a0f65d1e..385965b3cf 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -1228,7 +1228,6 @@ LuaPluginInfo::LuaPluginInfo (LuaScriptInfoPtr lsi) { n_outputs.set (DataType::AUDIO, 1); type = Lua; - _is_instrument = category == "Instrument"; } PluginPtr diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 92badc4b5a..941dac1615 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -3411,31 +3411,6 @@ LV2PluginInfo::get_presets (bool /*user_only*/) const return p; } -bool -LV2PluginInfo::in_category (const std::string &c) const -{ - // TODO use untranslated lilv_plugin_get_class() - // match gtk2_ardour/plugin_selector.cc - return category == c; -} - -bool -LV2PluginInfo::is_instrument () const -{ - if (category == "Instrument") { - return true; - } -#if 1 - /* until we make sure that category remains untranslated in the lv2.ttl spec - * and until most instruments also classify themselves as such, there's a 2nd check: - */ - if (n_inputs.n_midi() > 0 && n_inputs.n_audio() == 0 && n_outputs.n_audio() > 0) { - return true; - } -#endif - return false; -} - PluginInfoList* LV2PluginInfo::discover() { diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index e0ba0f00f7..2d1ffbed74 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -87,12 +87,6 @@ PluginInfo::needs_midi_input () const return (n_inputs.n_midi() != 0); } -bool -PluginInfo::is_instrument () const -{ - return (n_inputs.n_midi() != 0) && (n_outputs.n_audio() > 0) && (n_inputs.n_audio() == 0); -} - Plugin::Plugin (AudioEngine& e, Session& s) : _engine (e) , _session (s) @@ -526,3 +520,33 @@ Plugin::parameter_label (uint32_t which) const get_parameter_descriptor (which, pd); return pd.label; } + +bool +PluginInfo::is_effect () const +{ + return (!is_instrument () && !is_utility () && !is_analyzer ()); +} + +bool +PluginInfo::is_instrument () const +{ + if (category == "Instrument") { + return true; + } + + // second check: if we have midi input and audio output, we're likely an instrument + return (n_inputs.n_midi() != 0) && (n_outputs.n_audio() > 0) && (n_inputs.n_audio() == 0); +} + +bool +PluginInfo::is_utility () const +{ + /* XXX beware of translations, e.g. LV2 categories */ + return (category == "Utility" || category == "MIDI" || category == "Generator"); +} + +bool +PluginInfo::is_analyzer () const +{ + return (category == "Analyser" || category == "Anaylsis" || category == "Analyzer"); +} diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index f642f85e60..c179f0d24b 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -386,10 +386,7 @@ bool PluginInsert::is_instrument() const { PluginInfoPtr pip = _plugins[0]->get_info(); - if (pip->is_instrument ()) { - return true; - } - return pip->n_inputs.n_midi () != 0 && pip->n_outputs.n_audio () > 0 && pip->n_inputs.n_audio () == 0; + return (pip->is_instrument ()); } bool diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index d04a1bf5a3..766daa306b 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -984,7 +984,7 @@ PluginManager::windows_vst_discover (string path, bool cache_only) snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); info->unique_id = buf; - info->category = "VST"; + info->category = finfo->category; info->path = path; info->creator = finfo->creator; info->index = 0; @@ -1121,7 +1121,7 @@ PluginManager::mac_vst_discover (string path, bool cache_only) snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); info->unique_id = buf; - info->category = "MacVST"; + info->category = finfo->Category; info->path = path; info->creator = finfo->creator; info->index = 0; @@ -1240,7 +1240,7 @@ PluginManager::lxvst_discover (string path, bool cache_only) snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); info->unique_id = buf; - info->category = "linuxVSTs"; + info->category = finfo->Category; info->path = path; info->creator = finfo->creator; info->index = 0; diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc index 42e8e72447..f9b731e240 100644 --- a/libs/ardour/vst_info_file.cc +++ b/libs/ardour/vst_info_file.cc @@ -314,7 +314,7 @@ vstfx_load_info_block (FILE* fp, VSTInfo *info) // TODO read isInstrument -- effFlagsIsSynth info->isInstrument = info->numInputs == 0 && info->numOutputs > 0 && 1 == (info->wantMidi & 1); - if (!strcmp (info->Category, "Synth")) { + if (!strcmp (info->Category, "Instrument")) { info->isInstrument = true; } -- cgit v1.2.3