summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-04-13 20:13:39 +0200
committerRobin Gareus <robin@gareus.org>2016-04-13 20:13:39 +0200
commitab6d93bf5909a2c1666286621402e81a19cf444e (patch)
tree7f84cb80cb4f3708ad27da9b9c93ace0808640eb
parentb4e4bd87330bc9d5d6e11d398cb1f08e70eb022d (diff)
fix configurable IO MIDI FX w/strict-i/o
-rw-r--r--libs/ardour/ardour/audio_unit.h2
-rw-r--r--libs/ardour/ardour/luaproc.h4
-rw-r--r--libs/ardour/ardour/plugin.h1
-rw-r--r--libs/ardour/ardour/plugin_insert.h2
-rw-r--r--libs/ardour/audio_unit.cc8
-rw-r--r--libs/ardour/luaproc.cc4
-rw-r--r--libs/ardour/plugin_insert.cc16
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<Plugin::PresetRecord> 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<Plugin::PresetRecord> 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<LuaPluginInfo> 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<Plugin::PresetRecord> 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<CAComponentDescription> (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));