summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-10-15 14:47:11 +0200
committerRobin Gareus <robin@gareus.org>2019-10-15 14:48:32 +0200
commitbcd1391bf745f69f3689b9885f1b99dda9649587 (patch)
tree403ca0c4f319295366b26c01f955de34146fc455
parentcbb116026dad699b7e06a07918c82484c16fb2b6 (diff)
API to count max multi-channel plugin outputs
-rw-r--r--libs/ardour/ardour/audio_unit.h4
-rw-r--r--libs/ardour/ardour/luaproc.h6
-rw-r--r--libs/ardour/ardour/plugin.h6
-rw-r--r--libs/ardour/audio_unit.cc22
-rw-r--r--libs/ardour/luaproc.cc2
-rw-r--r--libs/ardour/plugin_manager.cc2
6 files changed, 33 insertions, 9 deletions
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<CAComponentDescription>);
- ~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<CAComponentDescription> 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<Plugin::PresetRecord> 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<LuaPluginInfo> 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<CAComponentDescription> 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<pair<int,int> >& ioc (info->cache.io_configs);
+ for (vector<pair<int,int> >::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;
}