1 #ifndef __gtkardour_luainstance_h__
2 #define __gtkardour_luainstance_h__
9 #include "pbd/signals.h"
10 #include "pbd/xml++.h"
12 #include "ardour/luascripting.h"
13 #include "ardour/lua_script_params.h"
14 #include "ardour/luabindings.h"
15 #include "ardour/session_handle.h"
17 #include "lua/luastate.h"
19 #include "luasignal.h"
25 typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
27 class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
30 LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
31 LuaCallback (ARDOUR::Session*, XMLNode & node);
34 XMLNode& get_state (void);
35 void set_session (ARDOUR::Session *);
37 const PBD::ID& id () const { return _id; }
38 const std::string& name () const { return _name; }
39 ActionHook signals () const { return _signals; }
40 bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
41 PBD::Signal0<void> drop_callback;
44 void session_going_away ();
54 template <class T> void reconnect_object (T);
57 luabridge::LuaRef * _lua_add;
58 luabridge::LuaRef * _lua_get;
59 luabridge::LuaRef * _lua_call;
60 luabridge::LuaRef * _lua_save;
61 luabridge::LuaRef * _lua_load;
63 PBD::ScopedConnectionList _connections;
65 template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
66 template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
68 template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
69 template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
71 template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
72 template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
74 template <typename T, typename C1, typename C2, typename C3> void connect_3 (enum LuaSignal::LuaSignal, T, PBD::Signal3<void, C1, C2, C3>*);
75 template <typename T, typename C1, typename C2, typename C3> void proxy_3 (enum LuaSignal::LuaSignal, T, C1, C2, C3);
78 typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
79 typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
83 class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
86 static LuaInstance* instance();
87 static void destroy_instance();
90 static void register_classes (lua_State* L);
91 static void register_hooks (lua_State* L);
92 static void bind_cairo (lua_State* L);
93 static void bind_dialog (lua_State* L);
95 static void render_action_icon (cairo_t* cr, int w, int h, uint32_t c, void* i);
97 void set_session (ARDOUR::Session* s);
99 int set_state (const XMLNode&);
100 XMLNode& get_action_state (void);
101 XMLNode& get_hook_state (void);
106 bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
109 void call_action (const int);
110 void render_icon (int i, cairo_t*, int, int, uint32_t);
112 bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
113 bool remove_lua_action (const int);
114 bool lua_action_name (const int, std::string&);
115 std::vector<std::string> lua_action_names ();
116 bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
117 bool lua_action_has_icon (const int);
118 sigc::signal<void,int,std::string> ActionChanged;
121 bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
122 bool unregister_lua_slot (const PBD::ID&);
123 std::vector<PBD::ID> lua_slots () const;
124 bool lua_slot_name (const PBD::ID&, std::string&) const;
125 std::vector<std::string> lua_slot_names () const;
126 bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
127 sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
129 static PBD::Signal0<void> LuaTimerS; // deci-seconds (Timer every 1s)
130 static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
131 static PBD::Signal0<void> SetSession; // emitted when a session is loaded
135 static LuaInstance* _instance;
139 void session_going_away ();
143 luabridge::LuaRef * _lua_call_action;
144 luabridge::LuaRef * _lua_render_icon;
145 luabridge::LuaRef * _lua_add_action;
146 luabridge::LuaRef * _lua_del_action;
147 luabridge::LuaRef * _lua_get_action;
149 luabridge::LuaRef * _lua_load;
150 luabridge::LuaRef * _lua_save;
151 luabridge::LuaRef * _lua_clear;
153 LuaCallbackMap _callbacks;
154 PBD::ScopedConnectionList _slotcon;
156 void every_second ();
157 sigc::connection second_connection;
159 void every_point_one_seconds ();
160 sigc::connection point_one_second_connection;