convenient Lua bindings to use Ardour::DataType
[ardour.git] / libs / ardour / ardour / lua_api.h
1 /*
2  * Copyright (C) 2016 Robin Gareus <robin@gareus.org>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  *
18  */
19 #ifndef _ardour_lua_api_h_
20 #define _ardour_lua_api_h_
21
22 #include <string>
23 #include <lo/lo.h>
24 #include <boost/shared_ptr.hpp>
25
26 #include "ardour/libardour_visibility.h"
27
28 #include "ardour/processor.h"
29 #include "ardour/session.h"
30
31 namespace ARDOUR { namespace LuaAPI {
32
33         int datatype_ctor_nil (lua_State *L);
34         int datatype_ctor_audio (lua_State *L);
35         int datatype_ctor_midi (lua_State *L);
36
37         /** create a new Lua Processor (Plugin)
38          *
39          * @param s Session Handle
40          * @param p Identifier or Name of the Processor
41          * @returns Processor object (may be nil)
42          */
43         boost::shared_ptr<ARDOUR::Processor> new_luaproc (ARDOUR::Session *s, const std::string& p);
44
45         /** search a Plugin
46          *
47          * @param id Plugin Name, ID or URI
48          * @param type Plugin Type
49          * @returns PluginInfo or nil if not found
50          */
51         boost::shared_ptr<ARDOUR::PluginInfo> new_plugin_info (const std::string& id, ARDOUR::PluginType type);
52
53         /** create a new Plugin Instance
54          *
55          * @param s Session Handle
56          * @param id Plugin Name, ID or URI
57          * @param type Plugin Type
58          * @returns Processor or nil
59          */
60         boost::shared_ptr<ARDOUR::Processor> new_plugin (ARDOUR::Session *s, const std::string& id, ARDOUR::PluginType type, const std::string& preset = "");
61
62         /** set a plugin control-input parameter value
63          *
64          * @param proc Plugin-Processor
65          * @param which control-input to set (starting at 0)
66          * @param value value to set
67          * @returns true on success, false on error or out-of-bounds value
68          */
69         bool set_processor_param (boost::shared_ptr<ARDOUR::Processor> proc, uint32_t which, float val);
70         /** set a plugin control-input parameter value
71          *
72          * This is a wrapper around set_processor_param which looks up the Processor by plugin-insert.
73          *
74          * @param proc Plugin-Insert
75          * @param which control-input to set (starting at 0)
76          * @param value value to set
77          * @returns true on success, false on error or out-of-bounds value
78          */
79         bool set_plugin_insert_param (boost::shared_ptr<ARDOUR::PluginInsert> pi, uint32_t which, float val);
80
81 } } /* namespace */
82
83 namespace ARDOUR { namespace LuaOSC {
84         /** OSC transmitter
85          *
86          * A Class to send OSC messages.
87          */
88         class Address {
89                 /*
90                  * OSC is kinda special, lo_address is a void* and lo_send() has varags
91                  * and typed arguments which makes it hard to bind, even lo_cpp.
92                  */
93                 public:
94                         /** Construct a new OSC transmitter object
95                          * @param uri the destination uri e.g. "osc.udp://localhost:7890"
96                          */
97                         Address (std::string uri) {
98                                 _addr = lo_address_new_from_url (uri.c_str());
99                         }
100
101                         ~Address () { if (_addr) { lo_address_free (_addr); } }
102                         /** Transmit an OSC message
103                          *
104                          * Path (string) and type (string) must always be given.
105                          * The number of following args must match the type.
106                          * Supported types are:
107                          *
108                          *  'i': integer (lua number)
109                          *
110                          *  'f': float (lua number)
111                          *
112                          *  'd': double (lua number)
113                          *
114                          *  'h': 64bit integer (lua number)
115                          *
116                          *  's': string (lua string)
117                          *
118                          *  'c': character (lua string)
119                          *
120                          *  'T': boolean (lua bool) -- this is not implicily True, a lua true/false must be given
121                          *
122                          *  'F': boolean (lua bool) -- this is not implicily False, a lua true/false must be given
123                          *
124                          * @param lua: lua arguments: path, types, ...
125                          * @returns boolean true if successful, false on error.
126                          */
127                         int send (lua_State *lua);
128                 private:
129                         lo_address _addr;
130         };
131
132 } } /* namespace */
133
134 #endif // _ardour_lua_api_h_