OSC: Add preset loading to OSC GUI
[ardour.git] / gtk2_ardour / luainstance.cc
index 4d3ea5f777a0e0e50fb433b05f53e8b0ac7ed7dc..c813eeea63dafca66b860c9d1d6da6f9e255fe8f 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "LuaBridge/LuaBridge.h"
 
+#include "ardour_http.h"
 #include "ardour_ui.h"
 #include "public_editor.h"
 #include "region_selection.h"
@@ -39,6 +40,7 @@
 #include "time_axis_view.h"
 #include "selection.h"
 #include "script_selector.h"
+#include "timers.h"
 #include "utils_videotl.h"
 
 #include "pbd/i18n.h"
@@ -347,16 +349,6 @@ const char *luasignalstr[] = {
 }; // namespace
 
 
-std::string lua_http_get (const char *u) {
-       char *rv = a3_curl_http_get (u, NULL);
-       if (!rv) {
-               return "";
-       }
-       std::string s (rv);
-       free (rv);
-       return s;
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 
 #define xstr(s) stringify(s)
@@ -364,6 +356,8 @@ std::string lua_http_get (const char *u) {
 
 using namespace ARDOUR;
 
+PBD::Signal0<void> LuaInstance::LuaTimerDS;
+
 void
 LuaInstance::register_hooks (lua_State* L)
 {
@@ -549,7 +543,7 @@ LuaInstance::register_classes (lua_State* L)
        luabridge::getGlobalNamespace (L)
                .beginNamespace ("ArdourUI")
 
-               .addFunction ("curl_http_get", &lua_http_get)
+               .addFunction ("http_get", (std::string (*)(const std::string&))&ArdourCurl::http_get)
 
                .beginStdList <ArdourMarker*> ("ArdourMarkerList")
                .endClass ()
@@ -995,12 +989,15 @@ void LuaInstance::set_session (Session* s)
        for (LuaCallbackMap::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
                i->second->set_session (s);
        }
+       point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, & LuaInstance::every_point_one_seconds));
 }
 
 void
 LuaInstance::session_going_away ()
 {
        ENSURE_GUI_THREAD (*this, &LuaInstance::session_going_away);
+       point_one_second_connection.disconnect ();
+
        (*_lua_clear)();
        for (int i = 0; i < 9; ++i) {
                ActionChanged (i, ""); /* EMIT SIGNAL */
@@ -1013,6 +1010,12 @@ LuaInstance::session_going_away ()
        lua.do_command ("collectgarbage();");
 }
 
+void
+LuaInstance::every_point_one_seconds ()
+{
+       LuaTimerDS (); // emit signal
+}
+
 int
 LuaInstance::set_state (const XMLNode& node)
 {
@@ -1156,6 +1159,7 @@ LuaInstance::call_action (const int id)
 {
        try {
                (*_lua_call_action)(id + 1);
+               lua.collect_garbage_step ();
        } catch (luabridge::LuaException const& e) {
                cerr << "LuaException:" << e.what () << endl;
        }
@@ -1642,11 +1646,13 @@ LuaCallback::set_session (ARDOUR::Session *s)
 {
        SessionHandlePtr::set_session (s);
 
-       if (_session) {
-               lua_State* L = lua.getState();
-               LuaBindings::set_session (L, _session);
+       if (!_session) {
+               return;
        }
 
+       lua_State* L = lua.getState();
+       LuaBindings::set_session (L, _session);
+
        reconnect();
 }
 
@@ -1660,6 +1666,10 @@ LuaCallback::session_going_away ()
        _session = 0;
 
        drop_callback (); /* EMIT SIGNAL */
+
+       lua_State* L = lua.getState();
+       LuaBindings::set_session (L, 0);
+       lua.do_command ("collectgarbage();");
 }
 
 void