fix crash when copy'ing latent plugins
[ardour.git] / gtk2_ardour / luainstance.h
1 #ifndef __gtkardour_luainstance_h__
2 #define __gtkardour_luainstance_h__
3
4 #include <bitset>
5
6 #include "pbd/id.h"
7 #include "pbd/signals.h"
8 #include "pbd/xml++.h"
9
10 #include "ardour/luascripting.h"
11 #include "ardour/lua_script_params.h"
12 #include "ardour/luabindings.h"
13 #include "ardour/session_handle.h"
14
15 #include "lua/luastate.h"
16
17 #include "luasignal.h"
18
19 namespace luabridge {
20         class LuaRef;
21 }
22
23 typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
24
25 class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
26 {
27 public:
28         LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
29         LuaCallback (ARDOUR::Session*, XMLNode & node);
30         ~LuaCallback ();
31
32         XMLNode& get_state (void);
33         void set_session (ARDOUR::Session *);
34
35         const PBD::ID& id () const { return _id; }
36         const std::string& name () const { return _name; }
37         ActionHook signals () const { return _signals; }
38         bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
39         PBD::Signal0<void> drop_callback;
40
41 protected:
42         void session_going_away ();
43
44 private:
45         LuaState lua;
46
47         PBD::ID _id;
48         std::string _name;
49         ActionHook _signals;
50
51         void reconnect ();
52         template <class T> void reconnect_object (T);
53         void init ();
54
55         luabridge::LuaRef * _lua_add;
56         luabridge::LuaRef * _lua_get;
57         luabridge::LuaRef * _lua_call;
58         luabridge::LuaRef * _lua_save;
59         luabridge::LuaRef * _lua_load;
60
61         PBD::ScopedConnectionList _connections;
62
63         template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
64         template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
65
66         template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
67         template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
68
69         template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
70         template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
71 };
72
73 typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
74 typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
75
76
77
78 class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
79 {
80 public:
81         static LuaInstance* instance();
82         ~LuaInstance();
83
84         static void register_classes (lua_State* L);
85         static void register_hooks (lua_State* L);
86         static void bind_cairo (lua_State* L);
87
88         void set_session (ARDOUR::Session* s);
89
90         int set_state (const XMLNode&);
91         XMLNode& get_action_state (void);
92         XMLNode& get_hook_state (void);
93
94         bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
95
96         /* actions */
97         void call_action (const int);
98
99         bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
100         bool remove_lua_action (const int);
101         bool lua_action_name (const int, std::string&);
102         std::vector<std::string> lua_action_names ();
103         bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
104         sigc::signal<void,int,std::string> ActionChanged;
105
106         /* callbacks */
107         bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
108         bool unregister_lua_slot (const PBD::ID&);
109         std::vector<PBD::ID> lua_slots () const;
110         bool lua_slot_name (const PBD::ID&, std::string&) const;
111         std::vector<std::string> lua_slot_names () const;
112         bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
113         sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
114
115         static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
116
117 private:
118         LuaInstance();
119         static LuaInstance* _instance;
120
121         void init ();
122         void session_going_away ();
123
124         LuaState lua;
125
126         luabridge::LuaRef * _lua_call_action;
127         luabridge::LuaRef * _lua_add_action;
128         luabridge::LuaRef * _lua_del_action;
129         luabridge::LuaRef * _lua_get_action;
130
131         luabridge::LuaRef * _lua_load;
132         luabridge::LuaRef * _lua_save;
133         luabridge::LuaRef * _lua_clear;
134
135         LuaCallbackMap _callbacks;
136         PBD::ScopedConnectionList _slotcon;
137
138         void every_point_one_seconds ();
139         sigc::connection point_one_second_connection;
140 };
141
142 #endif