Use a default configuration instead of bailing out
[ardour.git] / libs / ardour / luaproc.cc
index 8f370ebfad57ace07ab49b83ca911914a0321b09..e73b18ee21877e6ee533be202935bf0de6573d82 100644 (file)
@@ -228,25 +228,6 @@ LuaProc::load_script ()
                }
        }
 
-       // query midi i/o
-       luabridge::LuaRef lua_dsp_has_midi_in = luabridge::getGlobal (L, "dsp_has_midi_input");
-       if (lua_dsp_has_midi_in.type () == LUA_TFUNCTION) {
-               try {
-                       _has_midi_input = lua_dsp_has_midi_in ();
-               } catch (luabridge::LuaException const& e) {
-                       ;
-               }
-       }
-
-       luabridge::LuaRef lua_dsp_has_midi_out = luabridge::getGlobal (L, "dsp_has_midi_output");
-       if (lua_dsp_has_midi_out.type () == LUA_TFUNCTION) {
-               try {
-                       _has_midi_output = lua_dsp_has_midi_out ();
-               } catch (luabridge::LuaException const& e) {
-                       ;
-               }
-       }
-
        _ctrl_params.clear ();
 
        luabridge::LuaRef lua_render = luabridge::getGlobal (L, "render_inline");
@@ -348,22 +329,24 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
 
        lua_State* L = lua.getState ();
        luabridge::LuaRef ioconfig = luabridge::getGlobal (L, "dsp_ioconfig");
-       if (!ioconfig.isFunction ()) {
-               return false;
-       }
 
        luabridge::LuaRef *_iotable = NULL; // can't use reference :(
-       try {
-               luabridge::LuaRef iotable = ioconfig ();
-               if (iotable.isTable ()) {
-                       _iotable = new luabridge::LuaRef (iotable);
+
+       if (ioconfig.isFunction ()) {
+               try {
+                       luabridge::LuaRef iotable = ioconfig ();
+                       if (iotable.isTable ()) {
+                               _iotable = new luabridge::LuaRef (iotable);
+                       }
+               } catch (luabridge::LuaException const& e) {
+                       _iotable = NULL;
                }
-       } catch (luabridge::LuaException const& e) {
-               return false;
        }
 
        if (!_iotable) {
-               return false;
+               /* empty table as default */
+               luabridge::LuaRef iotable = luabridge::newTable(L);
+               _iotable = new luabridge::LuaRef (iotable);
        }
 
        // now we can reference it.
@@ -371,7 +354,9 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
        delete _iotable;
 
        if ((iotable).length () < 1) {
-               return false;
+               /* empty table as only config, to get default values */
+               luabridge::LuaRef ioconf = luabridge::newTable(L);
+               iotable[1] = ioconf;
        }
 
        const int audio_in = in.n_audio ();
@@ -379,6 +364,7 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
 
        // preferred setting (provided by plugin_insert)
        const int preferred_out = out.n_audio ();
+       const int preferred_midiout = out.n_midi ();
 
        int midi_out = -1;
        int audio_out = -1;
@@ -394,17 +380,22 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
       imprecise->set (DataType::AUDIO, (in));                       \
       imprecise->set (DataType::MIDI, possible_midiin);             \
     }                                                               \
+    _has_midi_input = (possible_midiin > 0);                        \
+    _has_midi_output = (possible_midiout > 0);                      \
     penalty = p;                                                    \
     found = true;                                                   \
   }                                                                 \
 }
 
 #define FOUNDCFG_IMPRECISE(in, out) {                               \
-  float p = fabsf ((float)(out) - preferred_out) ;                  \
-  if (in != audio_in) {                                             \
-    p += 1000;                                                      \
-  }                                                                 \
-  if ((out) > preferred_out) { p *= 1.1; }                          \
+  const float p = fabsf ((float)(out) - preferred_out) *            \
+                      (((out) > preferred_out) ? 1.1 : 1)           \
+                + fabsf ((float)possible_midiout - preferred_midiout) *    \
+                      ((possible_midiout - preferred_midiout) ? 0.6 : 0.5) \
+                + fabsf ((float)(in) - audio_in) *                  \
+                      (((in) > audio_in) ? 275 : 250)               \
+                + fabsf ((float)possible_midiin - midi_in) *        \
+                      ((possible_midiin - midi_in) ? 100 : 110);    \
   FOUNDCFG_PENALTY(in, out, p);                                     \
 }
 
@@ -432,10 +423,10 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
 
                int possible_in = io["audio_in"].isNumber() ? io["audio_in"] : -1;
                int possible_out = io["audio_out"].isNumber() ? io["audio_out"] : -1;
-               int possible_midiin = _has_midi_input ? 1 : 0;
-               int possible_midiout = _has_midi_output ? 1 : 0;
+               int possible_midiin = io["midi_in"].isNumber() ? io["midi_in"] : 0;
+               int possible_midiout = io["midi_out"].isNumber() ? io["midi_out"] : 0;
 
-               if (midi_in > 0 && possible_midiin == 0 && !imprecise) {
+               if (midi_in != possible_midiin && !imprecise) {
                        continue;
                }
 
@@ -446,19 +437,8 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
                        FOUNDCFG_PENALTY(audio_in, preferred_out, -1);
                }
 
-               // "imprecise" matches
-               if (possible_out == 0) {
-                       /* skip configurations with no audio output, unless
-                        * the plugin is a midi filter or generator */
-                       if (possible_in == 0 && _has_midi_output) {
-                               if (audio_in == 0) {
-                                       FOUNDCFG(possible_out);
-                                       break;
-                               } else if (imprecise) {
-                                       // TODO hide audio input from plugin
-                                       FOUNDCFG_IMPRECISE (possible_in, possible_out);
-                               }
-                       }
+               if (possible_out == 0 && possible_midiout == 0) {
+                       /* skip configurations with no output at all */
                        continue;
                }