From: Robin Gareus Date: Tue, 15 Oct 2019 12:47:11 +0000 (+0200) Subject: API to count max multi-channel plugin outputs X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=bcd1391bf745f69f3689b9885f1b99dda9649587;p=ardour.git API to count max multi-channel plugin outputs --- diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 1ed1703c54..feae338e86 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -245,7 +245,7 @@ struct LIBARDOUR_API AUPluginCachedInfo { class LIBARDOUR_API AUPluginInfo : public PluginInfo { public: AUPluginInfo (boost::shared_ptr); - ~AUPluginInfo (); + ~AUPluginInfo () {} PluginPtr load (Session& session); @@ -263,6 +263,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { AUPluginCachedInfo cache; bool reconfigurable_io() const { return true; } + uint32_t max_configurable_ouputs () const { return max_outputs; } static void clear_cache (); static PluginInfoList* discover (bool scan_only); @@ -274,6 +275,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { private: boost::shared_ptr descriptor; UInt32 version; + uint32_t max_outputs; static FILE * _crashlog_fd; static bool _scan_only; diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h index 7d348e6e6c..dcb5ec13cc 100644 --- a/libs/ardour/ardour/luaproc.h +++ b/libs/ardour/ardour/luaproc.h @@ -211,6 +211,12 @@ class LIBARDOUR_API LuaPluginInfo : public PluginInfo std::vector get_presets (bool user_only) const; bool reconfigurable_io() const { return true; } + uint32_t max_configurable_ouputs () const { + return _max_outputs; + } + + private: + uint32_t _max_outputs; }; typedef boost::shared_ptr LuaPluginInfoPtr; diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index ad03806977..287f18ad68 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -496,6 +496,12 @@ public: /* @return true if the plugin can change its inputs or outputs on demand. */ virtual bool reconfigurable_io () const { return false; } + /* max [re]configurable outputs (if finite, 0 otherwise) */ + virtual uint32_t max_configurable_ouputs () const + { + return n_outputs.n_audio(); + } + protected: friend class PluginManager; uint32_t index; //< used for LADSPA, index in module diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index cf268a0403..bf9ea888ab 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -2549,11 +2549,7 @@ AUPlugin::has_editor () const AUPluginInfo::AUPluginInfo (boost::shared_ptr d) : descriptor (d) , version (0) -{ - type = ARDOUR::AudioUnit; -} - -AUPluginInfo::~AUPluginInfo () + , max_outputs (0) { type = ARDOUR::AudioUnit; } @@ -2922,6 +2918,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip const int rv = cached_io_configuration (info->unique_id, info->version, cacomp, info->cache, info->name); + info.max_outputs = 0; + if (rv == 0) { /* here we have to map apple's wildcard system to a simple pair of values. in ::can_do() we use the whole system, but here @@ -2936,8 +2934,18 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip info to the user, which should perhaps be revisited. */ - int32_t possible_in = info->cache.io_configs.front().first; - int32_t possible_out = info->cache.io_configs.front().second; + const vector >& ioc (info->cache.io_configs); + for (vector >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) { + int32_t possible_out = i->second; + if (possible_out < 0) { + continue; + } else if (possible_out > info.max_outputs) { + info.max_outputs = possible_out; + } + } + + int32_t possible_in = ioc.front().first; + int32_t possible_out = ioc.font().second; if (possible_in > 0) { info->n_inputs.set (DataType::AUDIO, possible_in); diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index 64c7ca6c7c..a4fde50186 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -1232,6 +1232,8 @@ LuaPluginInfo::LuaPluginInfo (LuaScriptInfoPtr lsi) { n_outputs.set (DataType::AUDIO, 1); type = Lua; + // TODO, parse script, get 'dsp_ioconfig', see can_support_io_configuration() + _max_outputs = 0; } PluginPtr diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index f2c4b0322c..9d21b6bb65 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -286,7 +286,7 @@ PluginManager::detect_name_ambiguities (PluginInfoList* pil) * 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(); + bool r = p->max_configurable_ouputs () != (*i)->max_configurable_ouputs (); p->multichannel_name_ambiguity = r; (*i)->multichannel_name_ambiguity = r; }