fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / luaproc.cc
index c8e088af55e0445c3bee82729ed81df00c637bcb..fbba74bba328103788c8987ae02a4a1f6b76ca51 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 ();
@@ -395,6 +380,8 @@ 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;                                                   \
   }                                                                 \
@@ -436,8 +423,8 @@ 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 != possible_midiin && !imprecise) {
                        continue;
@@ -508,8 +495,6 @@ LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, Chan
                                 * Really imprecise only if desired_in != audio_in */
                                FOUNDCFG_IMPRECISE (desired_in, possible_out);
                        }
-                       // ideally we'll also find the closest, best matching
-                       // input configuration with minimal output penalty...
                }
 
        }