From ab6d93bf5909a2c1666286621402e81a19cf444e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 13 Apr 2016 20:13:39 +0200 Subject: [PATCH] fix configurable IO MIDI FX w/strict-i/o --- libs/ardour/ardour/audio_unit.h | 2 +- libs/ardour/ardour/luaproc.h | 4 +++- libs/ardour/ardour/plugin.h | 1 + libs/ardour/ardour/plugin_insert.h | 2 +- libs/ardour/audio_unit.cc | 8 +++++++- libs/ardour/luaproc.cc | 4 +++- libs/ardour/plugin_insert.cc | 16 +++++++--------- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 057ff4f4a0..b83798fd3e 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -235,7 +235,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { std::vector get_presets (bool user_only) const; - bool needs_midi_input (); + bool needs_midi_input () const; bool is_effect () const; bool is_effect_without_midi_input () const; bool is_effect_with_midi_input () const; diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h index 0956bdf213..0f4f8d7d6d 100644 --- a/libs/ardour/ardour/luaproc.h +++ b/libs/ardour/ardour/luaproc.h @@ -160,8 +160,10 @@ class LIBARDOUR_API LuaPluginInfo : public PluginInfo PluginPtr load (Session& session); std::vector get_presets (bool user_only) const; - bool is_instrument () const { return false; } + 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/plugin.h b/libs/ardour/ardour/plugin.h index e48201e73c..ec749281af 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -394,6 +394,7 @@ class LIBARDOUR_API PluginInfo { virtual PluginPtr load (Session& session) = 0; virtual bool is_instrument() const; + virtual bool needs_midi_input() const { return is_instrument (); } virtual bool in_category (const std::string &) const { return false; } 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 4a9d87c88c..2abf31c480 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -156,7 +156,7 @@ class LIBARDOUR_API PluginInsert : public Processor bool has_no_inputs() const; bool has_no_audio_inputs() const; - bool is_midi_instrument() const; + bool needs_midi_input() const; void realtime_handle_transport_stopped (); void realtime_locate (); diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 3b1c60a0c2..3c42303680 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -2679,6 +2679,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip continue; } + bool has_midi_in = false; + AUPluginInfoPtr info (new AUPluginInfo (boost::shared_ptr (new CAComponentDescription(temp)))); @@ -2703,9 +2705,11 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip break; case kAudioUnitType_MusicDevice: info->category = _("AudioUnit Instruments"); + has_midi_in = true; break; case kAudioUnitType_MusicEffect: info->category = _("AudioUnit MusicEffects"); + has_midi_in = true; break; case kAudioUnitType_Effect: info->category = _("AudioUnit Effects"); @@ -2772,6 +2776,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip info->n_inputs.set (DataType::AUDIO, 1); } + info->n_inputs.set (DataType::MIDI, has_midi_in ? 1 ; 0); + if (possible_out > 0) { info->n_outputs.set (DataType::AUDIO, possible_out); } else { @@ -3046,7 +3052,7 @@ AUPluginInfo::stringify_descriptor (const CAComponentDescription& desc) } bool -AUPluginInfo::needs_midi_input () +AUPluginInfo::needs_midi_input () const { return is_effect_with_midi_input () || is_instrument (); } diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index 7521781297..7af6f587a4 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -156,6 +156,7 @@ bool LuaProc::load_script () { assert (!_lua_dsp); // don't allow to re-initialize + LuaPluginInfoPtr lpi; // TODO: refine APIs; function arguments.. // - perform channel-map in ardour (silent/scratch buffers) ? @@ -167,7 +168,7 @@ LuaProc::load_script () try { LuaScriptInfoPtr lsi = LuaScripting::script_info (_script); - LuaPluginInfoPtr lpi (new LuaPluginInfo (lsi)); + lpi = LuaPluginInfoPtr (new LuaPluginInfo (lsi)); assert (lpi); set_info (lpi); _mempool.set_name ("LuaProc: " + lsi->name); @@ -216,6 +217,7 @@ LuaProc::load_script () ; } } + lpi->_is_instrument = _has_midi_input; _ctrl_params.clear (); diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 94f5ba62c0..0e2fffb7ad 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -341,15 +341,13 @@ PluginInsert::plugin_latency () const { } bool -PluginInsert::is_midi_instrument() const +PluginInsert::needs_midi_input() const { - /* XXX more finesse is possible here. VST plugins have a - a specific "instrument" flag, for example. - */ - PluginInfoPtr pi = _plugins[0]->get_info(); - - return pi->n_inputs.n_midi() != 0 && - pi->n_outputs.n_audio() > 0; + PluginInfoPtr pip = _plugins[0]->get_info(); + if (pip->needs_midi_input ()) { + return true; + } + return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0; } void @@ -1535,7 +1533,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC m.strict_io = true; /* special case MIDI instruments */ - if (is_midi_instrument()) { + if (needs_midi_input ()) { // output = midi-bypass + at most master-out channels. ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out max_out.set (DataType::MIDI, out.get(DataType::MIDI)); -- 2.30.2