Clean up is_instrument vs needs-midi-in API
authorRobin Gareus <robin@gareus.org>
Fri, 7 Oct 2016 18:55:21 +0000 (20:55 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 7 Oct 2016 18:55:21 +0000 (20:55 +0200)
The latter is only really relevant for Audio Units.

This fixes an issue with vocoders or audio-plugins that simply have
a MIDI input for other purposes to be wrongly categorized as Instruments..
.. and thereby override strict-i/o rules (prefer stereo)

libs/ardour/ardour/plugin.h
libs/ardour/ardour/plugin_insert.h
libs/ardour/plugin.cc
libs/ardour/plugin_insert.cc

index df4b512ef70404ed2f06688d17d9e16532f17c61..09cd066527ea00801f1ae8baed44f2d71b2ed067 100644 (file)
@@ -395,7 +395,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 needs_midi_input() const;
        virtual bool in_category (const std::string &) const { return false; }
 
        virtual std::vector<Plugin::PresetRecord> get_presets (bool user_only) const = 0;
index d38523a77de889fabbd3d94b286fd8b850e9ff5c..a9a2ce62735fd7ce710649de6fbfa57aafd4906b 100644 (file)
@@ -171,7 +171,7 @@ class LIBARDOUR_API PluginInsert : public Processor
 
        bool has_no_inputs() const;
        bool has_no_audio_inputs() const;
-       bool needs_midi_input() const;
+       bool is_instrument () const;
        bool has_output_presets (
                        ChanCount in = ChanCount (DataType::MIDI, 1),
                        ChanCount out = ChanCount (DataType::AUDIO, 2)
index 7d04c3f5d79870368da7be5efaf2a527f5e3d7f8..f76f96af7a2183e17da49c911f7255e2d722213d 100644 (file)
@@ -81,10 +81,16 @@ static bool seen_set_state_message = false;
 
 PBD::Signal2<void, std::string, Plugin*> Plugin::PresetsChanged;
 
+bool
+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);
+       return (n_inputs.n_midi() != 0) && (n_outputs.n_audio() > 0) && (n_inputs.n_audio() == 0);
 }
 
 Plugin::Plugin (AudioEngine& e, Session& s)
index 7b3aa60ba48cf49851542cd7660dae584dd47ae9..c3dae8b71f184edd1c4ee838c0eac3d5a6b34e86 100644 (file)
@@ -394,13 +394,13 @@ PluginInsert::plugin_latency () const {
 }
 
 bool
-PluginInsert::needs_midi_input() const
+PluginInsert::is_instrument() const
 {
        PluginInfoPtr pip = _plugins[0]->get_info();
-       if (pip->needs_midi_input ()) {
+       if (pip->is_instrument ()) {
                return true;
        }
-       return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
+       return pip->n_inputs.n_midi () != 0 && pip->n_outputs.n_audio () > 0 && pip->n_inputs.n_audio () == 0;
 }
 
 bool
@@ -426,7 +426,7 @@ PluginInsert::has_output_presets (ChanCount in, ChanCount out)
                        return false;
                }
        }
-       if (!needs_midi_input ()) {
+       if (!is_instrument ()) {
                        return false;
        }
        return true;
@@ -1994,7 +1994,7 @@ PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, Chan
                m.strict_io = true;
 
                /* special case MIDI instruments */
-               if (needs_midi_input ()) {
+               if (is_instrument ()) {
                        // 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));