1 /*
2  * Copyright (C) 2016-2017 Nick Mainsbridge <mainsbridge@gmail.com>
3  * Copyright (C) 2016-2017 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2016-2019 Johannes Mueller <github@johannes-mueller.org>
5  * Copyright (C) 2016-2019 Robin Gareus <robin@gareus.org>
6  * Copyright (C) 2017-2018 Ben Loftis <ben@harrisonconsoles.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #include <glibmm.h>
24 
25 #include "pbd/stateful_diff_command.h"
26 #include "pbd/openuri.h"
27 
28 #include "temporal/bbt_time.h"
29 
30 #include "evoral/Control.h"
31 #include "evoral/ControlList.h"
32 #include "evoral/Range.h"
33 
34 #include "ardour/amp.h"
35 #include "ardour/async_midi_port.h"
36 #include "ardour/audioengine.h"
37 #include "ardour/audioregion.h"
38 #include "ardour/audiosource.h"
39 #include "ardour/audio_backend.h"
40 #include "ardour/audio_buffer.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audio_track.h"
43 #include "ardour/audioplaylist.h"
44 #include "ardour/audiorom.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/bundle.h"
47 #include "ardour/beats_samples_converter.h"
48 #include "ardour/chan_mapping.h"
49 #include "ardour/convolver.h"
50 #include "ardour/dB.h"
51 #include "ardour/delayline.h"
52 #include "ardour/disk_reader.h"
53 #include "ardour/disk_writer.h"
54 #include "ardour/dsp_filter.h"
55 #include "ardour/file_source.h"
56 #include "ardour/filesystem_paths.h"
57 #include "ardour/fluid_synth.h"
58 #include "ardour/internal_send.h"
59 #include "ardour/internal_return.h"
60 #include "ardour/interthread_info.h"
61 #include "ardour/ltc_file_reader.h"
62 #include "ardour/lua_api.h"
63 #include "ardour/luabindings.h"
64 #include "ardour/luaproc.h"
65 #include "ardour/meter.h"
66 #include "ardour/midi_model.h"
67 #include "ardour/midi_track.h"
68 #include "ardour/midi_playlist.h"
69 #include "ardour/midi_port.h"
70 #include "ardour/midi_region.h"
71 #include "ardour/midi_source.h"
72 #include "ardour/monitor_control.h"
73 #include "ardour/panner_shell.h"
74 #include "ardour/phase_control.h"
75 #include "ardour/playlist.h"
76 #include "ardour/plugin.h"
77 #include "ardour/plugin_insert.h"
78 #include "ardour/plugin_manager.h"
79 #include "ardour/polarity_processor.h"
80 #include "ardour/port_manager.h"
81 #include "ardour/progress.h"
82 #include "ardour/raw_midi_parser.h"
83 #include "ardour/runtime_functions.h"
84 #include "ardour/region.h"
85 #include "ardour/region_factory.h"
86 #include "ardour/return.h"
87 #include "ardour/revision.h"
88 #include "ardour/route_group.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_object.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/sidechain.h"
94 #include "ardour/solo_isolate_control.h"
95 #include "ardour/solo_safe_control.h"
96 #include "ardour/stripable.h"
97 #include "ardour/track.h"
98 #include "ardour/tempo.h"
99 #include "ardour/user_bundle.h"
100 #include "ardour/vca.h"
101 #include "ardour/vca_manager.h"
102 
103 #include "LuaBridge/LuaBridge.h"
104 
105 #ifdef PLATFORM_WINDOWS
106 /* luabridge uses addresses of static functions/variables to identify classes.
107  *
108  * Static symbols on windows (even identical symbols) are not
109  * mapped to the same address when mixing .dll + .exe.
110  * So we need a single point to define those static functions.
111  * (normally they're header-only in libs/lua/LuaBridge/detail/ClassInfo.h)
112  *
113  * Really!! A static function with a static variable in a library header
114  * should never ever be replicated, even if it is a template.
115  * But then again this is windows... what else can go wrong ?!
116  */
117 
118 template <class T>
119 void const*
getStaticKey()120 luabridge::ClassInfo<T>::getStaticKey ()
121 {
122 	static char value;
123 	return &value;
124 }
125 
126 template <class T>
127 void const*
getClassKey()128 luabridge::ClassInfo<T>::getClassKey ()
129 {
130 	static char value;
131 	return &value;
132 }
133 
134 template <class T>
135 void const*
getConstKey()136 luabridge::ClassInfo<T>::getConstKey ()
137 {
138 	static char value;
139 	return &value;
140 }
141 
142 void*
getIdentityKey()143 luabridge::getIdentityKey ()
144 {
145   static char value;
146   return &value;
147 }
148 
149 /* ...and this is the ugly part of it.
150  *
151  * We need to foward declare classes from gtk2_ardour
152  * AND explicily list classes which are used by gtk2_ardour's bindings.
153  *
154  * This is required because some of the GUI classes use objects from libardour
155  * as function parameters or return values and the .exe would re-create
156  * symbols for libardour objects.
157  */
158 
159 #define CLASSKEYS(CLS) \
160 	template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
161 	template void const* luabridge::ClassInfo< CLS >::getClassKey();  \
162 	template void const* luabridge::ClassInfo< CLS >::getConstKey();
163 
164 #define CLASSINFO(CLS) \
165 	class CLS; \
166 	template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
167 	template void const* luabridge::ClassInfo< CLS >::getClassKey();  \
168 	template void const* luabridge::ClassInfo< CLS >::getConstKey();
169 
170 CLASSINFO(ArdourMarker);
171 CLASSINFO(AxisView);
172 CLASSINFO(MarkerSelection);
173 CLASSINFO(PublicEditor);
174 CLASSINFO(RegionSelection);
175 CLASSINFO(RegionView);
176 CLASSINFO(StripableTimeAxisView);
177 CLASSINFO(RouteTimeAxisView);
178 CLASSINFO(RouteUI);
179 CLASSINFO(Selectable);
180 CLASSINFO(Selection);
181 CLASSINFO(TimeAxisView);
182 CLASSINFO(TimeAxisViewItem);
183 CLASSINFO(TimeSelection);
184 CLASSINFO(TrackSelection);
185 CLASSINFO(TrackViewList);
186 CLASSINFO(UIConfiguration);
187 
188 
189 /* this needs to match gtk2_ardour/luasignal.h */
190 CLASSKEYS(std::bitset<49ul>); // LuaSignal::LAST_SIGNAL
191 
192 CLASSKEYS(void);
193 CLASSKEYS(float);
194 CLASSKEYS(double);
195 CLASSKEYS(unsigned char);
196 
197 CLASSKEYS(ArdourMarker*);
198 CLASSKEYS(Selectable*);
199 CLASSKEYS(std::list<Selectable*>);
200 
201 CLASSKEYS(ARDOUR::AudioEngine);
202 CLASSKEYS(ARDOUR::BeatsSamplesConverter);
203 CLASSKEYS(ARDOUR::DoubleBeatsSamplesConverter);
204 CLASSKEYS(ARDOUR::BufferSet);
205 CLASSKEYS(ARDOUR::ChanCount);
206 CLASSKEYS(ARDOUR::ChanMapping);
207 CLASSKEYS(ARDOUR::DSP::DspShm);
208 CLASSKEYS(ARDOUR::DataType);
209 CLASSKEYS(ARDOUR::FluidSynth);
210 CLASSKEYS(ARDOUR::InternalSend);
211 CLASSKEYS(ARDOUR::Latent);
212 CLASSKEYS(ARDOUR::Location);
213 CLASSKEYS(ARDOUR::LuaAPI::Vamp);
214 CLASSKEYS(ARDOUR::LuaOSC::Address);
215 CLASSKEYS(ARDOUR::LuaProc);
216 CLASSKEYS(ARDOUR::LuaTableRef);
217 CLASSKEYS(ARDOUR::MidiModel::NoteDiffCommand);
218 CLASSKEYS(ARDOUR::MonitorProcessor);
219 CLASSKEYS(ARDOUR::RouteGroup);
220 CLASSKEYS(ARDOUR::ParameterDescriptor);
221 CLASSKEYS(ARDOUR::PeakMeter);
222 CLASSKEYS(ARDOUR::PluginInfo);
223 CLASSKEYS(ARDOUR::Plugin::PresetRecord);
224 CLASSKEYS(ARDOUR::PortEngine);
225 CLASSKEYS(ARDOUR::PortManager);
226 CLASSKEYS(ARDOUR::PresentationInfo);
227 CLASSKEYS(ARDOUR::RCConfiguration);
228 CLASSKEYS(ARDOUR::Session);
229 CLASSKEYS(ARDOUR::SessionConfiguration);
230 CLASSKEYS(ARDOUR::Slavable);
231 CLASSKEYS(ARDOUR::Source);
232 CLASSKEYS(ARDOUR::VCA);
233 CLASSKEYS(ARDOUR::VCAManager);
234 
235 CLASSKEYS(PBD::ID);
236 CLASSKEYS(PBD::Configuration);
237 CLASSKEYS(PBD::PropertyChange);
238 CLASSKEYS(PBD::StatefulDestructible);
239 
240 CLASSKEYS(Temporal::Beats);
241 CLASSKEYS(Evoral::Event<samplepos_t>);
242 CLASSKEYS(Evoral::ControlEvent);
243 
244 
245 CLASSKEYS(std::vector<std::string>);
246 CLASSKEYS(std::vector<uint8_t>);
247 CLASSKEYS(std::vector<float>);
248 CLASSKEYS(std::vector<float*>);
249 CLASSKEYS(std::vector<double>);
250 CLASSKEYS(std::list<int64_t>);
251 CLASSKEYS(std::vector<samplepos_t>);
252 
253 CLASSKEYS(std::list<Evoral::ControlEvent*>);
254 
255 CLASSKEYS(std::vector<ARDOUR::Plugin::PresetRecord>);
256 CLASSKEYS(std::vector<boost::shared_ptr<ARDOUR::Processor> >);
257 CLASSKEYS(std::vector<boost::shared_ptr<ARDOUR::Source> >);
258 CLASSKEYS(std::vector<boost::shared_ptr<ARDOUR::Readable> >);
259 CLASSKEYS(std::vector<Evoral::Parameter>);
260 CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::PluginInfo> >); // PluginInfoList
261 
262 CLASSKEYS(std::list<ArdourMarker*>);
263 CLASSKEYS(std::list<TimeAxisView*>);
264 CLASSKEYS(std::list<ARDOUR::AudioRange>);
265 CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Port> >);
266 CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Region> >);
267 CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Route> >);
268 CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Stripable> >);
269 CLASSKEYS(boost::shared_ptr<std::list<boost::shared_ptr<ARDOUR::Route> > >);
270 CLASSKEYS(boost::shared_ptr<std::vector<boost::shared_ptr<ARDOUR::Bundle> > >);
271 
272 CLASSKEYS(boost::shared_ptr<ARDOUR::AudioRegion>);
273 CLASSKEYS(boost::shared_ptr<ARDOUR::AudioRom>);
274 CLASSKEYS(boost::shared_ptr<ARDOUR::AudioSource>);
275 CLASSKEYS(boost::shared_ptr<ARDOUR::Automatable>);
276 CLASSKEYS(boost::shared_ptr<ARDOUR::AutomatableSequence<Temporal::Beats> >);
277 CLASSKEYS(boost::shared_ptr<ARDOUR::AutomationList>);
278 CLASSKEYS(boost::shared_ptr<ARDOUR::FileSource>);
279 CLASSKEYS(boost::shared_ptr<ARDOUR::MidiModel>);
280 CLASSKEYS(boost::shared_ptr<ARDOUR::MidiPlaylist>);
281 CLASSKEYS(boost::shared_ptr<ARDOUR::MidiRegion>);
282 CLASSKEYS(boost::shared_ptr<ARDOUR::MidiSource>);
283 CLASSKEYS(boost::shared_ptr<ARDOUR::PluginInfo>);
284 CLASSKEYS(boost::shared_ptr<ARDOUR::Processor>);
285 CLASSKEYS(boost::shared_ptr<ARDOUR::Readable>);
286 CLASSKEYS(boost::shared_ptr<ARDOUR::Region>);
287 CLASSKEYS(boost::shared_ptr<ARDOUR::SessionPlaylists>);
288 CLASSKEYS(boost::shared_ptr<Evoral::ControlList>);
289 CLASSKEYS(boost::shared_ptr<Evoral::Note<Temporal::Beats> >);
290 CLASSKEYS(boost::shared_ptr<Evoral::Sequence<Temporal::Beats> >);
291 
292 CLASSKEYS(boost::shared_ptr<ARDOUR::Playlist>);
293 CLASSKEYS(boost::shared_ptr<ARDOUR::Bundle>);
294 CLASSKEYS(boost::shared_ptr<ARDOUR::Route>);
295 CLASSKEYS(boost::shared_ptr<ARDOUR::VCA>);
296 CLASSKEYS(boost::weak_ptr<ARDOUR::Bundle>);
297 CLASSKEYS(boost::weak_ptr<ARDOUR::Route>);
298 CLASSKEYS(boost::weak_ptr<ARDOUR::VCA>);
299 
300 CLASSKEYS(boost::shared_ptr<ARDOUR::RegionList>);
301 
302 CLASSKEYS(Vamp::RealTime);
303 CLASSKEYS(Vamp::PluginBase);
304 CLASSKEYS(Vamp::PluginBase::ParameterDescriptor);
305 CLASSKEYS(Vamp::Plugin);
306 CLASSKEYS(Vamp::Plugin::OutputDescriptor);
307 CLASSKEYS(Vamp::Plugin::Feature);
308 CLASSKEYS(Vamp::Plugin::OutputList);
309 CLASSKEYS(Vamp::Plugin::FeatureList);
310 CLASSKEYS(Vamp::Plugin::FeatureSet);
311 
312 namespace LuaCairo {
313 	class ImageSurface;
314 	class PangoLayout;
315 }
316 
317 namespace LuaDialog {
318 	class Message;
319 	class Dialog;
320 	class ProgressWindow;
321 }
322 
323 namespace Cairo {
324 	class Context;
325 }
326 
327 CLASSKEYS(Cairo::Context);
328 CLASSKEYS(LuaCairo::ImageSurface);
329 CLASSKEYS(LuaCairo::PangoLayout);
330 
331 CLASSKEYS(LuaDialog::Message);
332 CLASSKEYS(LuaDialog::Dialog);
333 CLASSKEYS(LuaDialog::ProgressWindow);
334 
335 #endif // end windows special case
336 
337 /* Some notes on Lua bindings for libardour and friends
338  *
339  * - Prefer factory methods over Contructors whenever possible.
340  *   Don't expose the constructor method unless required.
341  *
342  *   e.g. Don't allow the script to construct a "Track" Object directly
343  *   but do allow to create a "BBT_TIME" object.
344  *
345  * - Do not dereference Shared or Weak Pointers. Pass the pointer to Lua.
346  * - Define Objects as boost:shared_ptr Object whenever possible.
347  *
348  *   Storing a boost::shared_ptr in a Lua-variable keeps the reference
349  *   until that variable is set to 'nil'.
350  *   (if the script were to keep a direct pointer to the object instance, the
351  *   behaviour is undefined if the actual object goes away)
352  *
353  *   Methods of the actual class are indirectly exposed,
354  *   boost::*_ptr get() and ::lock() is implicit when the class is exported
355  *   as LuaBridge's "WSPtrClass".
356  */
357 
358 using namespace ARDOUR;
359 
360 /** Access libardour global configuration */
_libardour_config()361 static RCConfiguration* _libardour_config () {
362 	return ARDOUR::Config;
363 }
364 
365 void
stddef(lua_State * L)366 LuaBindings::stddef (lua_State* L)
367 {
368 	// std::list<std::string>
369 	luabridge::getGlobalNamespace (L)
370 		.beginNamespace ("C")
371 		.beginStdList <std::string> ("StringList")
372 		.endClass ()
373 
374 		.beginStdVector <std::string> ("StringVector")
375 		.endClass ()
376 
377 		.beginStdVector <float> ("FloatVector")
378 		.endClass ()
379 
380 		.beginStdVector <uint8_t> ("ByteVector")
381 		.endClass ()
382 
383 		.beginStdVector <float*> ("FloatArrayVector")
384 		.endClass ()
385 
386 		.registerArray <uint8_t> ("ByteArray")
387 		.registerArray <float> ("FloatArray")
388 		.registerArray <int32_t> ("IntArray")
389 
390 		// samplepos_t, sampleoffset_t lists e.g. AnalysisFeatureList
391 		.beginStdList <int64_t> ("Int64List")
392 		.endClass ()
393 
394 		// TODO std::set
395 		.endNamespace ();
396 }
397 
398 void
common(lua_State * L)399 LuaBindings::common (lua_State* L)
400 {
401 	luabridge::getGlobalNamespace (L)
402 		.beginNamespace ("PBD")
403 
404 		.addFunction ("open_uri", (bool (*) (const std::string&))&PBD::open_uri)
405 		.addFunction ("open_uri", &PBD::open_folder)
406 
407 		.beginClass <PBD::ID> ("ID")
408 		.addConstructor <void (*) (std::string)> ()
409 		.addFunction ("to_s", &PBD::ID::to_s) // TODO special case LUA __tostring ?
410 		.endClass ()
411 
412 		.beginStdVector <PBD::ID> ("IdVector").endClass ()
413 
414 		.beginClass <XMLNode> ("XMLNode")
415 		.addFunction ("name", &XMLNode::name)
416 		.endClass ()
417 
418 		.beginClass <PBD::Stateful> ("Stateful")
419 		.addFunction ("id", &PBD::Stateful::id)
420 		.addFunction ("properties", &PBD::Stateful::properties)
421 		.addFunction ("clear_changes", &PBD::Stateful::clear_changes)
422 		.endClass ()
423 
424 		.beginWSPtrClass <PBD::Stateful> ("StatefulPtr")
425 		.addFunction ("id", &PBD::Stateful::id)
426 		.addFunction ("properties", &PBD::Stateful::properties)
427 		.addFunction ("clear_changes", &PBD::Stateful::clear_changes)
428 		.endClass ()
429 
430 		.deriveClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructible")
431 		.endClass ()
432 
433 		.deriveClass <PBD::Configuration, PBD::Stateful> ("Configuration")
434 		.endClass()
435 
436 		.deriveWSPtrClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructiblePtr")
437 		.endClass ()
438 
439 		.deriveClass <Command, PBD::StatefulDestructible> ("Command")
440 		.addFunction ("set_name", &Command::set_name)
441 		.addFunction ("name", &Command::name)
442 		.endClass ()
443 
444 		/* UndoTransaction::add_command() subscribes to DropReferences()
445 		 * and deletes the object.
446 		 *
447 		 * This object cannot be constructed by lua because lua would manage lifetime
448 		 * and delete the object leading to a double free.
449 		 *
450 		 * use Session::add_stateful_diff_command()
451 		 * and Session::abort_reversible_command()
452 		 */
453 		.deriveClass <PBD::StatefulDiffCommand, Command> ("StatefulDiffCommand")
454 		.addFunction ("undo", &PBD::StatefulDiffCommand::undo)
455 		.addFunction ("empty", &PBD::StatefulDiffCommand::empty)
456 		.endClass ()
457 
458 		.deriveWSPtrClass <PBD::Controllable, PBD::StatefulDestructible> ("Controllable")
459 		.addFunction ("name", &PBD::Controllable::name)
460 		.addFunction ("get_value", &PBD::Controllable::get_value)
461 		.endClass ()
462 
463 		.beginClass <PBD::RingBufferNPT <uint8_t> > ("RingBuffer8")
464 		.addConstructor <void (*) (size_t)> ()
465 		.addFunction ("reset", &PBD::RingBufferNPT<uint8_t>::reset)
466 		.addFunction ("read", &PBD::RingBufferNPT<uint8_t>::read)
467 		.addFunction ("write", &PBD::RingBufferNPT<uint8_t>::write)
468 		.addFunction ("write_one", &PBD::RingBufferNPT<uint8_t>::write_one)
469 		.addFunction ("write_space", &PBD::RingBufferNPT<uint8_t>::write_space)
470 		.addFunction ("read_space", &PBD::RingBufferNPT<uint8_t>::read_space)
471 		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<uint8_t>::increment_read_ptr)
472 		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<uint8_t>::increment_write_ptr)
473 		.endClass ()
474 
475 		.beginClass <PBD::RingBufferNPT <float> > ("RingBufferF")
476 		.addConstructor <void (*) (size_t)> ()
477 		.addFunction ("reset", &PBD::RingBufferNPT<float>::reset)
478 		.addFunction ("read", &PBD::RingBufferNPT<float>::read)
479 		.addFunction ("write", &PBD::RingBufferNPT<float>::write)
480 		.addFunction ("write_one", &PBD::RingBufferNPT<float>::write_one)
481 		.addFunction ("write_space", &PBD::RingBufferNPT<float>::write_space)
482 		.addFunction ("read_space", &PBD::RingBufferNPT<float>::read_space)
483 		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<float>::increment_read_ptr)
484 		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<float>::increment_write_ptr)
485 		.endClass ()
486 
487 		.beginClass <PBD::RingBufferNPT <int> > ("RingBufferI")
488 		.addConstructor <void (*) (size_t)> ()
489 		.addFunction ("reset", &PBD::RingBufferNPT<int>::reset)
490 		.addFunction ("read", &PBD::RingBufferNPT<int>::read)
491 		.addFunction ("write", &PBD::RingBufferNPT<int>::write)
492 		.addFunction ("write_one", &PBD::RingBufferNPT<int>::write_one)
493 		.addFunction ("write_space", &PBD::RingBufferNPT<int>::write_space)
494 		.addFunction ("read_space", &PBD::RingBufferNPT<int>::read_space)
495 		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<int>::increment_read_ptr)
496 		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<int>::increment_write_ptr)
497 		.endClass ()
498 
499 		/* PBD enums */
500 		.beginNamespace ("GroupControlDisposition")
501 		.addConst ("InverseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::InverseGroup))
502 		.addConst ("NoGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::NoGroup))
503 		.addConst ("UseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::UseGroup))
504 		.endNamespace ()
505 
506 		.endNamespace (); // PBD
507 
508 	luabridge::getGlobalNamespace (L)
509 		.beginNamespace ("Timecode")
510 		.beginClass <Timecode::BBT_Time> ("BBT_TIME")
511 		.addConstructor <void (*) (uint32_t, uint32_t, uint32_t)> ()
512 		.addData ("bars", &Timecode::BBT_Time::bars)
513 		.addData ("beats", &Timecode::BBT_Time::beats)
514 		.addData ("ticks", &Timecode::BBT_Time::ticks)
515 		//.addStaticData ("ticks_per_beat", &Timecode::BBT_Time::ticks_per_beat, false)
516 		.endClass ()
517 
518 		.beginClass <Timecode::Time> ("Time")
519 		.addConstructor <void (*) (double)> ()
520 		.addData ("negative", &Timecode::Time::negative)
521 		.addData ("hours", &Timecode::Time::hours)
522 		.addData ("minutes", &Timecode::Time::minutes)
523 		.addData ("seconds", &Timecode::Time::seconds)
524 		.addData ("frames", &Timecode::Time::frames)
525 		.addData ("subframes", &Timecode::Time::subframes)
526 		.addData ("rate", &Timecode::Time::rate)
527 		.addData ("drop", &Timecode::Time::drop)
528 		.endClass ()
529 
530 		// TODO add increment, decrement; push it into the class
531 
532 		/* libtimecode enums */
533 		.beginNamespace ("TimecodeFormat")
534 		.addConst ("TC23976", Timecode::TimecodeFormat(Timecode::timecode_23976))
535 		.addConst ("TC24", Timecode::TimecodeFormat(Timecode::timecode_24))
536 		.addConst ("TC24976", Timecode::TimecodeFormat(Timecode::timecode_24976))
537 		.addConst ("TC25", Timecode::TimecodeFormat(Timecode::timecode_25))
538 		.addConst ("TC2997", Timecode::TimecodeFormat(Timecode::timecode_2997))
539 		.addConst ("TC2997DF", Timecode::TimecodeFormat(Timecode::timecode_2997drop))
540 		.addConst ("TC2997000", Timecode::TimecodeFormat(Timecode::timecode_2997000))
541 		.addConst ("TC2997000DF", Timecode::TimecodeFormat(Timecode::timecode_2997000drop))
542 		.addConst ("TC30", Timecode::TimecodeFormat(Timecode::timecode_30))
543 		.addConst ("TC5994", Timecode::TimecodeFormat(Timecode::timecode_5994))
544 		.addConst ("TC60", Timecode::TimecodeFormat(Timecode::timecode_60))
545 		.endNamespace ()
546 		.endNamespace ();
547 
548 	luabridge::getGlobalNamespace (L)
549 
550 		.beginNamespace ("Evoral")
551 		.beginClass <Evoral::Event<samplepos_t> > ("Event")
552 		.addFunction ("clear", &Evoral::Event<samplepos_t>::clear)
553 		.addFunction ("size", &Evoral::Event<samplepos_t>::size)
554 		.addFunction ("set_buffer", &Evoral::Event<samplepos_t>::set_buffer)
555 		.addFunction ("buffer", (uint8_t*(Evoral::Event<samplepos_t>::*)())&Evoral::Event<samplepos_t>::buffer)
556 		.addFunction ("time", (samplepos_t (Evoral::Event<samplepos_t>::*)())&Evoral::Event<samplepos_t>::time)
557 		.endClass ()
558 
559 		.beginClass <Temporal::Beats> ("Beats")
560 		.addConstructor <void (*) (double)> ()
561 		.addFunction ("to_double", &Temporal::Beats::to_double)
562 		.endClass ()
563 
564 		.beginClass <Evoral::Parameter> ("Parameter")
565 		.addConstructor <void (*) (uint32_t, uint8_t, uint32_t)> ()
566 		.addFunction ("type", &Evoral::Parameter::type)
567 		.addFunction ("channel", &Evoral::Parameter::channel)
568 		.addFunction ("id", &Evoral::Parameter::id)
569 		.endClass ()
570 
571 		.beginClass <Evoral::ControlEvent> ("ControlEvent")
572 		.addData ("when", &Evoral::ControlEvent::when)
573 		.addData ("value", &Evoral::ControlEvent::value)
574 		.endClass ()
575 
576 		.beginWSPtrClass <Evoral::ControlList> ("ControlList")
577 		.addCast<AutomationList> ("to_automationlist")
578 		.addFunction ("add", &Evoral::ControlList::add)
579 		.addFunction ("editor_add", &Evoral::ControlList::editor_add)
580 		.addFunction ("thin", &Evoral::ControlList::thin)
581 		.addFunction ("eval", &Evoral::ControlList::eval)
582 		.addRefFunction ("rt_safe_eval", &Evoral::ControlList::rt_safe_eval)
583 		.addFunction ("interpolation", &Evoral::ControlList::interpolation)
584 		.addFunction ("set_interpolation", &Evoral::ControlList::set_interpolation)
585 		.addFunction ("truncate_end", &Evoral::ControlList::truncate_end)
586 		.addFunction ("truncate_start", &Evoral::ControlList::truncate_start)
587 		.addFunction ("clear", (void (Evoral::ControlList::*)(double, double))&Evoral::ControlList::clear)
588 		.addFunction ("clear_list", (void (Evoral::ControlList::*)())&Evoral::ControlList::clear)
589 		.addFunction ("in_write_pass", &Evoral::ControlList::in_write_pass)
590 		.addFunction ("events", &Evoral::ControlList::events)
591 		.addFunction ("size", &Evoral::ControlList::size)
592 		.endClass ()
593 
594 		.beginWSPtrClass <Evoral::ControlSet> ("ControlSet")
595 		.endClass ()
596 
597 		.beginWSPtrClass <Evoral::Control> ("Control")
598 		.addFunction ("list", (boost::shared_ptr<Evoral::ControlList>(Evoral::Control::*)())&Evoral::Control::list)
599 		.endClass ()
600 
601 		.beginClass <Evoral::ParameterDescriptor> ("ParameterDescriptor")
602 		.addVoidConstructor ()
603 		.addData ("lower", &Evoral::ParameterDescriptor::lower)
604 		.addData ("upper", &Evoral::ParameterDescriptor::upper)
605 		.addData ("normal", &Evoral::ParameterDescriptor::normal)
606 		.addData ("toggled", &Evoral::ParameterDescriptor::toggled)
607 		.addData ("logarithmic", &Evoral::ParameterDescriptor::logarithmic)
608 		.endClass ()
609 
610 		.beginClass <Evoral::Range<samplepos_t> > ("Range")
611 		.addConstructor <void (*) (samplepos_t, samplepos_t)> ()
612 		.addData ("from", &Evoral::Range<samplepos_t>::from)
613 		.addData ("to", &Evoral::Range<samplepos_t>::to)
614 		.endClass ()
615 
616 		.deriveWSPtrClass <Evoral::Sequence<Temporal::Beats>, Evoral::ControlSet> ("Sequence")
617 		.endClass ()
618 
619 		.beginWSPtrClass <Evoral::Note<Temporal::Beats> > ("NotePtr")
620 		.addFunction ("time", &Evoral::Note<Temporal::Beats>::time)
621 		.addFunction ("note", &Evoral::Note<Temporal::Beats>::note)
622 		.addFunction ("velocity", &Evoral::Note<Temporal::Beats>::velocity)
623 		.addFunction ("off_velocity", &Evoral::Note<Temporal::Beats>::off_velocity)
624 		.addFunction ("length", &Evoral::Note<Temporal::Beats>::length)
625 		.addFunction ("channel", &Evoral::Note<Temporal::Beats>::channel)
626 		.endClass ()
627 
628 		/* libevoral enums */
629 		.beginNamespace ("InterpolationStyle")
630 		.addConst ("Discrete", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Discrete))
631 		.addConst ("Linear", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Linear))
632 		.addConst ("Curved", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Curved))
633 		.endNamespace ()
634 
635 		.beginNamespace ("EventType")
636 		.addConst ("NO_EVENT", Evoral::EventType(Evoral::NO_EVENT))
637 		.addConst ("MIDI_EVENT", Evoral::EventType(Evoral::MIDI_EVENT))
638 		.addConst ("LIVE_MIDI_EVENT", Evoral::EventType(Evoral::LIVE_MIDI_EVENT))
639 		.endNamespace ()
640 
641 		.endNamespace (); // Evoral
642 
643 	luabridge::getGlobalNamespace (L)
644 		.beginNamespace ("Vamp")
645 
646 		.beginClass<Vamp::RealTime> ("RealTime")
647 		.addConstructor <void (*) (int, int)> ()
648 		.addData ("sec", &Vamp::RealTime::sec, false)
649 		.addData ("nsec", &Vamp::RealTime::nsec, false)
650 		.addFunction ("usec", &Vamp::RealTime::usec)
651 		.addFunction ("msec", &Vamp::RealTime::msec)
652 		.addFunction ("toString", &Vamp::RealTime::toString)
653 		.addStaticFunction ("realTime2Frame", &Vamp::RealTime::realTime2Frame)
654 		.addStaticFunction ("frame2RealTime", &Vamp::RealTime::frame2RealTime)
655 		.endClass ()
656 
657 		.beginClass<Vamp::PluginBase> ("PluginBase")
658 		.addFunction ("getIdentifier", &Vamp::PluginBase::getIdentifier)
659 		.addFunction ("getName", &Vamp::PluginBase::getName)
660 		.addFunction ("getDescription", &Vamp::PluginBase::getDescription)
661 		.addFunction ("getMaker", &Vamp::PluginBase::getMaker)
662 		.addFunction ("getCopyright", &Vamp::PluginBase::getCopyright)
663 		.addFunction ("getPluginVersion", &Vamp::PluginBase::getPluginVersion)
664 		.addFunction ("getParameterDescriptors", &Vamp::PluginBase::getParameterDescriptors)
665 		.addFunction ("getParameter", &Vamp::PluginBase::getParameter)
666 		.addFunction ("setParameter", &Vamp::PluginBase::setParameter)
667 		.addFunction ("getPrograms", &Vamp::PluginBase::getPrograms)
668 		.addFunction ("getCurrentProgram", &Vamp::PluginBase::getCurrentProgram)
669 		.addFunction ("selectProgram", &Vamp::PluginBase::selectProgram)
670 		.addFunction ("getType", &Vamp::PluginBase::getType)
671 		.endClass ()
672 
673 		.beginNamespace ("PluginBase")
674 		.beginClass<Vamp::PluginBase::ParameterDescriptor> ("ParameterDescriptor")
675 		.addData ("identifier", &Vamp::PluginBase::ParameterDescriptor::identifier)
676 		.addData ("name", &Vamp::PluginBase::ParameterDescriptor::name)
677 		.addData ("description", &Vamp::PluginBase::ParameterDescriptor::description)
678 		.addData ("unit", &Vamp::PluginBase::ParameterDescriptor::unit)
679 		.addData ("minValue", &Vamp::PluginBase::ParameterDescriptor::minValue)
680 		.addData ("maxValue", &Vamp::PluginBase::ParameterDescriptor::maxValue)
681 		.addData ("defaultValue", &Vamp::PluginBase::ParameterDescriptor::defaultValue)
682 		.addData ("isQuantized", &Vamp::PluginBase::ParameterDescriptor::isQuantized)
683 		.addData ("quantizeStep", &Vamp::PluginBase::ParameterDescriptor::quantizeStep)
684 		.addData ("valueNames", &Vamp::PluginBase::ParameterDescriptor::valueNames)
685 		.endClass ()
686 
687 		.beginStdVector <Vamp::PluginBase::ParameterDescriptor> ("ParameterList")
688 		.endClass ()
689 		.endNamespace () // Vamp::PluginBase
690 
691 		.deriveClass<Vamp::Plugin, Vamp::PluginBase> ("Plugin")
692 		//.addFunction ("process", &Vamp::Plugin::process) // unusable due to  float*const* -> LuaAPI::Vamp::process
693 		.addFunction ("initialise", &Vamp::Plugin::initialise)
694 		.addFunction ("reset", &Vamp::Plugin::reset)
695 		.addFunction ("getInputDomain", &Vamp::Plugin::getInputDomain)
696 		.addFunction ("getPreferredBlockSize", &Vamp::Plugin::getPreferredBlockSize)
697 		.addFunction ("getPreferredStepSize", &Vamp::Plugin::getPreferredStepSize)
698 		.addFunction ("getMinChannelCount", &Vamp::Plugin::getMinChannelCount)
699 		.addFunction ("getMaxChannelCount", &Vamp::Plugin::getMaxChannelCount)
700 		.addFunction ("getOutputDescriptors", &Vamp::Plugin::getOutputDescriptors)
701 		.addFunction ("getRemainingFeatures", &Vamp::Plugin::getRemainingFeatures)
702 		.addFunction ("getType", &Vamp::Plugin::getType)
703 		.endClass ()
704 
705 		.beginNamespace ("Plugin")
706 		.beginClass<Vamp::Plugin::OutputDescriptor> ("OutputDescriptor")
707 		.addData ("identifier", &Vamp::Plugin::OutputDescriptor::identifier)
708 		.addData ("description", &Vamp::Plugin::OutputDescriptor::description)
709 		.addData ("unit", &Vamp::Plugin::OutputDescriptor::unit)
710 		.addData ("hasFixedBinCount", &Vamp::Plugin::OutputDescriptor::hasFixedBinCount)
711 		.addData ("binCount", &Vamp::Plugin::OutputDescriptor::binCount)
712 		.addData ("binNames", &Vamp::Plugin::OutputDescriptor::binNames)
713 		.addData ("hasKnownExtents", &Vamp::Plugin::OutputDescriptor::hasKnownExtents)
714 		.addData ("minValue", &Vamp::Plugin::OutputDescriptor::minValue)
715 		.addData ("maxValue", &Vamp::Plugin::OutputDescriptor::maxValue)
716 		.addData ("isQuantized", &Vamp::Plugin::OutputDescriptor::isQuantized)
717 		.addData ("quantizeStep", &Vamp::Plugin::OutputDescriptor::quantizeStep)
718 		.addData ("sampleType", &Vamp::Plugin::OutputDescriptor::sampleType)
719 		.addData ("sampleRate", &Vamp::Plugin::OutputDescriptor::sampleRate)
720 		.addData ("hasDuration", &Vamp::Plugin::OutputDescriptor::hasDuration)
721 		.endClass ()
722 
723 		/* Vamp::Plugin enums */
724 		.beginNamespace ("InputDomain")
725 		.addConst ("TimeDomain", Vamp::Plugin::InputDomain(Vamp::Plugin::TimeDomain))
726 		.addConst ("FrequencyDomain", Vamp::Plugin::InputDomain(Vamp::Plugin::FrequencyDomain))
727 		.endNamespace ()
728 
729 		/* Vamp::Plugin::OutputDescriptor enum */
730 		.beginNamespace ("OutputDescriptor")
731 		.beginNamespace ("SampleType")
732 		.addConst ("OneSamplePerStep", Vamp::Plugin::OutputDescriptor::SampleType(Vamp::Plugin::OutputDescriptor::OneSamplePerStep))
733 		.addConst ("FixedSampleRate", Vamp::Plugin::OutputDescriptor::SampleType(Vamp::Plugin::OutputDescriptor::FixedSampleRate))
734 		.addConst ("VariableSampleRate", Vamp::Plugin::OutputDescriptor::SampleType(Vamp::Plugin::OutputDescriptor::VariableSampleRate))
735 		.endNamespace ()
736 		.endNamespace () /* Vamp::Plugin::OutputDescriptor */
737 
738 		.beginClass<Vamp::Plugin::Feature> ("Feature")
739 		.addData ("hasTimestamp", &Vamp::Plugin::Feature::hasTimestamp, false)
740 		.addData ("timestamp", &Vamp::Plugin::Feature::timestamp, false)
741 		.addData ("hasDuration", &Vamp::Plugin::Feature::hasDuration, false)
742 		.addData ("duration", &Vamp::Plugin::Feature::duration, false)
743 		.addData ("values", &Vamp::Plugin::Feature::values, false)
744 		.addData ("label", &Vamp::Plugin::Feature::label, false)
745 		.endClass ()
746 
747 		.beginStdVector <Vamp::Plugin::OutputDescriptor> ("OutputList")
748 		.endClass ()
749 
750 		.beginStdVector <Vamp::Plugin::Feature> ("FeatureList")
751 		.endClass ()
752 
753 		.beginStdMap <int, Vamp::Plugin::FeatureList> ("FeatureSet")
754 		.endClass ()
755 
756 		.endNamespace () // Vamp::Plugin
757 		.endNamespace ();// Vamp
758 
759 	luabridge::getGlobalNamespace (L)
760 		.beginNamespace ("ARDOUR")
761 
762 		.addConst ("revision", ARDOUR::revision)
763 
764 		.beginClass <InterThreadInfo> ("InterThreadInfo")
765 		.addVoidConstructor ()
766 		.addData ("done", const_cast<bool InterThreadInfo::*>(&InterThreadInfo::done))
767 #if 0 // currently unused, lua is single-threaded, no custom UIs.
768 		.addData ("cancel", (bool InterThreadInfo::*)&InterThreadInfo::cancel)
769 #endif
770 		.addData ("progress", const_cast<float InterThreadInfo::*>(&InterThreadInfo::progress))
771 		.endClass ()
772 
773 		.beginClass <Progress> ("Progress")
774 		.endClass ()
775 
776 		.beginClass <MusicSample> ("MusicSample")
777 		.addConstructor <void (*) (samplepos_t, int32_t)> ()
778 		.addFunction ("set", &MusicSample::set)
779 		.addData ("sample", &MusicSample::sample)
780 		.addData ("division", &MusicSample::division)
781 		.endClass ()
782 
783 		.beginClass <AudioRange> ("AudioRange")
784 		.addConstructor <void (*) (samplepos_t, samplepos_t, uint32_t)> ()
785 		.addFunction ("length", &AudioRange::length)
786 		.addFunction ("equal", &AudioRange::equal)
787 		.addData ("start", &AudioRange::start)
788 		.addData ("_end", &AudioRange::end) // XXX "end" is a lua reserved word
789 		.addData ("id", &AudioRange::id)
790 		.endClass ()
791 
792 		.beginWSPtrClass <PluginInfo> ("PluginInfo")
793 		.addNilPtrConstructor ()
794 		.addData ("name", &PluginInfo::name, false)
795 		.addData ("category", &PluginInfo::category, false)
796 		.addData ("creator", &PluginInfo::creator, false)
797 		.addData ("path", &PluginInfo::path, false)
798 		.addData ("n_inputs", &PluginInfo::n_inputs, false)
799 		.addData ("n_outputs", &PluginInfo::n_outputs, false)
800 		.addData ("type", &PluginInfo::type, false)
801 		.addData ("unique_id", &PluginInfo::unique_id, false)
802 		.addFunction ("is_instrument", &PluginInfo::is_instrument)
803 		.addFunction ("get_presets", &PluginInfo::get_presets)
804 		.endClass ()
805 
806 		.beginNamespace ("Route")
807 		.beginClass <Route::ProcessorStreams> ("ProcessorStreams")
808 		.addVoidConstructor ()
809 		.endClass ()
810 		.endNamespace ()
811 
812 		.beginClass <ChanMapping> ("ChanMapping")
813 		.addVoidConstructor ()
814 		.addFunction ("get", static_cast<uint32_t(ChanMapping::*)(DataType, uint32_t) const>(&ChanMapping::get))
815 		.addFunction ("set", &ChanMapping::set)
816 		.addFunction ("count", &ChanMapping::count)
817 		.addFunction ("n_total", &ChanMapping::n_total)
818 		.addFunction ("is_monotonic", &ChanMapping::is_monotonic)
819 		.addConst ("Invalid", 4294967295U) // UINT32_MAX
820 		.endClass ()
821 
822 		.beginNamespace ("Properties")
823 		// templated class definitions
824 		.beginClass <PBD::PropertyDescriptor<bool> > ("BoolProperty").endClass ()
825 		.beginClass <PBD::PropertyDescriptor<float> > ("FloatProperty").endClass ()
826 		.beginClass <PBD::PropertyDescriptor<samplepos_t> > ("SampleposProperty").endClass ()
827 		// actual references (TODO: also expose GQuark for std::set)
828 		//   ardour/region.h
829 		.addConst ("Start", &ARDOUR::Properties::start)
830 		.addConst ("Length", &ARDOUR::Properties::length)
831 		.addConst ("Position", &ARDOUR::Properties::position)
832 		.endNamespace ()
833 
834 		.beginClass <PBD::PropertyChange> ("PropertyChange")
835 		// TODO add special handling (std::set<PropertyID>), PropertyID is a GQuark.
836 		// -> direct map to lua table  beginStdSet()
837 		//
838 		// expand templated PropertyDescriptor<T>
839 		.addFunction ("containsBool", &PBD::PropertyChange::contains<bool>)
840 		.addFunction ("containsFloat", &PBD::PropertyChange::contains<float>)
841 		.addFunction ("containsSamplePos", &PBD::PropertyChange::contains<samplepos_t>)
842 		.endClass ()
843 
844 		.beginClass <PBD::PropertyList> ("PropertyList")
845 		// is-a  std::map<PropertyID, PropertyBase*>
846 		.endClass ()
847 
848 		.deriveClass <PBD::OwnedPropertyList, PBD::PropertyList> ("OwnedPropertyList")
849 		.endClass ()
850 
851 		.deriveWSPtrClass <AutomationList, Evoral::ControlList> ("AutomationList")
852 		.addCast<PBD::Stateful> ("to_stateful")
853 		.addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
854 		.addCast<Evoral::ControlList> ("list") // deprecated
855 		.addFunction ("get_state", &AutomationList::get_state)
856 		.addFunction ("memento_command", &AutomationList::memento_command)
857 		.addFunction ("touching", &AutomationList::touching)
858 		.addFunction ("writing", &AutomationList::writing)
859 		.addFunction ("touch_enabled", &AutomationList::touch_enabled)
860 		.endClass ()
861 
862 		.deriveClass <Location, PBD::StatefulDestructible> ("Location")
863 		.addFunction ("name", &Location::name)
864 		.addFunction ("locked", &Location::locked)
865 		.addFunction ("lock", &Location::lock)
866 		.addFunction ("unlock", &Location::unlock)
867 		.addFunction ("start", &Location::start)
868 		.addFunction ("_end", &Location::end) // XXX "end" is a lua reserved word
869 		.addFunction ("length", &Location::length)
870 		.addFunction ("set_start", &Location::set_start)
871 		.addFunction ("set_end", &Location::set_end)
872 		.addFunction ("set", &Location::set)
873 		.addFunction ("set_length", &Location::set)
874 		.addFunction ("set_name", &Location::set_name)
875 		.addFunction ("move_to", &Location::move_to)
876 		.addFunction ("matches", &Location::matches)
877 		.addFunction ("flags", &Location::flags)
878 		.addFunction ("is_auto_punch", &Location::is_auto_punch)
879 		.addFunction ("is_auto_loop", &Location::is_auto_loop)
880 		.addFunction ("is_mark", &Location::is_mark)
881 		.addFunction ("is_hidden", &Location::is_hidden)
882 		.addFunction ("is_cd_marker", &Location::is_cd_marker)
883 		.addFunction ("is_session_range", &Location::is_session_range)
884 		.addFunction ("is_range_marker", &Location::is_range_marker)
885 		.endClass ()
886 
887 		.deriveClass <Locations, PBD::StatefulDestructible> ("Locations")
888 		.addFunction ("list", static_cast<Locations::LocationList (Locations::*)()>(&Locations::list))
889 		.addFunction ("auto_loop_location", &Locations::auto_loop_location)
890 		.addFunction ("auto_punch_location", &Locations::auto_punch_location)
891 		.addFunction ("session_range_location", &Locations::session_range_location)
892 		.addFunction ("first_mark_after", &Locations::first_mark_after)
893 		.addFunction ("first_mark_before", &Locations::first_mark_before)
894 		.addFunction ("first_mark_at", &Locations::mark_at)
895 		.addFunction ("mark_at", &Locations::mark_at)
896 		.addFunction ("range_starts_at", &Locations::range_starts_at)
897 		.addFunction ("add_range", &Locations::add_range)
898 		.addFunction ("remove", &Locations::remove)
899 		.addRefFunction ("marks_either_side", &Locations::marks_either_side)
900 		.addRefFunction ("find_all_between", &Locations::find_all_between)
901 		.endClass ()
902 
903 		.beginWSPtrClass <SessionObject> ("SessionObjectPtr")
904 		/* SessionObject is-a PBD::StatefulDestructible,
905 		 * but multiple inheritance is not covered by luabridge,
906 		 * we need explicit casts */
907 		.addCast<PBD::Stateful> ("to_stateful")
908 		.addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
909 		.addFunction ("name", &SessionObject::name)
910 		.endClass ()
911 
912 		.beginClass <SessionObject> ("SessionObject")
913 		.addFunction ("name", &SessionObject::name)
914 		.addCast<PBD::Stateful> ("to_stateful")
915 		.endClass ()
916 
917 		.beginWSPtrClass <Port> ("Port")
918 		.addCast<MidiPort> ("to_midiport")
919 		.addCast<AsyncMIDIPort> ("to_asyncmidiport")
920 		.addCast<AudioPort> ("to_audioport")
921 		.addFunction ("name", &Port::name)
922 		.addFunction ("pretty_name", &Port::pretty_name)
923 		.addFunction ("flags", &Port::flags)
924 		.addFunction ("receives_input", &Port::receives_input)
925 		.addFunction ("sends_output", &Port::sends_output)
926 		.addFunction ("connected", &Port::connected)
927 		.addFunction ("disconnect_all", &Port::disconnect_all)
928 		.addFunction ("connected_to", (bool (Port::*)(std::string const &)const)&Port::connected_to)
929 		.addFunction ("connect", (int (Port::*)(std::string const &))&Port::connect)
930 		.addFunction ("disconnect", (int (Port::*)(std::string const &))&Port::disconnect)
931 		.addFunction ("physically_connected", &Port::physically_connected)
932 		.addFunction ("private_latency_range", &Port::private_latency_range)
933 		.addFunction ("public_latency_range", &Port::public_latency_range)
934 		.addRefFunction ("get_connected_latency_range", &Port::get_connected_latency_range)
935 		//.addStaticFunction ("port_offset", &Port::port_offset) // static
936 		.endClass ()
937 
938 		.deriveWSPtrClass <AudioPort, Port> ("AudioPort")
939 		.endClass ()
940 
941 		.deriveWSPtrClass <MidiPort, Port> ("MidiPort")
942 		.addCast<AsyncMIDIPort> ("to_asyncmidiport")
943 		.addFunction ("input_active", &MidiPort::input_active)
944 		.addFunction ("set_input_active", &MidiPort::set_input_active)
945 		.addFunction ("get_midi_buffer", &MidiPort::get_midi_buffer) // DSP only
946 		.endClass ()
947 
948 		.deriveWSPtrClass <AsyncMIDIPort, MidiPort> ("AsyncMIDIPort")
949 		.addFunction ("write", &AsyncMIDIPort::write)
950 		.endClass ()
951 
952 		.beginWSPtrClass <PortSet> ("PortSet")
953 		.addFunction ("num_ports", (size_t (PortSet::*)(DataType)const)&PortSet::num_ports)
954 		.addFunction ("add", &PortSet::add)
955 		.addFunction ("remove", &PortSet::remove)
956 		.addFunction ("port", (boost::shared_ptr<Port> (PortSet::*)(DataType, size_t)const)&PortSet::port)
957 		.addFunction ("contains", &PortSet::contains)
958 		.addFunction ("clear", &PortSet::clear)
959 		.addFunction ("empty", &PortSet::empty)
960 		.endClass ()
961 
962 		.deriveWSPtrClass <IO, SessionObject> ("IO")
963 		.addFunction ("active", &IO::active)
964 		.addFunction ("add_port", &IO::add_port)
965 		.addFunction ("remove_port", &IO::remove_port)
966 		.addFunction ("connect", &IO::connect)
967 		.addFunction ("disconnect", (int (IO::*)(boost::shared_ptr<Port>, std::string, void *))&IO::disconnect)
968 		.addFunction ("disconnect_all", (int (IO::*)(void *))&IO::disconnect)
969 		.addFunction ("physically_connected", &IO::physically_connected)
970 		.addFunction ("has_port", &IO::has_port)
971 		.addFunction ("nth", &IO::nth)
972 		.addFunction ("audio", &IO::audio)
973 		.addFunction ("midi", &IO::midi)
974 		.addFunction ("port_by_name", &IO::nth)
975 		.addFunction ("n_ports", &IO::n_ports)
976 		.addFunction ("latency", &IO::latency)
977 		.addFunction ("public_latency", &IO::latency)
978 		.endClass ()
979 
980 		.deriveWSPtrClass <PannerShell, SessionObject> ("PannerShell")
981 		.addFunction ("bypassed", &PannerShell::bypassed)
982 		.addFunction ("set_bypassed", &PannerShell::set_bypassed)
983 		.endClass ()
984 
985 		.deriveClass <RouteGroup, SessionObject> ("RouteGroup")
986 		.addFunction ("is_active", &RouteGroup::is_active)
987 		.addFunction ("is_relative", &RouteGroup::is_relative)
988 		.addFunction ("is_hidden", &RouteGroup::is_hidden)
989 		.addFunction ("is_gain", &RouteGroup::is_gain)
990 		.addFunction ("is_mute", &RouteGroup::is_mute)
991 		.addFunction ("is_solo", &RouteGroup::is_solo)
992 		.addFunction ("is_recenable", &RouteGroup::is_recenable)
993 		.addFunction ("is_select", &RouteGroup::is_select)
994 		.addFunction ("is_route_active", &RouteGroup::is_route_active)
995 		.addFunction ("is_color", &RouteGroup::is_color)
996 		.addFunction ("is_monitoring", &RouteGroup::is_monitoring)
997 		.addFunction ("group_master_number", &RouteGroup::group_master_number)
998 		.addFunction ("empty", &RouteGroup::empty)
999 		.addFunction ("size", &RouteGroup::size)
1000 		.addFunction ("set_active", &RouteGroup::set_active)
1001 		.addFunction ("set_relative", &RouteGroup::set_relative)
1002 		.addFunction ("set_hidden", &RouteGroup::set_hidden)
1003 		.addFunction ("set_gain", &RouteGroup::set_gain)
1004 		.addFunction ("set_mute", &RouteGroup::set_mute)
1005 		.addFunction ("set_solo", &RouteGroup::set_solo)
1006 		.addFunction ("set_recenable", &RouteGroup::set_recenable)
1007 		.addFunction ("set_select", &RouteGroup::set_select)
1008 		.addFunction ("set_route_active", &RouteGroup::set_route_active)
1009 		.addFunction ("set_color", &RouteGroup::set_color)
1010 		.addFunction ("set_monitoring", &RouteGroup::set_monitoring)
1011 		.addFunction ("add", &RouteGroup::add)
1012 		.addFunction ("remove", &RouteGroup::remove)
1013 		.addFunction ("clear", &RouteGroup::clear)
1014 		.addFunction ("set_rgba", &RouteGroup::set_rgba)
1015 		.addFunction ("rgba", &RouteGroup::rgba)
1016 		.addFunction ("has_subgroup", &RouteGroup::has_subgroup)
1017 		.addFunction ("make_subgroup", &RouteGroup::make_subgroup)
1018 		.addFunction ("destroy_subgroup", &RouteGroup::destroy_subgroup)
1019 		.addFunction ("route_list", &RouteGroup::route_list)
1020 		.endClass ()
1021 
1022 		.deriveClass <PresentationInfo, PBD::Stateful> ("PresentationInfo")
1023 		.addFunction ("color", &PresentationInfo::color)
1024 		.addFunction ("set_color", &PresentationInfo::set_color)
1025 		.addFunction ("order", &PresentationInfo::order)
1026 		.addFunction ("special", &PresentationInfo::special)
1027 		.addFunction ("flags", &PresentationInfo::flags)
1028 		.addConst ("max_order", ARDOUR::PresentationInfo::max_order)
1029 		.endClass ()
1030 
1031 		.beginWSPtrClass <Slavable> ("Slavable")
1032 		.addFunction ("assign", &Slavable::assign)
1033 		.addFunction ("unassign", &Slavable::unassign)
1034 		.addFunction ("masters", &Slavable::masters)
1035 		.addFunction ("assigned_to", &Slavable::assigned_to)
1036 		.endClass ()
1037 
1038 		.deriveWSPtrClass <Stripable, SessionObject> ("Stripable")
1039 		.addCast<Route> ("to_route")
1040 		.addCast<VCA> ("to_vca")
1041 		.addCast<Slavable> ("to_slavable")
1042 		.addCast<Automatable> ("to_automatable")
1043 		.addFunction ("is_auditioner", &Stripable::is_auditioner)
1044 		.addFunction ("is_private_route", &Stripable::is_private_route)
1045 		.addFunction ("is_master", &Stripable::is_master)
1046 		.addFunction ("is_monitor", &Stripable::is_monitor)
1047 		.addFunction ("is_hidden", &Stripable::is_hidden)
1048 		.addFunction ("is_selected", &Stripable::is_selected)
1049 		.addFunction ("gain_control", &Stripable::gain_control)
1050 		.addFunction ("solo_control", &Stripable::solo_control)
1051 		.addFunction ("solo_isolate_control", &Stripable::solo_isolate_control)
1052 		.addFunction ("solo_safe_control", &Stripable::solo_safe_control)
1053 		.addFunction ("mute_control", &Stripable::mute_control)
1054 		.addFunction ("phase_control", &Stripable::phase_control)
1055 		.addFunction ("trim_control", &Stripable::trim_control)
1056 		.addFunction ("rec_enable_control", &Stripable::rec_enable_control)
1057 		.addFunction ("rec_safe_control", &Stripable::rec_safe_control)
1058 		.addFunction ("pan_azimuth_control", &Stripable::pan_azimuth_control)
1059 		.addFunction ("pan_elevation_control", &Stripable::pan_elevation_control)
1060 		.addFunction ("pan_width_control", &Stripable::pan_width_control)
1061 		.addFunction ("pan_frontback_control", &Stripable::pan_frontback_control)
1062 		.addFunction ("pan_lfe_control", &Stripable::pan_lfe_control)
1063 		.addFunction ("send_level_controllable", &Stripable::send_level_controllable)
1064 		.addFunction ("send_enable_controllable", &Stripable::send_enable_controllable)
1065 		.addFunction ("send_pan_azimuth_controllable", &Stripable::send_pan_azimuth_controllable)
1066 		.addFunction ("send_pan_azimuth_enable_controllable", &Stripable::send_pan_azimuth_enable_controllable)
1067 		.addFunction ("send_name", &Stripable::send_name)
1068 		.addFunction ("monitor_control", &Stripable::monitor_control)
1069 		.addFunction ("master_send_enable_controllable", &Stripable::master_send_enable_controllable)
1070 		.addFunction ("comp_enable_controllable", &Stripable::comp_enable_controllable)
1071 		.addFunction ("comp_threshold_controllable", &Stripable::comp_threshold_controllable)
1072 		.addFunction ("comp_speed_controllable", &Stripable::comp_speed_controllable)
1073 		.addFunction ("comp_mode_controllable", &Stripable::comp_mode_controllable)
1074 		.addFunction ("comp_makeup_controllable", &Stripable::comp_makeup_controllable)
1075 		.addFunction ("comp_redux_controllable", &Stripable::comp_redux_controllable)
1076 		.addFunction ("comp_mode_name", &Stripable::comp_mode_name)
1077 		.addFunction ("comp_speed_name", &Stripable::comp_speed_name)
1078 		.addFunction ("eq_band_cnt", &Stripable::eq_band_cnt)
1079 		.addFunction ("eq_enable_controllable", &Stripable::eq_enable_controllable)
1080 		.addFunction ("eq_band_name", &Stripable::eq_band_name)
1081 		.addFunction ("eq_gain_controllable", &Stripable::eq_gain_controllable)
1082 		.addFunction ("eq_freq_controllable", &Stripable::eq_freq_controllable)
1083 		.addFunction ("eq_q_controllable", &Stripable::eq_q_controllable)
1084 		.addFunction ("eq_shape_controllable", &Stripable::eq_shape_controllable)
1085 		.addFunction ("filter_freq_controllable", &Stripable::filter_freq_controllable)
1086 		.addFunction ("filter_slope_controllable", &Stripable::filter_slope_controllable)
1087 		.addFunction ("filter_enable_controllable", &Stripable::filter_enable_controllable)
1088 		.addFunction ("set_presentation_order", &Stripable::set_presentation_order)
1089 		.addFunction ("presentation_info_ptr", &Stripable::presentation_info_ptr)
1090 		.addFunction ("slaved_to", &Stripable::slaved_to)
1091 		.addFunction ("slaved", &Stripable::slaved)
1092 
1093 		.endClass ()
1094 
1095 		.deriveWSPtrClass <VCA, Stripable> ("VCA")
1096 		.addFunction ("full_name", &VCA::full_name)
1097 		.addFunction ("number", &VCA::number)
1098 		.addFunction ("gain_control", &VCA::gain_control)
1099 		.addFunction ("solo_control", &VCA::solo_control)
1100 		.addFunction ("mute_control", &VCA::mute_control)
1101 		.endClass ()
1102 
1103 		.deriveWSPtrClass <Route, Stripable> ("Route")
1104 		.addCast<Track> ("to_track")
1105 		.addFunction ("set_name", &Route::set_name)
1106 		.addFunction ("comment", &Route::comment)
1107 		.addFunction ("active", &Route::active)
1108 		.addFunction ("data_type", &Route::data_type)
1109 		.addFunction ("set_active", &Route::set_active)
1110 		.addFunction ("nth_plugin", &Route::nth_plugin)
1111 		.addFunction ("nth_processor", &Route::nth_processor)
1112 		.addFunction ("nth_send", &Route::nth_send)
1113 		.addFunction ("add_foldback_send", &Route::add_foldback_send)
1114 		.addFunction ("add_processor_by_index", &Route::add_processor_by_index)
1115 		.addFunction ("remove_processor", &Route::remove_processor)
1116 		.addFunction ("remove_processors", &Route::remove_processors)
1117 		.addFunction ("replace_processor", &Route::replace_processor)
1118 		.addFunction ("reorder_processors", &Route::reorder_processors)
1119 		.addFunction ("the_instrument", &Route::the_instrument)
1120 		.addFunction ("n_inputs", &Route::n_inputs)
1121 		.addFunction ("n_outputs", &Route::n_outputs)
1122 		.addFunction ("input", &Route::input)
1123 		.addFunction ("output", &Route::output)
1124 		.addFunction ("panner_shell", &Route::panner_shell)
1125 		.addFunction ("set_comment", &Route::set_comment)
1126 		.addFunction ("strict_io", &Route::strict_io)
1127 		.addFunction ("set_strict_io", &Route::set_strict_io)
1128 		.addFunction ("reset_plugin_insert", &Route::reset_plugin_insert)
1129 		.addFunction ("customize_plugin_insert", &Route::customize_plugin_insert)
1130 		.addFunction ("add_sidechain", &Route::add_sidechain)
1131 		.addFunction ("add_aux_send", &Route::add_aux_send)
1132 		.addFunction ("remove_sidechain", &Route::remove_sidechain)
1133 		.addFunction ("main_outs", &Route::main_outs)
1134 		.addFunction ("muted", &Route::muted)
1135 		.addFunction ("soloed", &Route::soloed)
1136 		.addFunction ("amp", &Route::amp)
1137 		.addFunction ("trim", &Route::trim)
1138 		.addFunction ("peak_meter", (boost::shared_ptr<PeakMeter> (Route::*)())&Route::peak_meter)
1139 		.addFunction ("set_meter_point", &Route::set_meter_point)
1140 		.addFunction ("signal_latency", &Route::signal_latency)
1141 		.addFunction ("playback_latency", &Route::playback_latency)
1142 		.addFunction ("monitoring_state", &Route::monitoring_state)
1143 		.addFunction ("monitoring_control", &Route::monitoring_control)
1144 		.endClass ()
1145 
1146 		.deriveWSPtrClass <Playlist, SessionObject> ("Playlist")
1147 		.addCast<AudioPlaylist> ("to_audioplaylist")
1148 		.addCast<MidiPlaylist> ("to_midiplaylist")
1149 		.addFunction ("set_name", &Playlist::set_name)
1150 		.addFunction ("region_by_id", &Playlist::region_by_id)
1151 		.addFunction ("data_type", &Playlist::data_type)
1152 		.addFunction ("n_regions", &Playlist::n_regions)
1153 		//.addFunction ("get_extent", &Playlist::get_extent) // pair<samplepos_t, samplepos_t>
1154 		.addFunction ("region_list", &Playlist::region_list)
1155 		.addFunction ("add_region", &Playlist::add_region)
1156 		.addFunction ("remove_region", &Playlist::remove_region)
1157 		.addFunction ("regions_at", &Playlist::regions_at)
1158 		.addFunction ("top_region_at", &Playlist::top_region_at)
1159 		.addFunction ("top_unmuted_region_at", &Playlist::top_unmuted_region_at)
1160 		.addFunction ("find_next_transient", &Playlist::find_next_transient)
1161 		.addFunction ("find_next_region", &Playlist::find_next_region)
1162 		.addFunction ("find_next_region_boundary", &Playlist::find_next_region_boundary)
1163 		.addFunction ("count_regions_at", &Playlist::count_regions_at)
1164 		.addFunction ("regions_touched", &Playlist::regions_touched)
1165 		.addFunction ("regions_with_start_within", &Playlist::regions_with_start_within)
1166 		.addFunction ("regions_with_end_within", &Playlist::regions_with_end_within)
1167 		.addFunction ("raise_region", &Playlist::raise_region)
1168 		.addFunction ("lower_region", &Playlist::lower_region)
1169 		.addFunction ("raise_region_to_top", &Playlist::raise_region_to_top)
1170 		.addFunction ("lower_region_to_bottom", &Playlist::lower_region_to_bottom)
1171 		.addFunction ("duplicate", (void (Playlist::*)(boost::shared_ptr<Region>, samplepos_t, samplecnt_t, float))&Playlist::duplicate)
1172 		.addFunction ("duplicate_until", &Playlist::duplicate_until)
1173 		.addFunction ("duplicate_range", &Playlist::duplicate_range)
1174 		.addFunction ("combine", &Playlist::combine)
1175 		.addFunction ("uncombine", &Playlist::uncombine)
1176 		.addFunction ("used", &Playlist::used)
1177 		.addFunction ("hidden", &Playlist::hidden)
1178 		.addFunction ("empty", &Playlist::empty)
1179 		.addFunction ("shared", &Playlist::shared)
1180 		.addFunction ("split_region", &Playlist::split_region)
1181 		.addFunction ("get_orig_track_id", &Playlist::get_orig_track_id)
1182 		//.addFunction ("split", &Playlist::split) // XXX needs MusicSample
1183 		.addFunction ("cut", (boost::shared_ptr<Playlist> (Playlist::*)(std::list<AudioRange>&, bool))&Playlist::cut)
1184 #if 0
1185 		.addFunction ("copy", &Playlist::copy)
1186 		.addFunction ("paste", &Playlist::paste)
1187 #endif
1188 		.endClass ()
1189 
1190 		.beginWSPtrClass <Bundle> ("Bundle")
1191 		.addCast<UserBundle> ("to_userbundle")
1192 		.addFunction ("name", &Bundle::name)
1193 		.addFunction ("n_total", &Bundle::n_total)
1194 		.addFunction ("nchannels", &Bundle::nchannels)
1195 		.addFunction ("channel_name", &Bundle::channel_name)
1196 		.addFunction ("ports_are_inputs", &Bundle::ports_are_inputs)
1197 		.addFunction ("ports_are_outputs", &Bundle::ports_are_outputs)
1198 		.endClass ()
1199 
1200 		.deriveWSPtrClass <UserBundle, Bundle> ("UserBundle")
1201 		.endClass ()
1202 
1203 		.deriveWSPtrClass <AudioPlaylist, Playlist> ("AudioPlaylist")
1204 		.addFunction ("read", &AudioPlaylist::read)
1205 		.endClass ()
1206 
1207 		.deriveWSPtrClass <MidiPlaylist, Playlist> ("MidiPlaylist")
1208 		.addFunction ("set_note_mode", &MidiPlaylist::set_note_mode)
1209 		.endClass ()
1210 
1211 		.beginWSPtrClass <SessionPlaylists> ("SessionPlaylists")
1212 		.addFunction ("by_name", &SessionPlaylists::by_name)
1213 		.addFunction ("by_id", &SessionPlaylists::by_id)
1214 		.addFunction ("source_use_count", &SessionPlaylists::source_use_count)
1215 		.addFunction ("region_use_count", &SessionPlaylists::region_use_count)
1216 		.addFunction ("playlists_for_track", &SessionPlaylists::playlists_for_track)
1217 		.addFunction ("get_used", &SessionPlaylists::get_used)
1218 		.addFunction ("get_unused", &SessionPlaylists::get_unused)
1219 		.addFunction ("n_playlists", &SessionPlaylists::n_playlists)
1220 		.endClass ()
1221 
1222 		.deriveWSPtrClass <Track, Route> ("Track")
1223 		.addCast<AudioTrack> ("to_audio_track")
1224 		.addCast<MidiTrack> ("to_midi_track")
1225 		.addFunction ("set_name", &Track::set_name)
1226 		.addFunction ("can_record", &Track::can_record)
1227 		.addFunction ("bounceable", &Track::bounceable)
1228 		.addFunction ("bounce", &Track::bounce)
1229 		.addFunction ("bounce_range", &Track::bounce_range)
1230 		.addFunction ("playlist", &Track::playlist)
1231 		.addFunction ("use_playlist", &Track::use_playlist)
1232 		.addFunction ("use_copy_playlist", &Track::use_copy_playlist)
1233 		.addFunction ("use_new_playlist", &Track::use_new_playlist)
1234 		.addFunction ("find_and_use_playlist", &Track::find_and_use_playlist)
1235 		.endClass ()
1236 
1237 		.deriveWSPtrClass <AudioTrack, Track> ("AudioTrack")
1238 		.endClass ()
1239 
1240 		.deriveWSPtrClass <MidiTrack, Track> ("MidiTrack")
1241 		.addFunction ("write_immediate_event", &MidiTrack::write_immediate_event)
1242 		.endClass ()
1243 
1244 		.beginWSPtrClass <Readable> ("Readable")
1245 		.addFunction ("read", &Readable::read)
1246 		.addFunction ("readable_length", &Readable::readable_length)
1247 		.addFunction ("n_channels", &Readable::n_channels)
1248 		.addStaticFunction ("load", &Readable::load)
1249 		.endClass ()
1250 
1251 		.deriveWSPtrClass <AudioRom, Readable> ("AudioRom")
1252 		.addStaticFunction ("new_rom", &AudioRom::new_rom)
1253 		.endClass ()
1254 
1255 		.deriveWSPtrClass <Region, SessionObject> ("Region")
1256 		.addCast<Readable> ("to_readable")
1257 		.addCast<MidiRegion> ("to_midiregion")
1258 		.addCast<AudioRegion> ("to_audioregion")
1259 
1260 		.addFunction ("playlist", &Region::playlist)
1261 		.addFunction ("set_name", &Region::set_name)
1262 		/* properties */
1263 		.addFunction ("position", &Region::position)
1264 		.addFunction ("start", &Region::start)
1265 		.addFunction ("length", &Region::length)
1266 		.addFunction ("layer", &Region::layer)
1267 		.addFunction ("data_type", &Region::data_type)
1268 		.addFunction ("stretch", &Region::stretch)
1269 		.addFunction ("shift", &Region::shift)
1270 		.addRefFunction ("sync_offset", &Region::sync_offset)
1271 		.addFunction ("sync_position", &Region::sync_position)
1272 		.addFunction ("hidden", &Region::hidden)
1273 		.addFunction ("muted", &Region::muted)
1274 		.addFunction ("opaque", &Region::opaque)
1275 		.addFunction ("locked", &Region::locked)
1276 		.addFunction ("position_locked", &Region::position_locked)
1277 		.addFunction ("video_locked", &Region::video_locked)
1278 		.addFunction ("automatic", &Region::automatic)
1279 		.addFunction ("whole_file", &Region::whole_file)
1280 		.addFunction ("captured", &Region::captured)
1281 		.addFunction ("can_move", &Region::can_move)
1282 		.addFunction ("sync_marked", &Region::sync_marked)
1283 		.addFunction ("external", &Region::external)
1284 		.addFunction ("import", &Region::import)
1285 		.addFunction ("covers", &Region::covers)
1286 		.addFunction ("at_natural_position", &Region::at_natural_position)
1287 		.addFunction ("is_compound", &Region::is_compound)
1288 		.addFunction ("captured_xruns", &Region::captured_xruns)
1289 
1290 		.addFunction ("has_transients", &Region::has_transients)
1291 		.addFunction ("transients", (AnalysisFeatureList (Region::*)())&Region::transients)
1292 
1293 		/* editing operations */
1294 		.addFunction ("set_length", &Region::set_length)
1295 		.addFunction ("set_start", &Region::set_start)
1296 		.addFunction ("set_position", &Region::set_position)
1297 		.addFunction ("set_initial_position", &Region::set_initial_position)
1298 		.addFunction ("nudge_position", &Region::nudge_position)
1299 		.addFunction ("move_to_natural_position", &Region::move_to_natural_position)
1300 		.addFunction ("move_start", &Region::move_start)
1301 		.addFunction ("master_sources", &Region::master_sources)
1302 		.addFunction ("master_source_names", &Region::master_source_names)
1303 		.addFunction ("n_channels", &Region::n_channels)
1304 		.addFunction ("trim_front", &Region::trim_front)
1305 		.addFunction ("trim_end", &Region::trim_end)
1306 		.addFunction ("trim_to", &Region::trim_to)
1307 		.addFunction ("cut_front", &Region::cut_front)
1308 		.addFunction ("cut_end", &Region::cut_end)
1309 		.addFunction ("raise", &Region::raise)
1310 		.addFunction ("lower", &Region::lower)
1311 		.addFunction ("raise_to_top", &Region::raise_to_top)
1312 		.addFunction ("lower_to_bottom", &Region::lower_to_bottom)
1313 		.addFunction ("set_sync_position", &Region::set_sync_position)
1314 		.addFunction ("clear_sync_position", &Region::clear_sync_position)
1315 		.addFunction ("quarter_note", &Region::quarter_note)
1316 		.addFunction ("set_hidden", &Region::set_hidden)
1317 		.addFunction ("set_muted", &Region::set_muted)
1318 		.addFunction ("set_opaque", &Region::set_opaque)
1319 		.addFunction ("set_locked", &Region::set_locked)
1320 		.addFunction ("set_video_locked", &Region::set_video_locked)
1321 		.addFunction ("set_position_locked", &Region::set_position_locked)
1322 		.addFunction ("source", &Region::source)
1323 		.addFunction ("control", static_cast<boost::shared_ptr<Evoral::Control>(Region::*)(const Evoral::Parameter&, bool)>(&Region::control))
1324 		.endClass ()
1325 
1326 		.deriveWSPtrClass <MidiRegion, Region> ("MidiRegion")
1327 		.addFunction ("do_export", &MidiRegion::do_export)
1328 		.addFunction ("midi_source", &MidiRegion::midi_source)
1329 		.addFunction ("model", (boost::shared_ptr<MidiModel> (MidiRegion::*)())&MidiRegion::model)
1330 		.addFunction ("start_beats", &MidiRegion::start_beats)
1331 		.addFunction ("length_beats", &MidiRegion::length_beats)
1332 		.endClass ()
1333 
1334 		.deriveWSPtrClass <AudioRegion, Region> ("AudioRegion")
1335 		.addFunction ("audio_source", &AudioRegion::audio_source)
1336 		.addFunction ("set_scale_amplitude", &AudioRegion::set_scale_amplitude)
1337 		.addFunction ("scale_amplitude", &AudioRegion::scale_amplitude)
1338 		.addFunction ("maximum_amplitude", &AudioRegion::maximum_amplitude)
1339 		.addFunction ("rms", &AudioRegion::rms)
1340 		.addFunction ("envelope", &AudioRegion::envelope)
1341 		.addFunction ("envelope_active", &AudioRegion::envelope_active)
1342 		.addFunction ("fade_in_active", &AudioRegion::fade_in_active)
1343 		.addFunction ("fade_out_active", &AudioRegion::fade_out_active)
1344 		.addFunction ("set_envelope_active", &AudioRegion::set_envelope_active)
1345 		.addFunction ("set_fade_in_active", &AudioRegion::set_fade_in_active)
1346 		.addFunction ("set_fade_in_shape", &AudioRegion::set_fade_in_shape)
1347 		.addFunction ("set_fade_in_length", &AudioRegion::set_fade_in_length)
1348 		.addFunction ("set_fade_out_active", &AudioRegion::set_fade_out_active)
1349 		.addFunction ("set_fade_out_shape", &AudioRegion::set_fade_out_shape)
1350 		.addFunction ("set_fade_out_length", &AudioRegion::set_fade_out_length)
1351 		.addRefFunction ("separate_by_channel", &AudioRegion::separate_by_channel)
1352 		.endClass ()
1353 
1354 		.deriveWSPtrClass <Source, SessionObject> ("Source")
1355 		.addCast<AudioSource> ("to_audiosource")
1356 		.addCast<MidiSource> ("to_midisource")
1357 		.addCast<FileSource> ("to_filesource")
1358 		.addFunction ("timestamp", &Source::timestamp)
1359 		.addFunction ("empty", &Source::empty)
1360 		.addFunction ("length", &Source::length)
1361 		.addFunction ("natural_position", &Source::natural_position)
1362 		.addFunction ("writable", &Source::writable)
1363 		.addFunction ("has_been_analysed", &Source::has_been_analysed)
1364 		.addFunction ("can_be_analysed", &Source::can_be_analysed)
1365 		.addFunction ("timeline_position", &Source::natural_position) /* duplicate */
1366 		.addFunction ("use_count", &Source::use_count)
1367 		.addFunction ("used", &Source::used)
1368 		.addFunction ("ancestor_name", &Source::ancestor_name)
1369 		.addFunction ("captured_xruns", &Source::captured_xruns)
1370 		.endClass ()
1371 
1372 		.deriveWSPtrClass <FileSource, Source> ("FileSource")
1373 		.addFunction ("path", &FileSource::path)
1374 		.addFunction ("within_session", &FileSource::within_session)
1375 		.addFunction ("channel", &FileSource::channel)
1376 		.addFunction ("origin", &FileSource::origin)
1377 		.addFunction ("take_id", &FileSource::take_id)
1378 		.addFunction ("gain", &FileSource::gain)
1379 		.endClass ()
1380 
1381 		.deriveWSPtrClass <MidiSource, Source> ("MidiSource")
1382 		.addFunction ("empty", &MidiSource::empty)
1383 		.addFunction ("length", &MidiSource::length)
1384 		.addFunction ("model", &MidiSource::model)
1385 		.endClass ()
1386 
1387 		.deriveWSPtrClass <AudioSource, Source> ("AudioSource")
1388 		.addCast<Readable> ("to_readable")
1389 		.addFunction ("readable_length", &AudioSource::readable_length)
1390 		.addFunction ("n_channels", &AudioSource::n_channels)
1391 		.addFunction ("empty", &Source::empty)
1392 		.addFunction ("length", &Source::length)
1393 		.addFunction ("read", &AudioSource::read)
1394 		.addFunction ("sample_rate", &AudioSource::sample_rate)
1395 		.addFunction ("captured_for", &AudioSource::captured_for)
1396 		.endClass ()
1397 
1398 		.beginWSPtrClass <Latent> ("Latent")
1399 		.addFunction ("effective_latency", &Latent::effective_latency)
1400 		.addFunction ("user_latency", &Latent::user_latency)
1401 		.addFunction ("unset_user_latency", &Latent::unset_user_latency)
1402 		.addFunction ("set_user_latency", &Latent::set_user_latency)
1403 		.endClass ()
1404 
1405 		.beginClass <Latent> ("PDC")
1406 		/* cannot reuse "Latent"; weak/shared-ptr refs cannot have static member functions */
1407 		.addStaticFunction ("zero_latency", &Latent::zero_latency)
1408 		.addStaticFunction ("force_zero_latency", &Latent::force_zero_latency)
1409 		.endClass ()
1410 
1411 		.deriveWSPtrClass <Automatable, Evoral::ControlSet> ("Automatable")
1412 		.addCast<Slavable> ("to_slavable")
1413 		.addFunction ("automation_control", (boost::shared_ptr<AutomationControl>(Automatable::*)(const Evoral::Parameter&, bool))&Automatable::automation_control)
1414 		.addFunction ("all_automatable_params", &Automatable::all_automatable_params)
1415 		.endClass ()
1416 
1417 		.deriveWSPtrClass <AutomatableSequence<Temporal::Beats>, Automatable> ("AutomatableSequence")
1418 		.addCast<Evoral::Sequence<Temporal::Beats> > ("to_sequence")
1419 		.endClass ()
1420 
1421 		.deriveWSPtrClass <MidiModel, AutomatableSequence<Temporal::Beats> > ("MidiModel")
1422 		.addFunction ("apply_command", (void (MidiModel::*)(Session*, Command*))&MidiModel::apply_command)
1423 		.addFunction ("new_note_diff_command", &MidiModel::new_note_diff_command)
1424 		.endClass ()
1425 
1426 		.beginNamespace ("MidiModel")
1427 		.deriveClass<ARDOUR::MidiModel::DiffCommand, Command> ("DiffCommand")
1428 		.endClass ()
1429 
1430 		.deriveClass<ARDOUR::MidiModel::NoteDiffCommand, ARDOUR::MidiModel::DiffCommand> ("NoteDiffCommand")
1431 		.addFunction ("add", &ARDOUR::MidiModel::NoteDiffCommand::add)
1432 		.addFunction ("remove", &ARDOUR::MidiModel::NoteDiffCommand::remove)
1433 		.endClass ()
1434 
1435 		.endNamespace () /* ARDOUR::MidiModel */
1436 
1437 		.beginClass <Plugin::PresetRecord> ("PresetRecord")
1438 		.addVoidConstructor ()
1439 		.addData ("uri", &Plugin::PresetRecord::uri, false)
1440 		.addData ("label", &Plugin::PresetRecord::label, false)
1441 		.addData ("user", &Plugin::PresetRecord::user, false)
1442 		.addData ("valid", &Plugin::PresetRecord::valid, false)
1443 		.endClass ()
1444 
1445 		.beginStdVector <Plugin::PresetRecord> ("PresetVector").endClass ()
1446 		.beginStdList <boost::shared_ptr<ARDOUR::PluginInfo> > ("PluginInfoList").endClass ()
1447 
1448 		.deriveClass <ParameterDescriptor, Evoral::ParameterDescriptor> ("ParameterDescriptor")
1449 		.addVoidConstructor ()
1450 		.addData ("label", &ParameterDescriptor::label)
1451 		.addData ("print_fmt", &ParameterDescriptor::print_fmt)
1452 		.addData ("step", &ParameterDescriptor::step)
1453 		.addData ("smallstep", &ParameterDescriptor::smallstep)
1454 		.addData ("largestep", &ParameterDescriptor::largestep)
1455 		.addData ("integer_step", &ParameterDescriptor::integer_step)
1456 		.addData ("sr_dependent", &ParameterDescriptor::sr_dependent)
1457 		.addData ("enumeration", &ParameterDescriptor::enumeration)
1458 		.addData ("inline_ctrl", &ParameterDescriptor::inline_ctrl)
1459 		.addData ("display_priority", &ParameterDescriptor::display_priority)
1460 		.addStaticFunction ("midi_note_name", &ParameterDescriptor::midi_note_name)
1461 		.endClass ()
1462 
1463 		.beginStdVector <boost::shared_ptr<ARDOUR::Processor> > ("ProcessorVector").endClass ()
1464 
1465 		.deriveWSPtrClass <Processor, SessionObject> ("Processor")
1466 		.addCast<Automatable> ("to_automatable")
1467 		.addCast<Latent> ("to_latent")
1468 		.addCast<PluginInsert> ("to_insert") // deprecated
1469 		.addCast<PluginInsert> ("to_plugininsert")
1470 		.addCast<SideChain> ("to_sidechain")
1471 		.addCast<IOProcessor> ("to_ioprocessor")
1472 		.addCast<UnknownProcessor> ("to_unknownprocessor")
1473 		.addCast<Amp> ("to_amp")
1474 		.addCast<DiskIOProcessor> ("to_diskioprocessor")
1475 		.addCast<DiskReader> ("to_diskreader")
1476 		.addCast<DiskWriter> ("to_diskwriter")
1477 		.addCast<PeakMeter> ("to_peakmeter")
1478 		.addCast<MonitorProcessor> ("to_monitorprocessor")
1479 		.addCast<Send> ("to_send")
1480 		.addCast<InternalSend> ("to_internalsend")
1481 		.addCast<PolarityProcessor> ("to_polarityprocessor")
1482 		.addCast<DelayLine> ("to_delayline")
1483 #if 0 // those objects are not yet bound
1484 		.addCast<CapturingProcessor> ("to_capturingprocessor")
1485 #endif
1486 		.addCast<PeakMeter> ("to_meter")
1487 		.addFunction ("display_name", &Processor::display_name)
1488 		.addFunction ("display_to_user", &Processor::display_to_user)
1489 		.addFunction ("active", &Processor::active)
1490 		.addFunction ("activate", &Processor::activate)
1491 		.addFunction ("deactivate", &Processor::deactivate)
1492 		.addFunction ("input_latency", &Processor::input_latency)
1493 		.addFunction ("output_latency", &Processor::output_latency)
1494 		.addFunction ("capture_offset", &Processor::capture_offset)
1495 		.addFunction ("playback_offset", &Processor::playback_offset)
1496 		.addFunction ("output_streams", &Processor::output_streams)
1497 		.addFunction ("input_streams", &Processor::input_streams)
1498 		.addFunction ("signal_latency", &Processor::signal_latency)
1499 		.endClass ()
1500 
1501 		.deriveWSPtrClass <DiskIOProcessor, Processor> ("DiskIOProcessor")
1502 		.endClass ()
1503 
1504 		.deriveWSPtrClass <DiskReader, DiskIOProcessor> ("DiskReader")
1505 		.endClass ()
1506 
1507 		.deriveWSPtrClass <DiskWriter, DiskIOProcessor> ("DiskWriter")
1508 		.endClass ()
1509 
1510 		.deriveWSPtrClass <IOProcessor, Processor> ("IOProcessor")
1511 		.addFunction ("natural_input_streams", &IOProcessor::natural_input_streams)
1512 		.addFunction ("natural_output_streams", &IOProcessor::natural_output_streams)
1513 		.addFunction ("input", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::input)
1514 		.addFunction ("output", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::output)
1515 		.endClass ()
1516 
1517 		.deriveWSPtrClass <SideChain, IOProcessor> ("SideChain")
1518 		.endClass ()
1519 
1520 		.deriveWSPtrClass <Delivery, IOProcessor> ("Delivery")
1521 		.addFunction ("panner_shell", &Route::panner_shell)
1522 		.endClass ()
1523 
1524 		.deriveWSPtrClass <Send, Delivery> ("Send")
1525 		.addCast<InternalSend> ("to_internalsend")
1526 		.addFunction ("get_delay_in", &Send::get_delay_in)
1527 		.addFunction ("get_delay_out", &Send::get_delay_out)
1528 		.addFunction ("gain_control", &Send::gain_control)
1529 		.addFunction ("is_foldback", &Send::is_foldback)
1530 		.addFunction ("set_remove_on_disconnect", &Send::set_remove_on_disconnect)
1531 		.endClass ()
1532 
1533 		.deriveWSPtrClass <InternalSend, Send> ("InternalSend")
1534 		.addFunction ("set_name", &InternalSend::set_name)
1535 		.addFunction ("display_name", &InternalSend::display_name)
1536 		.addFunction ("source_route", &InternalSend::source_route)
1537 		.addFunction ("target_route", &InternalSend::target_route)
1538 		.addFunction ("allow_feedback", &InternalSend::allow_feedback)
1539 		.addFunction ("set_allow_feedback", &InternalSend::set_allow_feedback)
1540 		.addFunction ("feeds", &InternalSend::feeds)
1541 		.endClass ()
1542 
1543 		.deriveWSPtrClass <Return, IOProcessor> ("Return")
1544 		.endClass ()
1545 
1546 		.deriveWSPtrClass <InternalReturn, Return> ("InternalReturn")
1547 		.endClass ()
1548 		.endNamespace (); // end ARDOUR
1549 
1550 	/* take a breath */
1551 	luabridge::getGlobalNamespace (L)
1552 		.beginNamespace ("ARDOUR")
1553 
1554 		.beginNamespace ("Plugin")
1555 		.beginClass <Plugin::IOPortDescription> ("IOPortDescription")
1556 		.addData ("name", &Plugin::IOPortDescription::name)
1557 		.addData ("is_sidechain", &Plugin::IOPortDescription::is_sidechain)
1558 		.addData ("group_name", &Plugin::IOPortDescription::group_name)
1559 		.addData ("group_channel", &Plugin::IOPortDescription::group_channel)
1560 		.endClass ()
1561 		.endNamespace ()
1562 
1563 		.deriveWSPtrClass <Plugin, PBD::StatefulDestructible> ("Plugin")
1564 		.addCast<LuaProc> ("to_luaproc")
1565 		.addFunction ("unique_id", &Plugin::unique_id)
1566 		.addFunction ("label", &Plugin::label)
1567 		.addFunction ("name", &Plugin::name)
1568 		.addFunction ("maker", &Plugin::maker)
1569 		.addFunction ("parameter_count", &Plugin::parameter_count)
1570 		.addFunction ("parameter_label", &Plugin::parameter_label)
1571 		.addRefFunction ("nth_parameter", &Plugin::nth_parameter)
1572 		.addFunction ("preset_by_label", &Plugin::preset_by_label)
1573 		.addFunction ("preset_by_uri", &Plugin::preset_by_uri)
1574 		.addFunction ("load_preset", &Plugin::load_preset)
1575 		.addFunction ("last_preset", &Plugin::last_preset)
1576 		.addFunction ("parameter_is_input", &Plugin::parameter_is_input)
1577 		.addFunction ("parameter_is_output", &Plugin::parameter_is_output)
1578 		.addFunction ("parameter_is_control", &Plugin::parameter_is_control)
1579 		.addFunction ("parameter_is_audio", &Plugin::parameter_is_audio)
1580 		.addFunction ("get_docs", &Plugin::get_docs)
1581 		.addFunction ("get_info", &Plugin::get_info)
1582 		.addFunction ("get_parameter_docs", &Plugin::get_parameter_docs)
1583 		.addFunction ("describe_io_port", &Plugin::describe_io_port)
1584 		.addRefFunction ("get_parameter_descriptor", &Plugin::get_parameter_descriptor)
1585 		.endClass ()
1586 
1587 		.deriveWSPtrClass <LuaProc, Plugin> ("LuaProc")
1588 		.addFunction ("shmem", &LuaProc::instance_shm)
1589 		.addFunction ("table", &LuaProc::instance_ref)
1590 		.endClass ()
1591 
1592 		.deriveWSPtrClass <PluginInsert, Processor> ("PluginInsert")
1593 		.addFunction ("plugin", &PluginInsert::plugin)
1594 		.addFunction ("activate", &PluginInsert::activate)
1595 		.addFunction ("deactivate", &PluginInsert::deactivate)
1596 		.addFunction ("enable", &PluginInsert::enable)
1597 		.addFunction ("enabled", &PluginInsert::enabled)
1598 		.addFunction ("strict_io_configured", &PluginInsert::strict_io_configured)
1599 		.addFunction ("write_immediate_event", &PluginInsert::write_immediate_event)
1600 		.addFunction ("thru_map", &PluginInsert::thru_map)
1601 		.addFunction ("input_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::input_map)
1602 		.addFunction ("output_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::output_map)
1603 		.addFunction ("set_thru_map", &PluginInsert::set_thru_map)
1604 		.addFunction ("set_input_map", &PluginInsert::set_input_map)
1605 		.addFunction ("set_output_map", &PluginInsert::set_output_map)
1606 		.addFunction ("natural_output_streams", &PluginInsert::natural_output_streams)
1607 		.addFunction ("natural_input_streams", &PluginInsert::natural_input_streams)
1608 		.addFunction ("reset_parameters_to_default", &PluginInsert::reset_parameters_to_default)
1609 		.addFunction ("has_sidechain", &PluginInsert::has_sidechain)
1610 		.addFunction ("sidechain_input", &PluginInsert::sidechain_input)
1611 		.addFunction ("is_instrument", &PluginInsert::is_instrument)
1612 		.addFunction ("type", &PluginInsert::type)
1613 		.addFunction ("signal_latency", &PluginInsert::signal_latency)
1614 		.addFunction ("get_count", &PluginInsert::get_count)
1615 		.addFunction ("is_channelstrip", &PluginInsert::is_channelstrip)
1616 		.addFunction ("clear_stats", &PluginInsert::clear_stats)
1617 		.addRefFunction ("get_stats", &PluginInsert::get_stats)
1618 		.endClass ()
1619 
1620 		.deriveWSPtrClass <ReadOnlyControl, PBD::StatefulDestructible> ("ReadOnlyControl")
1621 		.addFunction ("get_parameter", &ReadOnlyControl::get_parameter)
1622 		.addFunction ("describe_parameter", &ReadOnlyControl::describe_parameter)
1623 		.addFunction ("desc", &ReadOnlyControl::desc)
1624 		.endClass ()
1625 
1626 		.deriveWSPtrClass <AutomationControl, PBD::Controllable> ("AutomationControl")
1627 		.addCast<Evoral::Control> ("to_ctrl")
1628 		.addCast<SlavableAutomationControl> ("to_slavable")
1629 		.addFunction ("automation_state", &AutomationControl::automation_state)
1630 		.addFunction ("set_automation_state", &AutomationControl::set_automation_state)
1631 		.addFunction ("start_touch", &AutomationControl::start_touch)
1632 		.addFunction ("stop_touch", &AutomationControl::stop_touch)
1633 		.addFunction ("get_value", &AutomationControl::get_value)
1634 		.addFunction ("set_value", &AutomationControl::set_value)
1635 		.addFunction ("writable", &AutomationControl::writable)
1636 		.addFunction ("alist", &AutomationControl::alist)
1637 		.addFunction ("desc", &AutomationControl::desc)
1638 		.addFunction ("lower", &AutomationControl::lower)
1639 		.addFunction ("upper", &AutomationControl::upper)
1640 		.addFunction ("normal", &AutomationControl::normal)
1641 		.addFunction ("toggled", &AutomationControl::toggled)
1642 		.endClass ()
1643 
1644 		.deriveWSPtrClass <SlavableAutomationControl, AutomationControl> ("SlavableAutomationControl")
1645 		.addFunction ("add_master", &SlavableAutomationControl::add_master)
1646 		.addFunction ("remove_master", &SlavableAutomationControl::remove_master)
1647 		.addFunction ("clear_masters", &SlavableAutomationControl::clear_masters)
1648 		.addFunction ("slaved_to", &SlavableAutomationControl::slaved_to)
1649 		.addFunction ("slaved", &SlavableAutomationControl::slaved)
1650 		.addFunction ("get_masters_value", &SlavableAutomationControl::get_masters_value)
1651 		.addFunction ("get_boolean_masters", &SlavableAutomationControl::get_boolean_masters)
1652 		//.addFunction ("masters", &SlavableAutomationControl::masters) // not implemented
1653 		.endClass ()
1654 
1655 		.deriveWSPtrClass <PhaseControl, AutomationControl> ("PhaseControl")
1656 		.addFunction ("set_phase_invert", (void(PhaseControl::*)(uint32_t, bool))&PhaseControl::set_phase_invert)
1657 		.addFunction ("inverted", &PhaseControl::inverted)
1658 		.endClass ()
1659 
1660 		.deriveWSPtrClass <GainControl, SlavableAutomationControl> ("GainControl")
1661 		.endClass ()
1662 
1663 		.deriveWSPtrClass <MonitorControl, SlavableAutomationControl> ("MonitorControl")
1664 		.addFunction ("monitoring_choice", &MonitorControl::monitoring_choice)
1665 		.endClass ()
1666 
1667 		.deriveWSPtrClass <SoloControl, SlavableAutomationControl> ("SoloControl")
1668 		.addFunction ("can_solo", &SoloControl::can_solo)
1669 		.addFunction ("soloed", &SoloControl::soloed)
1670 		.addFunction ("self_soloed", &SoloControl::self_soloed)
1671 		.endClass ()
1672 
1673 		.deriveWSPtrClass <MuteControl, SlavableAutomationControl> ("MuteControl")
1674 		.addFunction ("muted", &MuteControl::muted)
1675 		.addFunction ("muted_by_self", &MuteControl::muted_by_self)
1676 		.endClass ()
1677 
1678 		.deriveWSPtrClass <SoloIsolateControl, SlavableAutomationControl> ("SoloIsolateControl")
1679 		.addFunction ("solo_isolated", &SoloIsolateControl::solo_isolated)
1680 		.addFunction ("self_solo_isolated", &SoloIsolateControl::self_solo_isolated)
1681 		.endClass ()
1682 
1683 		.deriveWSPtrClass <SoloSafeControl, SlavableAutomationControl> ("SoloSafeControl")
1684 		.addFunction ("solo_safe", &SoloSafeControl::solo_safe)
1685 		.endClass ()
1686 
1687 		.deriveWSPtrClass <Amp, Processor> ("Amp")
1688 		.addFunction ("gain_control", (boost::shared_ptr<GainControl>(Amp::*)())&Amp::gain_control)
1689 		.addStaticFunction ("apply_gain", static_cast<gain_t (*)(AudioBuffer&, samplecnt_t, samplecnt_t, gain_t, gain_t, sampleoffset_t)>(&Amp::apply_gain))
1690 		.endClass ()
1691 
1692 		.deriveWSPtrClass <PeakMeter, Processor> ("PeakMeter")
1693 		.addFunction ("meter_level", &PeakMeter::meter_level)
1694 		.addFunction ("set_meter_type", &PeakMeter::set_meter_type)
1695 		.addFunction ("meter_type", &PeakMeter::meter_type)
1696 		.addFunction ("reset_max", &PeakMeter::reset_max)
1697 		.endClass ()
1698 
1699 		.deriveWSPtrClass <MonitorProcessor, Processor> ("MonitorProcessor")
1700 		.addFunction ("set_cut_all", &MonitorProcessor::set_cut_all)
1701 		.addFunction ("set_dim_all", &MonitorProcessor::set_dim_all)
1702 		.addFunction ("set_polarity", &MonitorProcessor::set_polarity)
1703 		.addFunction ("set_cut", &MonitorProcessor::set_cut)
1704 		.addFunction ("set_dim", &MonitorProcessor::set_dim)
1705 		.addFunction ("set_solo", &MonitorProcessor::set_solo)
1706 		.addFunction ("set_mono", &MonitorProcessor::set_mono)
1707 		.addFunction ("dim_level", &MonitorProcessor::dim_level)
1708 		.addFunction ("solo_boost_level", &MonitorProcessor::solo_boost_level)
1709 		.addFunction ("dimmed", &MonitorProcessor::dimmed)
1710 		.addFunction ("soloed", &MonitorProcessor::soloed)
1711 		.addFunction ("inverted", &MonitorProcessor::inverted)
1712 		.addFunction ("cut", &MonitorProcessor::cut)
1713 		.addFunction ("cut_all", &MonitorProcessor::cut_all)
1714 		.addFunction ("dim_all", &MonitorProcessor::dim_all)
1715 		.addFunction ("mono", &MonitorProcessor::mono)
1716 		.addFunction ("monitor_active", &MonitorProcessor::monitor_active)
1717 		.addFunction ("channel_cut_control", &MonitorProcessor::channel_cut_control)
1718 		.addFunction ("channel_dim_control", &MonitorProcessor::channel_dim_control)
1719 		.addFunction ("channel_polarity_control", &MonitorProcessor::channel_polarity_control)
1720 		.addFunction ("channel_solo_control", &MonitorProcessor::channel_solo_control)
1721 		.addFunction ("dim_control", &MonitorProcessor::dim_control)
1722 		.addFunction ("cut_control", &MonitorProcessor::cut_control)
1723 		.addFunction ("mono_control", &MonitorProcessor::mono_control)
1724 		.addFunction ("dim_level_control", &MonitorProcessor::dim_level_control)
1725 		.addFunction ("solo_boost_control", &MonitorProcessor::solo_boost_control)
1726 		.endClass ()
1727 
1728 		.deriveWSPtrClass <UnknownProcessor, Processor> ("UnknownProcessor")
1729 		.endClass ()
1730 
1731 		.deriveWSPtrClass <PolarityProcessor, Processor> ("PolarityProcessor")
1732 		.endClass ()
1733 
1734 		.deriveWSPtrClass <DelayLine, Processor> ("DelayLine")
1735 		.addFunction ("delay", &DelayLine::delay)
1736 		.endClass ()
1737 
1738 		.deriveWSPtrClass <PluginInsert::PluginControl, AutomationControl> ("PluginControl")
1739 		.endClass ()
1740 
1741 		.beginClass <RawMidiParser> ("RawMidiParser")
1742 		.addVoidConstructor ()
1743 		.addFunction ("reset", &RawMidiParser::reset)
1744 		.addFunction ("process_byte", &RawMidiParser::process_byte)
1745 		.addFunction ("buffer_size", &RawMidiParser::buffer_size)
1746 		.addFunction ("midi_buffer", &RawMidiParser::midi_buffer)
1747 		.endClass ()
1748 
1749 		.deriveWSPtrClass <AudioSource, Source> ("AudioSource")
1750 		.addFunction ("readable_length", &AudioSource::readable_length)
1751 		.addFunction ("n_channels", &AudioSource::n_channels)
1752 		.endClass ()
1753 
1754 		// <std::list<boost::shared_ptr <AudioTrack> >
1755 		.beginStdList <boost::shared_ptr<AudioTrack> > ("AudioTrackList")
1756 		.endClass ()
1757 
1758 		// std::list<boost::shared_ptr <MidiTrack> >
1759 		.beginStdList <boost::shared_ptr<MidiTrack> > ("MidiTrackList")
1760 		.endClass ()
1761 
1762 		// RouteList == std::list<boost::shared_ptr<Route> >
1763 		.beginConstStdList <boost::shared_ptr<Route> > ("RouteList")
1764 		.endClass ()
1765 
1766 		// StripableList == std::list<boost::shared_ptr<Stripable> >
1767 		.beginConstStdList <boost::shared_ptr<Stripable> > ("StripableList")
1768 		.endClass ()
1769 
1770 		// VCAList == std::list<boost::shared_ptr<VCA> >
1771 		.beginConstStdList <boost::shared_ptr<VCA> > ("VCAList")
1772 		.endClass ()
1773 
1774 		// VCAVector == std::vector<boost::shared_ptr<VCA> >
1775 		.beginConstStdVector <boost::shared_ptr<VCA> > ("VCAVector")
1776 		.endClass ()
1777 
1778 		// boost::shared_ptr<RouteList>
1779 		.beginPtrStdList <boost::shared_ptr<Route> > ("RouteListPtr")
1780 		.addVoidPtrConstructor<std::list<boost::shared_ptr <Route> > > ()
1781 		.endClass ()
1782 
1783 		// boost::shared_ptr<BundleList>
1784 		.beginPtrStdVector <boost::shared_ptr<Bundle> > ("BundleListPtr")
1785 		.addVoidPtrConstructor<std::vector<boost::shared_ptr <Bundle> > > ()
1786 		.endClass ()
1787 
1788 		// typedef std::list<boost::weak_ptr <Route> > WeakRouteList
1789 		.beginConstStdList <boost::weak_ptr<Route> > ("WeakRouteList")
1790 		.endClass ()
1791 
1792 		// RouteGroupList == std::list<RouteGroup*>
1793 		.beginConstStdCPtrList <RouteGroup> ("RouteGroupList")
1794 		.endClass ()
1795 
1796 		// typedef std::vector<boost::shared_ptr<Source> > Region::SourceList
1797 		.beginStdVector <boost::shared_ptr<Source> > ("SourceList")
1798 		.endClass ()
1799 
1800 		// typedef std::vector<boost::shared_ptr<Readable> >
1801 		.beginStdVector <boost::shared_ptr<Readable> > ("ReadableList")
1802 		.endClass ()
1803 
1804 		// from SessionPlaylists: std::vector<boost::shared_ptr<Playlist > >
1805 		.beginStdVector <boost::shared_ptr<Playlist> > ("PlaylistList")
1806 		.endClass ()
1807 
1808 		// std::list< boost::weak_ptr <AudioSource> >
1809 		.beginConstStdList <boost::weak_ptr<AudioSource> > ("WeakAudioSourceList")
1810 		.endClass ()
1811 
1812 		// typedef std::vector<boost::shared_ptr<Region> > RegionVector
1813 		.beginStdVector <boost::shared_ptr<Region> > ("RegionVector")
1814 		.endClass ()
1815 
1816 		// typedef std::vector<samplepos_t> XrunPositions
1817 		.beginStdVector <samplepos_t> ("XrunPositions")
1818 		.endClass ()
1819 
1820 		// typedef std::list<boost::shared_ptr<Region> > RegionList
1821 		.beginConstStdList <boost::shared_ptr<Region> > ("RegionList")
1822 		.endClass ()
1823 
1824 		// boost::shared_ptr <std::list<boost::shared_ptr<Region> > >
1825 		.beginPtrStdList <boost::shared_ptr<Region> > ("RegionListPtr")
1826 		.addVoidPtrConstructor<std::list<boost::shared_ptr <Region> > > ()
1827 		.endClass ()
1828 
1829 		// RegionFactory::RegionMap
1830 		.beginStdMap <PBD::ID,boost::shared_ptr<Region> > ("RegionMap")
1831 		.endClass ()
1832 
1833 		// typedef std::map<std::string, DPM> PortManager::AudioPortMeters;
1834 		.beginStdMap <std::string, PortManager::DPM> ("AudioPortMeters")
1835 		.endClass ()
1836 
1837 		// typedef std::map<std::string, MPM> PortManager::MIDIPortMeters;
1838 		.beginStdMap <std::string, PortManager::MPM> ("MIDIPortMeters")
1839 		.endClass ()
1840 
1841 		// typedef std::list<boost::shared_ptr<Processor> > ProcessorList
1842 		.beginStdList <boost::shared_ptr<Processor> > ("ProcessorList")
1843 		.endClass ()
1844 
1845 		//std::list<boost::shared_ptr<Port> > PortList
1846 		.beginConstStdList <boost::shared_ptr<Port> > ("PortList")
1847 		.endClass ()
1848 
1849 		// used by Playlist::cut/copy
1850 		.beginConstStdList <AudioRange> ("AudioRangeList")
1851 		.endClass ()
1852 
1853 		.beginConstStdCPtrList <Location> ("LocationList")
1854 		.endClass ()
1855 
1856 		.beginConstStdVector <Evoral::Parameter> ("ParameterList")
1857 		.endClass ()
1858 
1859 		// std::list<boost::shared_ptr<AutomationControl> > ControlList
1860 		.beginStdList <boost::shared_ptr<AutomationControl> > ("ControlList")
1861 		.endClass ()
1862 
1863 		.beginPtrStdList <boost::shared_ptr<AutomationControl> > ("ControlListPtr")
1864 		.addVoidPtrConstructor<std::list<boost::shared_ptr <AutomationControl> > > ()
1865 		.endClass ()
1866 
1867 		.beginStdList <boost::shared_ptr<Evoral::Note<Temporal::Beats> > > ("NotePtrList")
1868 		.endClass ()
1869 
1870 		.beginConstStdCPtrList <Evoral::ControlEvent> ("EventList")
1871 		.endClass ()
1872 
1873 #if 0  // depends on Evoal:: Note, Beats see note_fixer.h
1874 	// typedef Evoral::Note<Temporal::Beats> Note
1875 	// std::set< boost::weak_ptr<Note> >
1876 		.beginStdSet <boost::weak_ptr<Note> > ("WeakNoteSet")
1877 		.endClass ()
1878 #endif
1879 
1880 	// std::list<boost::weak_ptr<Source> >
1881 		.beginConstStdList <boost::weak_ptr<Source> > ("WeakSourceList")
1882 		.endClass ()
1883 
1884 		.beginClass <Tempo> ("Tempo")
1885 		.addConstructor <void (*) (double, double, double)> ()
1886 		.addFunction ("note_type", &Tempo::note_type)
1887 		.addFunction ("note_types_per_minute",  (double (Tempo::*)() const)&Tempo::note_types_per_minute)
1888 		.addFunction ("end_note_types_per_minute",  (double (Tempo::*)() const)&Tempo::end_note_types_per_minute)
1889 		.addFunction ("quarter_notes_per_minute", &Tempo::quarter_notes_per_minute)
1890 		.addFunction ("samples_per_quarter_note", &Tempo::samples_per_quarter_note)
1891 		.addFunction ("samples_per_note_type", &Tempo::samples_per_note_type)
1892 		.endClass ()
1893 
1894 		.beginClass <Meter> ("Meter")
1895 		.addConstructor <void (*) (double, double)> ()
1896 		.addFunction ("divisions_per_bar", &Meter::divisions_per_bar)
1897 		.addFunction ("note_divisor", &Meter::note_divisor)
1898 		.addFunction ("samples_per_bar", &Meter::samples_per_bar)
1899 		.addFunction ("samples_per_grid", &Meter::samples_per_grid)
1900 		.endClass ()
1901 
1902 		.beginClass <BeatsSamplesConverter> ("BeatsSamplesConverter")
1903 		.addConstructor <void (*) (const TempoMap&, samplepos_t)> ()
1904 		.addFunction ("to", &BeatsSamplesConverter::to)
1905 		.addFunction ("from", &BeatsSamplesConverter::from)
1906 		.endClass ()
1907 
1908 		.beginClass <DoubleBeatsSamplesConverter> ("DoubleBeatsSamplesConverter")
1909 		.addConstructor <void (*) (const TempoMap&, samplepos_t)> ()
1910 		.addFunction ("to", &DoubleBeatsSamplesConverter::to)
1911 		.addFunction ("from", &DoubleBeatsSamplesConverter::from)
1912 		.endClass ()
1913 
1914 		.beginClass <TempoMap> ("TempoMap")
1915 		.addFunction ("add_tempo", &TempoMap::add_tempo)
1916 		.addFunction ("add_meter", &TempoMap::add_meter)
1917 		.addFunction ("tempo_section_at_sample", (TempoSection& (TempoMap::*)(samplepos_t))&TempoMap::tempo_section_at_sample)
1918 		.addFunction ("meter_section_at_sample", &TempoMap::meter_section_at_sample)
1919 		.addFunction ("meter_section_at_beat", &TempoMap::meter_section_at_beat)
1920 		.addFunction ("bbt_at_sample", &TempoMap::bbt_at_sample)
1921 		.addFunction ("exact_beat_at_sample", &TempoMap::exact_beat_at_sample)
1922 		.addFunction ("exact_qn_at_sample", &TempoMap::exact_qn_at_sample)
1923 		.addFunction ("samplepos_plus_qn", &TempoMap::samplepos_plus_qn)
1924 		.addFunction ("framewalk_to_qn", &TempoMap::framewalk_to_qn)
1925 		.addFunction ("previous_tempo_section", &TempoMap::previous_tempo_section)
1926 		.addFunction ("next_tempo_section", &TempoMap::next_tempo_section)
1927 		.endClass ()
1928 
1929 		.beginClass <MetricSection> ("MetricSection")
1930 		.addFunction ("pulse", &MetricSection::pulse)
1931 		.addFunction ("set_pulse", &MetricSection::set_pulse)
1932 		.addFunction ("sample", &MetricSection::sample)
1933 		.addFunction ("minute", &MetricSection::minute)
1934 		.addFunction ("initial", &MetricSection::initial)
1935 		.addFunction ("is_tempo", &MetricSection::is_tempo)
1936 		.addFunction ("sample_at_minute", &MetricSection::sample_at_minute)
1937 		.addFunction ("minute_at_sample", &MetricSection::minute_at_sample)
1938 		.endClass ()
1939 
1940 		.deriveClass <TempoSection, MetricSection> ("TempoSection")
1941 		.addCast<Tempo> ("to_tempo")
1942 		.addFunction ("c", (double(TempoSection::*)()const)&TempoSection::c)
1943 		.addFunction ("active", &TempoSection::active)
1944 		.addFunction ("locked_to_meter", &TempoSection::locked_to_meter)
1945 		.addFunction ("clamped", &TempoSection::clamped)
1946 		.endClass ()
1947 
1948 		.deriveClass <MeterSection, MetricSection> ("MeterSection")
1949 		.addCast<Meter> ("to_meter")
1950 		.addFunction ("bbt", &MeterSection::bbt)
1951 		.addFunction ("beat", &MeterSection::beat)
1952 		.addFunction ("set_beat", (void(MeterSection::*)(double))&MeterSection::set_beat)
1953 		.endClass ()
1954 
1955 		.beginClass <ChanCount> ("ChanCount")
1956 		.addConstructor <void (*) (DataType, uint32_t)> ()
1957 		.addFunction ("get", &ChanCount::get)
1958 		.addFunction ("set", &ChanCount::set)
1959 		.addFunction ("set_audio", &ChanCount::set_audio)
1960 		.addFunction ("set_midi", &ChanCount::set_midi)
1961 		.addFunction ("n_audio", &ChanCount::n_audio)
1962 		.addFunction ("n_midi", &ChanCount::n_midi)
1963 		.addFunction ("n_total", &ChanCount::n_total)
1964 		.addFunction ("reset", &ChanCount::reset)
1965 		.endClass()
1966 
1967 		.beginClass <DataType> ("DataType")
1968 		.addConstructor <void (*) (std::string)> ()
1969 		.addStaticCFunction ("null",  &LuaAPI::datatype_ctor_null) // "nil" is a lua reseved word
1970 		.addStaticCFunction ("audio", &LuaAPI::datatype_ctor_audio)
1971 		.addStaticCFunction ("midi",  &LuaAPI::datatype_ctor_midi)
1972 		.addFunction ("to_string",  &DataType::to_string) // TODO Lua __tostring
1973 		// TODO add uint32_t cast, add operator==  !=
1974 		.endClass()
1975 
1976 		/* libardour enums */
1977 		.beginNamespace ("PluginType")
1978 		.addFunction ("name", &PluginManager::plugin_type_name)
1979 		.addConst ("AudioUnit", ARDOUR::PluginType(AudioUnit))
1980 		.addConst ("LADSPA", ARDOUR::PluginType(LADSPA))
1981 		.addConst ("LV2", ARDOUR::PluginType(LV2))
1982 		.addConst ("Windows_VST", ARDOUR::PluginType(Windows_VST))
1983 		.addConst ("LXVST", ARDOUR::PluginType(LXVST))
1984 		.addConst ("MacVST", ARDOUR::PluginType(MacVST))
1985 		.addConst ("Lua", ARDOUR::PluginType(Lua))
1986 		.addConst ("VST3", ARDOUR::PluginType(VST3))
1987 		.endNamespace ()
1988 
1989 		.beginNamespace ("PresentationInfo")
1990 		.beginNamespace ("Flag")
1991 		.addConst ("AudioTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioTrack))
1992 		.addConst ("MidiTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiTrack))
1993 		.addConst ("AudioBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioBus))
1994 		.addConst ("MidiBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiBus))
1995 		.addConst ("VCA", ARDOUR::PresentationInfo::Flag(PresentationInfo::VCA))
1996 		.addConst ("MasterOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MasterOut))
1997 		.addConst ("MonitorOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MonitorOut))
1998 		.addConst ("Auditioner", ARDOUR::PresentationInfo::Flag(PresentationInfo::Auditioner))
1999 		.addConst ("Hidden", ARDOUR::PresentationInfo::Flag(PresentationInfo::Hidden))
2000 		.addConst ("GroupOrderSet", ARDOUR::PresentationInfo::Flag(PresentationInfo::OrderSet))
2001 		.addConst ("StatusMask", ARDOUR::PresentationInfo::Flag(PresentationInfo::StatusMask))
2002 		.endNamespace ()
2003 		.endNamespace ()
2004 
2005 		.beginNamespace ("AutoState")
2006 		.addConst ("Off", ARDOUR::AutoState(Off))
2007 		.addConst ("Write", ARDOUR::AutoState(Write))
2008 		.addConst ("Touch", ARDOUR::AutoState(Touch))
2009 		.addConst ("Play", ARDOUR::AutoState(Play))
2010 		.addConst ("Latch", ARDOUR::AutoState(Latch))
2011 		.endNamespace ()
2012 
2013 		.beginNamespace ("AutomationType")
2014 		.addConst ("GainAutomation", ARDOUR::AutomationType(GainAutomation))
2015 		.addConst ("BusSendLevel", ARDOUR::AutomationType(BusSendLevel))
2016 		.addConst ("PluginAutomation", ARDOUR::AutomationType(PluginAutomation))
2017 		.addConst ("SoloAutomation", ARDOUR::AutomationType(SoloAutomation))
2018 		.addConst ("SoloIsolateAutomation", ARDOUR::AutomationType(SoloIsolateAutomation))
2019 		.addConst ("SoloSafeAutomation", ARDOUR::AutomationType(SoloSafeAutomation))
2020 		.addConst ("MuteAutomation", ARDOUR::AutomationType(MuteAutomation))
2021 		.addConst ("RecEnableAutomation", ARDOUR::AutomationType(RecEnableAutomation))
2022 		.addConst ("RecSafeAutomation", ARDOUR::AutomationType(RecSafeAutomation))
2023 		.addConst ("TrimAutomation", ARDOUR::AutomationType(TrimAutomation))
2024 		.addConst ("PhaseAutomation", ARDOUR::AutomationType(PhaseAutomation))
2025 		.addConst ("MidiCCAutomation", ARDOUR::AutomationType(MidiCCAutomation))
2026 		.addConst ("MidiPgmChangeAutomation", ARDOUR::AutomationType(MidiPgmChangeAutomation))
2027 		.addConst ("MidiPitchBenderAutomation", ARDOUR::AutomationType(MidiPitchBenderAutomation))
2028 		.addConst ("MidiChannelPressureAutomation", ARDOUR::AutomationType(MidiChannelPressureAutomation))
2029 		.addConst ("MidiNotePressureAutomation", ARDOUR::AutomationType(MidiNotePressureAutomation))
2030 		.addConst ("MidiSystemExclusiveAutomation", ARDOUR::AutomationType(MidiSystemExclusiveAutomation))
2031 		.endNamespace ()
2032 
2033 		.beginNamespace ("SrcQuality")
2034 		.addConst ("SrcBest", ARDOUR::SrcQuality(SrcBest))
2035 		.endNamespace ()
2036 
2037 		.beginNamespace ("MeterType")
2038 		.addConst ("MeterMaxSignal", ARDOUR::MeterType(MeterMaxSignal))
2039 		.addConst ("MeterMaxPeak", ARDOUR::MeterType(MeterMaxPeak))
2040 		.addConst ("MeterPeak", ARDOUR::MeterType(MeterPeak))
2041 		.addConst ("MeterKrms", ARDOUR::MeterType(MeterKrms))
2042 		.addConst ("MeterK20", ARDOUR::MeterType(MeterK20))
2043 		.addConst ("MeterK14", ARDOUR::MeterType(MeterK14))
2044 		.addConst ("MeterIEC1DIN", ARDOUR::MeterType(MeterIEC1DIN))
2045 		.addConst ("MeterIEC1NOR", ARDOUR::MeterType(MeterIEC1NOR))
2046 		.addConst ("MeterIEC2BBC", ARDOUR::MeterType(MeterIEC2BBC))
2047 		.addConst ("MeterIEC2EBU", ARDOUR::MeterType(MeterIEC2EBU))
2048 		.addConst ("MeterVU", ARDOUR::MeterType(MeterVU))
2049 		.addConst ("MeterK12", ARDOUR::MeterType(MeterK12))
2050 		.addConst ("MeterPeak0dB", ARDOUR::MeterType(MeterPeak0dB))
2051 		.addConst ("MeterMCP", ARDOUR::MeterType(MeterMCP))
2052 		.endNamespace ()
2053 
2054 		.beginNamespace ("MeterPoint")
2055 		.addConst ("MeterInput", ARDOUR::MeterPoint(MeterInput))
2056 		.addConst ("MeterPreFader", ARDOUR::MeterPoint(MeterPreFader))
2057 		.addConst ("MeterPostFader", ARDOUR::MeterPoint(MeterPostFader))
2058 		.addConst ("MeterOutput", ARDOUR::MeterPoint(MeterOutput))
2059 		.addConst ("MeterCustom", ARDOUR::MeterPoint(MeterCustom))
2060 		.endNamespace ()
2061 
2062 		.beginNamespace ("Placement")
2063 		.addConst ("PreFader", ARDOUR::Placement(PreFader))
2064 		.addConst ("PostFader", ARDOUR::Placement(PostFader))
2065 		.endNamespace ()
2066 
2067 		.beginNamespace ("MonitorChoice")
2068 		.addConst ("MonitorAuto", ARDOUR::MonitorChoice(MonitorAuto))
2069 		.addConst ("MonitorInput", ARDOUR::MonitorChoice(MonitorInput))
2070 		.addConst ("MonitorDisk", ARDOUR::MonitorChoice(MonitorDisk))
2071 		.addConst ("MonitorCue", ARDOUR::MonitorChoice(MonitorCue))
2072 		.endNamespace ()
2073 
2074 		.beginNamespace ("MonitorState")
2075 		.addConst ("MonitoringSilence", ARDOUR::MonitorState(MonitoringSilence))
2076 		.addConst ("MonitoringInput", ARDOUR::MonitorState(MonitoringInput))
2077 		.addConst ("MonitoringDisk", ARDOUR::MonitorState(MonitoringDisk))
2078 		.addConst ("MonitoringCue", ARDOUR::MonitorState(MonitoringCue))
2079 		.endNamespace ()
2080 
2081 		.beginNamespace ("NoteMode")
2082 		.addConst ("Sustained", ARDOUR::NoteMode(Sustained))
2083 		.addConst ("Percussive", ARDOUR::NoteMode(Percussive))
2084 		.endNamespace ()
2085 
2086 		.beginNamespace ("PortFlags")
2087 		.addConst ("IsInput", ARDOUR::PortFlags(IsInput))
2088 		.addConst ("IsOutput", ARDOUR::PortFlags(IsOutput))
2089 		.addConst ("IsPhysical", ARDOUR::PortFlags(IsPhysical))
2090 		.addConst ("CanMonitor", ARDOUR::PortFlags(CanMonitor))
2091 		.addConst ("IsTerminal", ARDOUR::PortFlags(IsTerminal))
2092 		.endNamespace ()
2093 
2094 		.beginNamespace ("MidiPortFlags")
2095 		.addConst ("MidiPortMusic", ARDOUR::MidiPortFlags(MidiPortMusic))
2096 		.addConst ("MidiPortControl", ARDOUR::MidiPortFlags(MidiPortControl))
2097 		.addConst ("MidiPortSelection", ARDOUR::MidiPortFlags(MidiPortSelection))
2098 		.addConst ("MidiPortVirtual", ARDOUR::MidiPortFlags(MidiPortVirtual))
2099 		.endNamespace ()
2100 
2101 		.beginNamespace ("PlaylistDisposition")
2102 		.addConst ("CopyPlaylist", ARDOUR::PlaylistDisposition(CopyPlaylist))
2103 		.addConst ("NewPlaylist", ARDOUR::PlaylistDisposition(NewPlaylist))
2104 		.addConst ("SharePlaylist", ARDOUR::PlaylistDisposition(SharePlaylist))
2105 		.endNamespace ()
2106 
2107 		.beginNamespace ("MidiTrackNameSource")
2108 		.addConst ("SMFTrackNumber", ARDOUR::MidiTrackNameSource(SMFTrackNumber))
2109 		.addConst ("SMFTrackName", ARDOUR::MidiTrackNameSource(SMFTrackName))
2110 		.addConst ("SMFInstrumentName", ARDOUR::MidiTrackNameSource(SMFInstrumentName))
2111 		.endNamespace ()
2112 
2113 		.beginNamespace ("MidiTempoMapDisposition")
2114 		.addConst ("SMFTempoIgnore", ARDOUR::MidiTempoMapDisposition(SMFTempoIgnore))
2115 		.addConst ("SMFTempoUse", ARDOUR::MidiTempoMapDisposition(SMFTempoUse))
2116 		.endNamespace ()
2117 
2118 		.beginNamespace ("RegionEquivalence")
2119 		.addConst ("Exact", ARDOUR::RegionEquivalence(Exact))
2120 		.addConst ("Enclosed", ARDOUR::RegionEquivalence(Enclosed))
2121 		.addConst ("Overlap", ARDOUR::RegionEquivalence(Overlap))
2122 		.addConst ("LayerTime", ARDOUR::RegionEquivalence(LayerTime))
2123 		.endNamespace ()
2124 
2125 		.beginNamespace ("RegionPoint")
2126 		.addConst ("Start", ARDOUR::RegionPoint(Start))
2127 		.addConst ("End", ARDOUR::RegionPoint(End))
2128 		.addConst ("SyncPoint", ARDOUR::RegionPoint(SyncPoint))
2129 		.endNamespace ()
2130 
2131 		.beginNamespace ("TempoSection")
2132 		.beginNamespace ("PositionLockStyle")
2133 		.addConst ("AudioTime", ARDOUR::PositionLockStyle(AudioTime))
2134 		.addConst ("MusicTime", ARDOUR::PositionLockStyle(MusicTime))
2135 		.endNamespace ()
2136 		.endNamespace ()
2137 
2138 		.beginNamespace ("TempoSection")
2139 		.beginNamespace ("Type")
2140 		.addConst ("Ramp", ARDOUR::TempoSection::Type(TempoSection::Ramp))
2141 		.addConst ("Constant", ARDOUR::TempoSection::Type(TempoSection::Constant))
2142 		.endNamespace ()
2143 		.endNamespace ()
2144 
2145 		.beginNamespace ("TrackMode")
2146 		.addConst ("Normal", ARDOUR::TrackMode(Start))
2147 		.addConst ("NonLayered", ARDOUR::TrackMode(NonLayered))
2148 		.endNamespace ()
2149 
2150 		.beginNamespace ("TransportRequestSource")
2151 		.addConst ("TRS_Engine", ARDOUR::TransportRequestSource(TRS_Engine))
2152 		.addConst ("TRS_UI", ARDOUR::TransportRequestSource(TRS_UI))
2153 		.endNamespace ()
2154 
2155 		.beginNamespace ("LocateTransportDisposition")
2156 		.addConst ("MustRoll", ARDOUR::LocateTransportDisposition(MustRoll))
2157 		.addConst ("MustStop", ARDOUR::LocateTransportDisposition(MustStop))
2158 		.addConst ("RollIfAppropriate", ARDOUR::LocateTransportDisposition(RollIfAppropriate))
2159 		.endNamespace ()
2160 
2161 		.beginNamespace ("SampleFormat")
2162 		.addConst ("Float", ARDOUR::SampleFormat(FormatFloat))
2163 		.addConst ("Int24", ARDOUR::SampleFormat(FormatInt24))
2164 		.addConst ("Int16", ARDOUR::SampleFormat(FormatInt16))
2165 		.endNamespace ()
2166 
2167 		.beginNamespace ("HeaderFormat")
2168 		.addConst ("BWF", ARDOUR::HeaderFormat(BWF))
2169 		.addConst ("WAVE", ARDOUR::HeaderFormat(WAVE))
2170 		.addConst ("WAVE64", ARDOUR::HeaderFormat(WAVE64))
2171 		.addConst ("CAF", ARDOUR::HeaderFormat(CAF))
2172 		.addConst ("AIFF", ARDOUR::HeaderFormat(AIFF))
2173 		.addConst ("iXML", ARDOUR::HeaderFormat(iXML))
2174 		.addConst ("RF64", ARDOUR::HeaderFormat(RF64))
2175 		.addConst ("RF64_WAV", ARDOUR::HeaderFormat(RF64_WAV))
2176 		.addConst ("MBWF", ARDOUR::HeaderFormat(MBWF))
2177 		.addConst ("FLAC", ARDOUR::HeaderFormat(FLAC))
2178 		.endNamespace ()
2179 
2180 		.beginNamespace ("InsertMergePolicy")
2181 		.addConst ("Reject", ARDOUR::InsertMergePolicy(InsertMergeReject))
2182 		.addConst ("Relax", ARDOUR::InsertMergePolicy(InsertMergeRelax))
2183 		.addConst ("Replace", ARDOUR::InsertMergePolicy(InsertMergeReplace))
2184 		.addConst ("TruncateExisting", ARDOUR::InsertMergePolicy(InsertMergeTruncateExisting))
2185 		.addConst ("TruncateAddition", ARDOUR::InsertMergePolicy(InsertMergeTruncateAddition))
2186 		.addConst ("Extend", ARDOUR::InsertMergePolicy(InsertMergeExtend))
2187 		.endNamespace ()
2188 
2189 		.beginNamespace ("AFLPosition")
2190 		.addConst ("AFLFromBeforeProcessors", ARDOUR::AFLPosition(AFLFromBeforeProcessors))
2191 		.addConst ("AFLFromAfterProcessors", ARDOUR::AFLPosition(AFLFromAfterProcessors))
2192 		.endNamespace ()
2193 
2194 		.beginNamespace ("PFLPosition")
2195 		.addConst ("PFLFromBeforeProcessors", ARDOUR::PFLPosition(PFLFromBeforeProcessors))
2196 		.addConst ("PFLFromAfterProcessors", ARDOUR::PFLPosition(PFLFromAfterProcessors))
2197 		.endNamespace ()
2198 
2199 		.beginNamespace ("AutoReturnTarget")
2200 		.addConst ("LastLocate", ARDOUR::AutoReturnTarget(LastLocate))
2201 		.addConst ("RangeSelectionStart", ARDOUR::AutoReturnTarget(RangeSelectionStart))
2202 		.addConst ("Loop", ARDOUR::AutoReturnTarget(Loop))
2203 		.addConst ("RegionSelectionStart", ARDOUR::AutoReturnTarget(RegionSelectionStart))
2204 		.endNamespace ()
2205 
2206 		.beginNamespace ("FadeShape")
2207 		.addConst ("FadeLinear", ARDOUR::FadeShape(FadeLinear))
2208 		.addConst ("FadeFast", ARDOUR::FadeShape(FadeFast))
2209 		.addConst ("FadeSlow", ARDOUR::FadeShape(FadeSlow))
2210 		.addConst ("FadeConstantPower", ARDOUR::FadeShape(FadeConstantPower))
2211 		.addConst ("FadeSymmetric", ARDOUR::FadeShape(FadeSymmetric))
2212 		.endNamespace ()
2213 
2214 		.beginNamespace ("LoopFadeChoice")
2215 		.addConst ("NoLoopFade", ARDOUR::LoopFadeChoice(NoLoopFade))
2216 		.addConst ("EndLoopFade", ARDOUR::LoopFadeChoice(EndLoopFade))
2217 		.addConst ("BothLoopFade", ARDOUR::LoopFadeChoice(BothLoopFade))
2218 		.addConst ("XFadeLoop", ARDOUR::LoopFadeChoice(XFadeLoop))
2219 		.endNamespace ()
2220 
2221 		.beginNamespace ("DenormalModel")
2222 		.addConst ("DenormalNone", ARDOUR::DenormalModel(DenormalNone))
2223 		.addConst ("DenormalFTZ", ARDOUR::DenormalModel(DenormalFTZ))
2224 		.addConst ("DenormalDAZ", ARDOUR::DenormalModel(DenormalDAZ))
2225 		.addConst ("DenormalFTZDAZ", ARDOUR::DenormalModel(DenormalFTZDAZ))
2226 		.endNamespace ()
2227 
2228 		.beginNamespace ("BufferingPreset")
2229 		.addConst ("Small", ARDOUR::BufferingPreset(Small))
2230 		.addConst ("Medium", ARDOUR::BufferingPreset(Medium))
2231 		.addConst ("Large", ARDOUR::BufferingPreset(Large))
2232 		.addConst ("Custom", ARDOUR::BufferingPreset(Custom))
2233 		.endNamespace ()
2234 
2235 		.beginNamespace ("EditMode")
2236 		.addConst ("Slide", ARDOUR::EditMode(Slide))
2237 		.addConst ("Splice", ARDOUR::EditMode(Splice))
2238 		.addConst ("Ripple", ARDOUR::EditMode(Ripple))
2239 		.addConst ("Lock", ARDOUR::EditMode(Lock))
2240 		.endNamespace ()
2241 
2242 		.beginNamespace ("AutoConnectOption")
2243 		.addConst ("ManualConnect", ARDOUR::AutoConnectOption(ManualConnect))
2244 		.addConst ("AutoConnectPhysical", ARDOUR::AutoConnectOption(AutoConnectPhysical))
2245 		.addConst ("AutoConnectMaster", ARDOUR::AutoConnectOption(AutoConnectMaster))
2246 		.endNamespace ()
2247 
2248 		.beginNamespace ("LayerModel")
2249 		.addConst ("LaterHigher", ARDOUR::LayerModel(LaterHigher))
2250 		.addConst ("Manual", ARDOUR::LayerModel(Manual))
2251 		.endNamespace ()
2252 
2253 		.beginNamespace ("ListenPosition")
2254 		.addConst ("AfterFaderListen", ARDOUR::ListenPosition(AfterFaderListen))
2255 		.addConst ("PreFaderListen", ARDOUR::ListenPosition(PreFaderListen))
2256 		.endNamespace ()
2257 
2258 		.beginNamespace ("MonitorModel")
2259 		.addConst ("HardwareMonitoring", ARDOUR::MonitorModel(HardwareMonitoring))
2260 		.addConst ("SoftwareMonitoring", ARDOUR::MonitorModel(SoftwareMonitoring))
2261 		.addConst ("ExternalMonitoring", ARDOUR::MonitorModel(ExternalMonitoring))
2262 		.endNamespace ()
2263 
2264 		.beginNamespace ("RegionSelectionAfterSplit")
2265 		.addConst ("None", ARDOUR::RegionSelectionAfterSplit(None))
2266 		.addConst ("NewlyCreatedLeft", ARDOUR::RegionSelectionAfterSplit(NewlyCreatedLeft))
2267 		.addConst ("NewlyCreatedRight", ARDOUR::RegionSelectionAfterSplit(NewlyCreatedRight))
2268 		.addConst ("NewlyCreatedBoth", ARDOUR::RegionSelectionAfterSplit(NewlyCreatedBoth))
2269 		.addConst ("Existing", ARDOUR::RegionSelectionAfterSplit(Existing))
2270 		.addConst ("ExistingNewlyCreatedLeft", ARDOUR::RegionSelectionAfterSplit(ExistingNewlyCreatedLeft))
2271 		.addConst ("ExistingNewlyCreatedRight", ARDOUR::RegionSelectionAfterSplit(ExistingNewlyCreatedRight))
2272 		.addConst ("ExistingNewlyCreatedBoth", ARDOUR::RegionSelectionAfterSplit(ExistingNewlyCreatedBoth))
2273 		.endNamespace ()
2274 
2275 		.beginNamespace ("RangeSelectionAfterSplit")
2276 		.addConst ("ClearSel", ARDOUR::RangeSelectionAfterSplit(ClearSel))
2277 		.addConst ("PreserveSel", ARDOUR::RangeSelectionAfterSplit(PreserveSel))
2278 		.addConst ("ForceSel", ARDOUR::RangeSelectionAfterSplit(ForceSel))
2279 		.endNamespace ()
2280 
2281 		.beginNamespace ("ShuttleBehaviour")
2282 		.addConst ("Sprung", ARDOUR::ShuttleBehaviour(Sprung))
2283 		.addConst ("Wheel", ARDOUR::ShuttleBehaviour(Wheel))
2284 		.endNamespace ()
2285 
2286 		.beginNamespace ("ScreenSaverMode")
2287 		.addConst ("InhibitNever", ARDOUR::ScreenSaverMode(InhibitNever))
2288 		.addConst ("InhibitWhileRecording", ARDOUR::ScreenSaverMode(InhibitWhileRecording))
2289 		.addConst ("InhibitAlways", ARDOUR::ScreenSaverMode(InhibitAlways))
2290 		.endNamespace ()
2291 
2292 		.beginNamespace ("ClockDeltaMode")
2293 		.addConst ("NoDelta", ARDOUR::ClockDeltaMode(NoDelta))
2294 		.addConst ("DeltaEditPoint", ARDOUR::ClockDeltaMode(DeltaEditPoint))
2295 		.addConst ("DeltaOriginMarker", ARDOUR::ClockDeltaMode(DeltaOriginMarker))
2296 		.endNamespace ()
2297 
2298 		.beginNamespace ("WaveformScale")
2299 		.addConst ("Linear", ARDOUR::WaveformScale(Linear))
2300 		.addConst ("Logarithmic", ARDOUR::WaveformScale(Logarithmic))
2301 		.endNamespace ()
2302 
2303 		.beginNamespace ("WaveformShape")
2304 		.addConst ("Traditional", ARDOUR::WaveformShape(Traditional))
2305 		.addConst ("Rectified", ARDOUR::WaveformShape(Rectified))
2306 		.endNamespace ()
2307 
2308 		.beginNamespace ("MeterLineUp")
2309 		.addConst ("MeteringLineUp24", ARDOUR::MeterLineUp(MeteringLineUp24))
2310 		.addConst ("MeteringLineUp20", ARDOUR::MeterLineUp(MeteringLineUp20))
2311 		.addConst ("MeteringLineUp18", ARDOUR::MeterLineUp(MeteringLineUp18))
2312 		.addConst ("MeteringLineUp15", ARDOUR::MeterLineUp(MeteringLineUp15))
2313 		.endNamespace ()
2314 
2315 		.beginNamespace ("VUMeterStandard")
2316 		.addConst ("MeteringVUfrench", ARDOUR::VUMeterStandard(MeteringVUfrench))
2317 		.addConst ("MeteringVUamerican", ARDOUR::VUMeterStandard(MeteringVUamerican))
2318 		.addConst ("MeteringVUstandard", ARDOUR::VUMeterStandard(MeteringVUstandard))
2319 		.addConst ("MeteringVUeight", ARDOUR::VUMeterStandard(MeteringVUeight))
2320 		.endNamespace ()
2321 
2322 		.beginNamespace ("ShuttleUnits")
2323 		.addConst ("Percentage", ARDOUR::ShuttleUnits(Percentage))
2324 		.addConst ("Semitones", ARDOUR::ShuttleUnits(Semitones))
2325 		.endNamespace ()
2326 
2327 		.beginNamespace ("SyncSource")
2328 		.addConst ("Engine", ARDOUR::SyncSource(Engine))
2329 		.addConst ("MTC", ARDOUR::SyncSource(MTC))
2330 		.addConst ("MIDIClock", ARDOUR::SyncSource(MIDIClock))
2331 		.addConst ("LTC", ARDOUR::SyncSource(LTC))
2332 		.endNamespace ()
2333 
2334 		.beginNamespace ("TracksAutoNamingRule")
2335 		.addConst ("UseDefaultNames", ARDOUR::TracksAutoNamingRule(UseDefaultNames))
2336 		.addConst ("NameAfterDriver", ARDOUR::TracksAutoNamingRule(NameAfterDriver))
2337 		.endNamespace ()
2338 
2339 		.endNamespace (); // end ARDOUR
2340 
2341 	luabridge::getGlobalNamespace (L)
2342 		.beginNamespace ("ARDOUR")
2343 		.addFunction ("user_config_directory", &ARDOUR::user_config_directory)
2344 		.addFunction ("user_cache_directory", &ARDOUR::user_cache_directory)
2345 		.endNamespace (); // end ARDOUR
2346 
2347 	luabridge::getGlobalNamespace (L)
2348 		.beginNamespace ("ARDOUR")
2349 		.beginClass <AudioBackendInfo> ("AudioBackendInfo")
2350 		.addData ("name", &AudioBackendInfo::name)
2351 		.endClass()
2352 		.beginConstStdVector <const AudioBackendInfo*> ("BackendVector").endClass ()
2353 
2354 		.beginClass <AudioBackend::DeviceStatus> ("DeviceStatus")
2355 		.addData ("name", &AudioBackend::DeviceStatus::name)
2356 		.addData ("available", &AudioBackend::DeviceStatus::available)
2357 		.endClass()
2358 		.beginStdVector <AudioBackend::DeviceStatus> ("DeviceStatusVector").endClass ()
2359 
2360 		.beginWSPtrClass <AudioBackend> ("AudioBackend")
2361 		.addFunction ("info", &AudioBackend::info)
2362 		.addFunction ("sample_rate", &AudioBackend::sample_rate)
2363 		.addFunction ("buffer_size", &AudioBackend::buffer_size)
2364 		.addFunction ("period_size", &AudioBackend::period_size)
2365 		.addFunction ("input_channels", &AudioBackend::input_channels)
2366 		.addFunction ("output_channels", &AudioBackend::output_channels)
2367 		.addFunction ("dsp_load", &AudioBackend::dsp_load)
2368 
2369 		.addFunction ("set_sample_rate", &AudioBackend::set_sample_rate)
2370 		.addFunction ("set_buffer_size", &AudioBackend::set_buffer_size)
2371 		.addFunction ("set_peridod_size", &AudioBackend::set_peridod_size)
2372 
2373 		.addFunction ("enumerate_drivers", &AudioBackend::enumerate_drivers)
2374 		.addFunction ("driver_name", &AudioBackend::driver_name)
2375 		.addFunction ("set_driver", &AudioBackend::set_driver)
2376 
2377 		.addFunction ("use_separate_input_and_output_devices", &AudioBackend::use_separate_input_and_output_devices)
2378 		.addFunction ("enumerate_devices", &AudioBackend::enumerate_devices)
2379 		.addFunction ("enumerate_input_devices", &AudioBackend::enumerate_input_devices)
2380 		.addFunction ("enumerate_output_devices", &AudioBackend::enumerate_output_devices)
2381 		.addFunction ("device_name", &AudioBackend::device_name)
2382 		.addFunction ("input_device_name", &AudioBackend::input_device_name)
2383 		.addFunction ("output_device_name", &AudioBackend::output_device_name)
2384 		.addFunction ("set_device_name", &AudioBackend::set_device_name)
2385 		.addFunction ("set_input_device_name", &AudioBackend::set_input_device_name)
2386 		.addFunction ("set_output_device_name", &AudioBackend::set_output_device_name)
2387 		.endClass()
2388 
2389 		.beginClass <PortEngine> ("PortEngine")
2390 		.endClass()
2391 
2392 		.beginClass <LatencyRange> ("LatencyRange")
2393 		.addVoidConstructor ()
2394 		.addData ("min", &LatencyRange::min)
2395 		.addData ("max", &LatencyRange::max)
2396 		.endClass()
2397 
2398 		.beginClass <PortManager> ("PortManager")
2399 		.addFunction ("port_engine", &PortManager::port_engine)
2400 		.addFunction ("connected", &PortManager::connected)
2401 		.addFunction ("connect", &PortManager::connect)
2402 		.addFunction ("physically_connected", &PortManager::physically_connected)
2403 		.addFunction ("disconnect", (int (PortManager::*)(const std::string&, const std::string&))&PortManager::disconnect)
2404 		.addFunction ("disconnect_port", (int (PortManager::*)(boost::shared_ptr<Port>))&PortManager::disconnect)
2405 		.addFunction ("get_port_by_name", &PortManager::get_port_by_name)
2406 		.addFunction ("get_pretty_name_by_name", &PortManager::get_pretty_name_by_name)
2407 		.addFunction ("port_is_physical", &PortManager::port_is_physical)
2408 		.addFunction ("get_physical_outputs", &PortManager::get_physical_outputs)
2409 		.addFunction ("get_physical_inputs", &PortManager::get_physical_inputs)
2410 		.addFunction ("n_physical_outputs", &PortManager::n_physical_outputs)
2411 		.addFunction ("n_physical_inputs", &PortManager::n_physical_inputs)
2412 		.addFunction ("reset_input_meters", &PortManager::reset_input_meters)
2413 		.addRefFunction ("get_connections", &PortManager::get_connections)
2414 		.addRefFunction ("get_ports", (int (PortManager::*)(DataType, PortManager::PortList&))&PortManager::get_ports)
2415 		.addRefFunction ("get_backend_ports", (int (PortManager::*)(const std::string&, DataType, PortFlags, std::vector<std::string>&))&PortManager::get_ports)
2416 		.endClass()
2417 
2418 		.deriveClass <AudioEngine, PortManager> ("AudioEngine")
2419 		.addFunction ("available_backends", &AudioEngine::available_backends)
2420 		.addFunction ("current_backend_name", &AudioEngine::current_backend_name)
2421 		.addFunction ("set_backend", &AudioEngine::set_backend)
2422 		.addFunction ("setup_required", &AudioEngine::setup_required)
2423 		.addFunction ("start", &AudioEngine::start)
2424 		.addFunction ("stop", &AudioEngine::stop)
2425 		.addFunction ("get_dsp_load", &AudioEngine::get_dsp_load)
2426 		.addFunction ("set_device_name", &AudioEngine::set_device_name)
2427 		.addFunction ("set_sample_rate", &AudioEngine::set_sample_rate)
2428 		.addFunction ("set_buffer_size", &AudioEngine::set_buffer_size)
2429 		.addFunction ("get_last_backend_error", &AudioEngine::get_last_backend_error)
2430 		.addFunction ("freewheeling", &AudioEngine::freewheeling)
2431 		.addFunction ("running", &AudioEngine::running)
2432 		.addFunction ("processed_samples", &AudioEngine::processed_samples)
2433 		.endClass()
2434 
2435 		.deriveClass <VCAManager, PBD::StatefulDestructible> ("VCAManager")
2436 		.addFunction ("create_vca", &VCAManager::create_vca)
2437 		.addFunction ("remove_vca", &VCAManager::remove_vca)
2438 		.addFunction ("vca_by_number", &VCAManager::vca_by_number)
2439 		.addFunction ("vca_by_name", &VCAManager::vca_by_name)
2440 		.addFunction ("vcas", &VCAManager::vcas)
2441 		.addFunction ("n_vcas", &VCAManager::n_vcas)
2442 		.endClass()
2443 
2444 		.deriveClass <RCConfiguration, PBD::Configuration> ("RCConfiguration")
2445 #undef  CONFIG_VARIABLE
2446 #undef  CONFIG_VARIABLE_SPECIAL
2447 #define CONFIG_VARIABLE(Type,var,name,value) \
2448 		.addFunction ("get_" # var, &RCConfiguration::get_##var) \
2449 		.addFunction ("set_" # var, &RCConfiguration::set_##var) \
2450 		.addProperty (#var, &RCConfiguration::get_##var, &RCConfiguration::set_##var)
2451 
2452 #define CONFIG_VARIABLE_SPECIAL(Type,var,name,value,mutator) \
2453 		.addFunction ("get_" # var, &RCConfiguration::get_##var) \
2454 		.addFunction ("set_" # var, &RCConfiguration::set_##var) \
2455 		.addProperty (#var, &RCConfiguration::get_##var, &RCConfiguration::set_##var)
2456 
2457 #include "ardour/rc_configuration_vars.h"
2458 
2459 #undef CONFIG_VARIABLE
2460 #undef CONFIG_VARIABLE_SPECIAL
2461 		.endClass()
2462 
2463 		.deriveClass <SessionConfiguration, PBD::Configuration> ("SessionConfiguration")
2464 #undef  CONFIG_VARIABLE
2465 #undef  CONFIG_VARIABLE_SPECIAL
2466 #define CONFIG_VARIABLE(Type,var,name,value) \
2467 		.addFunction ("get_" # var, &SessionConfiguration::get_##var) \
2468 		.addFunction ("set_" # var, &SessionConfiguration::set_##var) \
2469 		.addProperty (#var, &SessionConfiguration::get_##var, &SessionConfiguration::set_##var)
2470 
2471 #define CONFIG_VARIABLE_SPECIAL(Type,var,name,value,mutator) \
2472 		.addFunction ("get_" # var, &SessionConfiguration::get_##var) \
2473 		.addFunction ("set_" # var, &SessionConfiguration::set_##var) \
2474 		.addProperty (#var, &SessionConfiguration::get_##var, &SessionConfiguration::set_##var)
2475 
2476 #include "ardour/session_configuration_vars.h"
2477 
2478 #undef CONFIG_VARIABLE
2479 #undef CONFIG_VARIABLE_SPECIAL
2480 		.endClass()
2481 
2482 		// we could use addProperty ()
2483 		.addFunction ("config", &_libardour_config)
2484 
2485 		.endNamespace ();
2486 
2487 	// basic representation of Session
2488 	// functions which can be used from realtime and non-realtime contexts
2489 	luabridge::getGlobalNamespace (L)
2490 		.beginNamespace ("ARDOUR")
2491 		.beginClass <Session> ("Session")
2492 		.addFunction ("scripts_changed", &Session::scripts_changed) // used internally
2493 		.addFunction ("engine_speed", &Session::engine_speed)
2494 		.addFunction ("actual_speed", &Session::actual_speed)
2495 		.addFunction ("transport_speed", &Session::transport_speed)
2496 		.addFunction ("transport_stopped", &Session::transport_stopped)
2497 		.addFunction ("transport_stopped_or_stopping", &Session::transport_stopped_or_stopping)
2498 		.addFunction ("transport_state_rolling", &Session::transport_state_rolling)
2499 		.addFunction ("transport_rolling", &Session::transport_rolling)
2500 		.addFunction ("transport_will_roll_forwards", &Session::transport_will_roll_forwards)
2501 		.addFunction ("request_transport_speed", &Session::request_transport_speed)
2502 		.addFunction ("transport_sample", &Session::transport_sample)
2503 		.addFunction ("sample_rate", &Session::sample_rate)
2504 		.addFunction ("nominal_sample_rate", &Session::nominal_sample_rate)
2505 		.addFunction ("samples_per_timecode_frame", &Session::samples_per_timecode_frame)
2506 		.addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
2507 		.addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
2508 		.addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
2509 		.addFunction ("request_locate", &Session::request_locate)
2510 		.addFunction ("request_roll", &Session::request_roll)
2511 		.addFunction ("request_stop", &Session::request_stop)
2512 		.addFunction ("request_play_loop", &Session::request_play_loop)
2513 		.addFunction ("request_bounded_roll", &Session::request_bounded_roll)
2514 		.addFunction ("get_play_loop", &Session::get_play_loop)
2515 		.addFunction ("get_xrun_count", &Session::get_xrun_count)
2516 		.addFunction ("reset_xrun_count", &Session::reset_xrun_count)
2517 		.addFunction ("last_transport_start", &Session::last_transport_start)
2518 		.addFunction ("goto_start", &Session::goto_start)
2519 		.addFunction ("goto_end", &Session::goto_end)
2520 		.addFunction ("current_start_sample", &Session::current_start_sample)
2521 		.addFunction ("current_end_sample", &Session::current_end_sample)
2522 		.addFunction ("actively_recording", &Session::actively_recording)
2523 		.addFunction ("new_audio_track", &Session::new_audio_track)
2524 		.addFunction ("new_audio_route", &Session::new_audio_route)
2525 		.addFunction ("new_midi_track", &Session::new_midi_track)
2526 		.addFunction ("new_midi_route", &Session::new_midi_route)
2527 
2528 		.addFunction ("add_master_bus", &Session::add_master_bus)
2529 
2530 		.addFunction ("get_routes", &Session::get_routes)
2531 		.addFunction ("get_tracks", &Session::get_tracks)
2532 		.addFunction ("get_stripables", (StripableList (Session::*)() const)&Session::get_stripables)
2533 		.addFunction ("get_routelist", &Session::get_routelist)
2534 		.addFunction ("plot_process_graph", &Session::plot_process_graph)
2535 
2536 		.addFunction ("bundles", &Session::bundles)
2537 
2538 		.addFunction ("name", &Session::name)
2539 		.addFunction ("path", &Session::path)
2540 		.addFunction ("record_status", &Session::record_status)
2541 		.addFunction ("maybe_enable_record", &Session::maybe_enable_record)
2542 		.addFunction ("disable_record", &Session::disable_record)
2543 		.addFunction ("route_by_id", &Session::route_by_id)
2544 		.addFunction ("route_by_name", &Session::route_by_name)
2545 		.addFunction ("stripable_by_id", &Session::stripable_by_id)
2546 		.addFunction ("get_remote_nth_stripable", &Session::get_remote_nth_stripable)
2547 		.addFunction ("get_remote_nth_route", &Session::get_remote_nth_route)
2548 		.addFunction ("route_by_selected_count", &Session::route_by_selected_count)
2549 		.addFunction ("source_by_id", &Session::source_by_id)
2550 		.addFunction ("controllable_by_id", &Session::controllable_by_id)
2551 		.addFunction ("processor_by_id", &Session::processor_by_id)
2552 		.addFunction ("snap_name", &Session::snap_name)
2553 		.addFunction ("monitor_out", &Session::monitor_out)
2554 		.addFunction ("master_out", &Session::master_out)
2555 		.addFunction ("add_internal_send", (void (Session::*)(boost::shared_ptr<Route>, boost::shared_ptr<Processor>, boost::shared_ptr<Route>))&Session::add_internal_send)
2556 		.addFunction ("add_internal_sends", &Session::add_internal_sends)
2557 		.addFunction ("tempo_map", (TempoMap& (Session::*)())&Session::tempo_map)
2558 		.addFunction ("locations", &Session::locations)
2559 		.addFunction ("soloing", &Session::soloing)
2560 		.addFunction ("listening", &Session::listening)
2561 		.addFunction ("solo_isolated", &Session::solo_isolated)
2562 		.addFunction ("cancel_all_solo", &Session::cancel_all_solo)
2563 		.addFunction ("clear_all_solo_state", &Session::clear_all_solo_state)
2564 		.addFunction ("set_controls", &Session::set_controls)
2565 		.addFunction ("set_control", &Session::set_control)
2566 		.addFunction ("set_exclusive_input_active", &Session::set_exclusive_input_active)
2567 		.addFunction ("begin_reversible_command", (void (Session::*)(const std::string&))&Session::begin_reversible_command)
2568 		.addFunction ("commit_reversible_command", &Session::commit_reversible_command)
2569 		.addFunction ("abort_reversible_command", &Session::abort_reversible_command)
2570 		.addFunction ("collected_undo_commands", &Session::collected_undo_commands)
2571 		.addFunction ("abort_empty_reversible_command", &Session::abort_empty_reversible_command)
2572 		.addFunction ("add_command", &Session::add_command)
2573 		.addFunction ("add_stateful_diff_command", &Session::add_stateful_diff_command)
2574 		.addFunction ("playlists", &Session::playlists)
2575 		.addFunction ("engine", (AudioEngine& (Session::*)())&Session::engine)
2576 		.addFunction ("get_block_size", &Session::get_block_size)
2577 		.addFunction ("worst_output_latency", &Session::worst_output_latency)
2578 		.addFunction ("worst_input_latency", &Session::worst_input_latency)
2579 		.addFunction ("worst_route_latency", &Session::worst_route_latency)
2580 		.addFunction ("worst_latency_preroll", &Session::worst_latency_preroll)
2581 		.addFunction ("cfg", &Session::cfg)
2582 		.addFunction ("route_groups", &Session::route_groups)
2583 		.addFunction ("new_route_group", &Session::new_route_group)
2584 		.addFunction ("session_range_is_free", &Session::session_range_is_free)
2585 		.addFunction ("set_session_range_is_free", &Session::set_session_range_is_free)
2586 		.addFunction ("remove_route_group", (void (Session::*)(RouteGroup*))&Session::remove_route_group)
2587 		.addFunction ("vca_manager", &Session::vca_manager_ptr)
2588 		.addExtCFunction ("timecode_to_sample_lua", ARDOUR::LuaAPI::timecode_to_sample_lua)
2589 		.addExtCFunction ("sample_to_timecode_lua", ARDOUR::LuaAPI::sample_to_timecode_lua)
2590 		.endClass ()
2591 
2592 		.beginClass <RegionFactory> ("RegionFactory")
2593 		.addStaticFunction ("region_by_id", &RegionFactory::region_by_id)
2594 		.addStaticFunction ("regions", &RegionFactory::regions)
2595 		.addStaticFunction ("clone_region", static_cast<boost::shared_ptr<Region> (*)(boost::shared_ptr<Region>, bool, bool)>(&RegionFactory::create))
2596 		.endClass ()
2597 
2598 		/* session enums (rt-safe, common) */
2599 		.beginNamespace ("Session")
2600 
2601 		.beginNamespace ("RecordState")
2602 		.addConst ("Disabled", ARDOUR::Session::RecordState(Session::Disabled))
2603 		.addConst ("Enabled", ARDOUR::Session::RecordState(Session::Enabled))
2604 		.addConst ("Recording", ARDOUR::Session::RecordState(Session::Recording))
2605 		.endNamespace ()
2606 
2607 		.endNamespace () // end Session enums
2608 
2609 		/* ardour enums (rt-safe, common) */
2610 		.beginNamespace ("LocationFlags")
2611 		.addConst ("IsMark", ARDOUR::Location::Flags(Location::IsMark))
2612 		.addConst ("IsAutoPunch", ARDOUR::Location::Flags(Location::IsAutoPunch))
2613 		.addConst ("IsAutoLoop", ARDOUR::Location::Flags(Location::IsAutoLoop))
2614 		.addConst ("IsHidden", ARDOUR::Location::Flags(Location::IsHidden))
2615 		.addConst ("IsCDMarker", ARDOUR::Location::Flags(Location::IsCDMarker))
2616 		.addConst ("IsRangeMarker", ARDOUR::Location::Flags(Location::IsRangeMarker))
2617 		.addConst ("IsSessionRange", ARDOUR::Location::Flags(Location::IsSessionRange))
2618 		.addConst ("IsSkip", ARDOUR::Location::Flags(Location::IsSkip))
2619 		.addConst ("IsSkipping", ARDOUR::Location::Flags(Location::IsSkipping))
2620 		.endNamespace ()
2621 
2622 		.beginNamespace ("LuaAPI")
2623 		.addFunction ("nil_proc", ARDOUR::LuaAPI::nil_processor)
2624 		.addFunction ("new_luaproc", ARDOUR::LuaAPI::new_luaproc)
2625 		.addFunction ("new_send", ARDOUR::LuaAPI::new_send)
2626 		.addFunction ("list_plugins", ARDOUR::LuaAPI::list_plugins)
2627 		.addFunction ("dump_untagged_plugins", ARDOUR::LuaAPI::dump_untagged_plugins)
2628 		.addFunction ("new_plugin_info", ARDOUR::LuaAPI::new_plugin_info)
2629 		.addFunction ("new_plugin", ARDOUR::LuaAPI::new_plugin)
2630 		.addFunction ("set_processor_param", ARDOUR::LuaAPI::set_processor_param)
2631 		.addFunction ("set_plugin_insert_param", ARDOUR::LuaAPI::set_plugin_insert_param)
2632 		.addFunction ("reset_processor_to_default", ARDOUR::LuaAPI::reset_processor_to_default)
2633 		.addRefFunction ("get_processor_param", ARDOUR::LuaAPI::get_processor_param)
2634 		.addRefFunction ("get_plugin_insert_param", ARDOUR::LuaAPI::get_plugin_insert_param)
2635 		.addCFunction ("desc_scale_points", ARDOUR::LuaAPI::desc_scale_points)
2636 		.addCFunction ("plugin_automation", ARDOUR::LuaAPI::plugin_automation)
2637 		.addCFunction ("hsla_to_rgba", ARDOUR::LuaAPI::hsla_to_rgba)
2638 		.addCFunction ("color_to_rgba", ARDOUR::LuaAPI::color_to_rgba)
2639 		.addFunction ("ascii_dtostr", ARDOUR::LuaAPI::ascii_dtostr)
2640 		.addFunction ("usleep", Glib::usleep)
2641 		.addFunction ("file_test", Glib::file_test)
2642 		.addFunction ("file_get_contents", Glib::file_get_contents)
2643 		.addFunction ("path_get_basename", Glib::path_get_basename)
2644 		.addFunction ("monotonic_time", ::g_get_monotonic_time)
2645 		.addCFunction ("build_filename", ARDOUR::LuaAPI::build_filename)
2646 		.addFunction ("new_noteptr", ARDOUR::LuaAPI::new_noteptr)
2647 		.addFunction ("note_list", ARDOUR::LuaAPI::note_list)
2648 		.addCFunction ("sample_to_timecode", ARDOUR::LuaAPI::sample_to_timecode)
2649 		.addCFunction ("timecode_to_sample", ARDOUR::LuaAPI::timecode_to_sample)
2650 		.addFunction ("wait_for_process_callback", ARDOUR::LuaAPI::wait_for_process_callback)
2651 		.addFunction ("segfault", ARDOUR::LuaAPI::segfault)
2652 
2653 		.beginNamespace ("FileTest")
2654 		.addConst ("IsRegular", Glib::FILE_TEST_IS_REGULAR)
2655 		.addConst ("IsSymlink", Glib::FILE_TEST_IS_SYMLINK)
2656 		.addConst ("IsDir", Glib::FILE_TEST_IS_DIR)
2657 		.addConst ("IsExecutable", Glib::FILE_TEST_IS_EXECUTABLE)
2658 		.addConst ("Exists", Glib::FILE_TEST_EXISTS)
2659 		.endNamespace () // end LuaAPI
2660 
2661 		.beginClass <ARDOUR::LuaAPI::Vamp> ("Vamp")
2662 		.addConstructor <void (*) (const std::string&, float)> ()
2663 		.addStaticFunction ("list_plugins", &ARDOUR::LuaAPI::Vamp::list_plugins)
2664 		.addFunction ("plugin", &ARDOUR::LuaAPI::Vamp::plugin)
2665 		.addFunction ("analyze", &ARDOUR::LuaAPI::Vamp::analyze)
2666 		.addFunction ("reset", &ARDOUR::LuaAPI::Vamp::reset)
2667 		.addFunction ("initialize", &ARDOUR::LuaAPI::Vamp::initialize)
2668 		.addFunction ("process", &ARDOUR::LuaAPI::Vamp::process)
2669 		.endClass ()
2670 
2671 		.beginClass <ARDOUR::LuaAPI::Rubberband> ("Rubberband")
2672 		.addConstructor <void (*) (boost::shared_ptr<AudioRegion>, bool)> ()
2673 		.addFunction ("set_strech_and_pitch", &ARDOUR::LuaAPI::Rubberband::set_strech_and_pitch)
2674 		.addFunction ("set_mapping", &ARDOUR::LuaAPI::Rubberband::set_mapping)
2675 		.addFunction ("process", &ARDOUR::LuaAPI::Rubberband::process)
2676 		.addFunction ("readable_length", &ARDOUR::LuaAPI::Rubberband::readable_length)
2677 		.addFunction ("n_channels", &ARDOUR::LuaAPI::Rubberband::n_channels)
2678 		.addFunction ("readable", &ARDOUR::LuaAPI::Rubberband::readable)
2679 		.endClass ()
2680 
2681 		.endNamespace () // end LuaAPI
2682 		.endNamespace ();// end ARDOUR
2683 
2684 	// DSP functions
2685 	luabridge::getGlobalNamespace (L)
2686 		.beginNamespace ("ARDOUR")
2687 		.beginNamespace ("DSP")
2688 		.addFunction ("compute_peak", ARDOUR::compute_peak)
2689 		.addFunction ("find_peaks", ARDOUR::find_peaks)
2690 		.addFunction ("apply_gain_to_buffer", ARDOUR::apply_gain_to_buffer)
2691 		.addFunction ("mix_buffers_no_gain", ARDOUR::mix_buffers_no_gain)
2692 		.addFunction ("mix_buffers_with_gain", ARDOUR::mix_buffers_with_gain)
2693 		.addFunction ("copy_vector", ARDOUR::copy_vector)
2694 		.addFunction ("dB_to_coefficient", &dB_to_coefficient)
2695 		.addFunction ("fast_coefficient_to_dB", &fast_coefficient_to_dB)
2696 		.addFunction ("accurate_coefficient_to_dB", &accurate_coefficient_to_dB)
2697 		.addFunction ("memset", &DSP::memset)
2698 		.addFunction ("mmult", &DSP::mmult)
2699 		.addFunction ("log_meter", &DSP::log_meter)
2700 		.addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
2701 		.addFunction ("process_map", &DSP::process_map)
2702 		.addRefFunction ("peaks", &DSP::peaks)
2703 
2704 		.beginClass <DSP::LowPass> ("LowPass")
2705 		.addConstructor <void (*) (double, float)> ()
2706 		.addFunction ("proc", &DSP::LowPass::proc)
2707 		.addFunction ("ctrl", &DSP::LowPass::ctrl)
2708 		.addFunction ("set_cutoff", &DSP::LowPass::set_cutoff)
2709 		.addFunction ("reset", &DSP::LowPass::reset)
2710 		.endClass ()
2711 		.beginClass <DSP::Biquad> ("Biquad")
2712 		.addConstructor <void (*) (double)> ()
2713 		.addFunction ("run", &DSP::Biquad::run)
2714 		.addFunction ("compute", &DSP::Biquad::compute)
2715 		.addFunction ("configure", &DSP::Biquad::configure)
2716 		.addFunction ("reset", &DSP::Biquad::reset)
2717 		.addFunction ("dB_at_freq", &DSP::Biquad::dB_at_freq)
2718 		.endClass ()
2719 		.beginClass <DSP::FFTSpectrum> ("FFTSpectrum")
2720 		.addConstructor <void (*) (uint32_t, double)> ()
2721 		.addFunction ("set_data_hann", &DSP::FFTSpectrum::set_data_hann)
2722 		.addFunction ("execute", &DSP::FFTSpectrum::execute)
2723 		.addFunction ("power_at_bin", &DSP::FFTSpectrum::power_at_bin)
2724 		.addFunction ("freq_at_bin", &DSP::FFTSpectrum::freq_at_bin)
2725 		.endClass ()
2726 		.beginClass <DSP::Generator> ("Generator")
2727 		.addVoidConstructor ()
2728 		.addFunction ("run", &DSP::Generator::run)
2729 		.addFunction ("set_type", &DSP::Generator::set_type)
2730 		.endClass ()
2731 
2732 		.beginClass <ARDOUR::LTCReader> ("LTCReader")
2733 		.addConstructor <void (*) (int, LTC_TV_STANDARD)> ()
2734 		.addFunction ("write", &ARDOUR::LTCReader::write)
2735 		.addRefFunction ("read", &ARDOUR::LTCReader::read)
2736 		.endClass ()
2737 
2738 		.beginClass <DSP::Convolution> ("Convolution")
2739 		.addConstructor <void (*) (Session&, uint32_t, uint32_t)> ()
2740 		.addFunction ("add_impdata", &ARDOUR::DSP::Convolution::add_impdata)
2741 		.addFunction ("run", &ARDOUR::DSP::Convolution::run)
2742 		.addFunction ("restart", &ARDOUR::DSP::Convolution::restart)
2743 		.addFunction ("ready", &ARDOUR::DSP::Convolution::ready)
2744 		.addFunction ("latency", &ARDOUR::DSP::Convolution::latency)
2745 		.addFunction ("n_inputs", &ARDOUR::DSP::Convolution::n_inputs)
2746 		.addFunction ("n_outputs", &ARDOUR::DSP::Convolution::n_outputs)
2747 		.endClass ()
2748 
2749 		.beginClass <DSP::Convolver::IRSettings> ("IRSettings")
2750 		.addVoidConstructor ()
2751 		.addData ("gain", &DSP::Convolver::IRSettings::gain)
2752 		.addData ("pre_delay", &DSP::Convolver::IRSettings::pre_delay)
2753 		.addFunction ("get_channel_gain", &ARDOUR::DSP::Convolver::IRSettings::get_channel_gain)
2754 		.addFunction ("set_channel_gain", &ARDOUR::DSP::Convolver::IRSettings::set_channel_gain)
2755 		.addFunction ("get_channel_delay", &ARDOUR::DSP::Convolver::IRSettings::get_channel_delay)
2756 		.addFunction ("set_channel_delay", &ARDOUR::DSP::Convolver::IRSettings::set_channel_delay)
2757 		.endClass ()
2758 
2759 		.deriveClass <DSP::Convolver, DSP::Convolution> ("Convolver")
2760 		.addConstructor <void (*) (Session&, std::string const&, DSP::Convolver::IRChannelConfig, DSP::Convolver::IRSettings)> ()
2761 		.addFunction ("run_mono_buffered", &ARDOUR::DSP::Convolver::run_mono_buffered)
2762 		.addFunction ("run_stereo_buffered", &ARDOUR::DSP::Convolver::run_stereo_buffered)
2763 		.addFunction ("run_mono_no_latency", &ARDOUR::DSP::Convolver::run_mono_no_latency)
2764 		.addFunction ("run_stereo_no_latency", &ARDOUR::DSP::Convolver::run_stereo_no_latency)
2765 		.endClass ()
2766 
2767 		/* DSP enums */
2768 		.beginNamespace ("BiquadType")
2769 		.addConst ("LowPass", ARDOUR::DSP::Biquad::LowPass)
2770 		.addConst ("HighPass", ARDOUR::DSP::Biquad::HighPass)
2771 		.addConst ("BandPassSkirt", ARDOUR::DSP::Biquad::BandPassSkirt)
2772 		.addConst ("BandPass0dB", ARDOUR::DSP::Biquad::BandPass0dB)
2773 		.addConst ("Notch", ARDOUR::DSP::Biquad::Notch)
2774 		.addConst ("AllPass", ARDOUR::DSP::Biquad::AllPass)
2775 		.addConst ("Peaking", ARDOUR::DSP::Biquad::Peaking)
2776 		.addConst ("LowShelf", ARDOUR::DSP::Biquad::LowShelf)
2777 		.addConst ("HighShelf", ARDOUR::DSP::Biquad::HighShelf)
2778 		.endNamespace ()
2779 
2780 		.beginNamespace ("NoiseType")
2781 		.addConst ("UniformWhiteNoise", ARDOUR::DSP::Generator::UniformWhiteNoise)
2782 		.addConst ("GaussianWhiteNoise", ARDOUR::DSP::Generator::GaussianWhiteNoise)
2783 		.addConst ("PinkNoise", ARDOUR::DSP::Generator::PinkNoise)
2784 		.endNamespace ()
2785 
2786 		.beginNamespace ("LTC_TV_STANDARD")
2787 		.addConst ("LTC_TV_525_60", LTC_TV_525_60)
2788 		.addConst ("LTC_TV_625_50", LTC_TV_625_50)
2789 		.addConst ("LTC_TV_1125_60", LTC_TV_1125_60)
2790 		.addConst ("LTC_TV_FILM_24", LTC_TV_FILM_24)
2791 		.endNamespace ()
2792 
2793 		.beginNamespace ("IRChannelConfig")
2794 		.addConst ("Mono", DSP::Convolver::Mono)
2795 		.addConst ("MonoToStereo", DSP::Convolver::MonoToStereo)
2796 		.addConst ("Stereo", DSP::Convolver::Stereo)
2797 		.endNamespace ()
2798 
2799 		.beginClass <DSP::DspShm> ("DspShm")
2800 		.addConstructor<void (*) (size_t)> ()
2801 		.addFunction ("allocate", &DSP::DspShm::allocate)
2802 		.addFunction ("clear", &DSP::DspShm::clear)
2803 		.addFunction ("to_float", &DSP::DspShm::to_float)
2804 		.addFunction ("to_int", &DSP::DspShm::to_int)
2805 		.addFunction ("atomic_set_int", &DSP::DspShm::atomic_set_int)
2806 		.addFunction ("atomic_get_int", &DSP::DspShm::atomic_get_int)
2807 		.endClass ()
2808 
2809 		.endNamespace () // DSP
2810 		.endNamespace ();// end ARDOUR
2811 }
2812 
2813 void
dsp(lua_State * L)2814 LuaBindings::dsp (lua_State* L)
2815 {
2816 	luabridge::getGlobalNamespace (L)
2817 		.beginNamespace ("ARDOUR")
2818 
2819 		.beginClass <AudioBuffer> ("AudioBuffer")
2820 		.addEqualCheck ()
2821 		.addFunction ("data", (Sample*(AudioBuffer::*)(samplecnt_t))&AudioBuffer::data)
2822 		.addFunction ("silence", &AudioBuffer::silence)
2823 		.addFunction ("apply_gain", &AudioBuffer::apply_gain)
2824 		.addFunction ("check_silence", &AudioBuffer::check_silence)
2825 		.addFunction ("read_from", (void (AudioBuffer::*)(const Sample*, samplecnt_t, samplecnt_t, samplecnt_t))&AudioBuffer::read_from)
2826 		.endClass()
2827 
2828 		.beginClass <MidiBuffer> ("MidiBuffer")
2829 		.addEqualCheck ()
2830 		.addFunction ("silence", &MidiBuffer::silence)
2831 		.addFunction ("size", &MidiBuffer::size)
2832 		.addFunction ("empty", &MidiBuffer::empty)
2833 		.addFunction ("resize", &MidiBuffer::resize)
2834 		.addFunction ("copy", (void (MidiBuffer::*)(MidiBuffer const * const))&MidiBuffer::copy)
2835 		.addFunction ("push_event", (bool (MidiBuffer::*)(const Evoral::Event<samplepos_t>&))&MidiBuffer::push_back)
2836 		.addFunction ("push_back", (bool (MidiBuffer::*)(samplepos_t, Evoral::EventType, size_t, const uint8_t*))&MidiBuffer::push_back)
2837 		// TODO iterators..
2838 		.addExtCFunction ("table", &luabridge::CFunc::listToTable<const Evoral::Event<samplepos_t>, MidiBuffer>)
2839 		.endClass()
2840 
2841 		.beginClass <BufferSet> ("BufferSet")
2842 		.addEqualCheck ()
2843 		.addFunction ("get_audio", static_cast<AudioBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_audio))
2844 		.addFunction ("get_midi", static_cast<MidiBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_midi))
2845 		.addFunction ("count", static_cast<const ChanCount&(BufferSet::*)()const>(&BufferSet::count))
2846 		.addFunction ("available", static_cast<const ChanCount&(BufferSet::*)()const>(&BufferSet::available))
2847 		.endClass()
2848 		.endNamespace ();
2849 
2850 	luabridge::getGlobalNamespace (L)
2851 		.beginNamespace ("Evoral")
2852 		.deriveClass <Evoral::Event<samplepos_t>, Evoral::Event<samplepos_t> > ("Event")
2853 		// add Ctor?
2854 		.addFunction ("type", &Evoral::Event<samplepos_t>::type)
2855 		.addFunction ("channel", &Evoral::Event<samplepos_t>::channel)
2856 		.addFunction ("set_type", &Evoral::Event<samplepos_t>::set_type)
2857 		.addFunction ("set_channel", &Evoral::Event<samplepos_t>::set_channel)
2858 		.endClass ()
2859 		.endNamespace ();
2860 
2861 	// dsp releated session functions
2862 	luabridge::getGlobalNamespace (L)
2863 		.beginNamespace ("ARDOUR")
2864 		.beginClass <Session> ("Session")
2865 		.addFunction ("get_scratch_buffers", &Session::get_scratch_buffers)
2866 		.addFunction ("get_silent_buffers", &Session::get_silent_buffers)
2867 		.endClass ()
2868 		.endNamespace ();
2869 
2870 	luabridge::getGlobalNamespace (L)
2871 		.beginNamespace ("ARDOUR")
2872 		.beginClass <FluidSynth> ("FluidSynth")
2873 		.addConstructor <void (*) (float, int)> ()
2874 		.addFunction ("load_sf2", &FluidSynth::load_sf2)
2875 		.addFunction ("synth", &FluidSynth::synth)
2876 		.addFunction ("midi_event", &FluidSynth::midi_event)
2877 		.addFunction ("panic", &FluidSynth::panic)
2878 		.addFunction ("select_program", &FluidSynth::select_program)
2879 		.addFunction ("program_count", &FluidSynth::program_count)
2880 		.addFunction ("program_name", &FluidSynth::program_name)
2881 		.endClass ()
2882 		.endNamespace ();
2883 
2884 	luabridge::getGlobalNamespace (L)
2885 		.beginNamespace ("ARDOUR")
2886 
2887 		.beginClass <LuaTableRef> ("LuaTableRef")
2888 		.addCFunction ("get", &LuaTableRef::get)
2889 		.addCFunction ("set", &LuaTableRef::set)
2890 		.endClass ()
2891 
2892 		.endNamespace (); // ARDOUR
2893 }
2894 
2895 void
session(lua_State * L)2896 LuaBindings::session (lua_State* L)
2897 {
2898 	// non-realtime session functions
2899 	luabridge::getGlobalNamespace (L)
2900 		.beginNamespace ("ARDOUR")
2901 		.beginClass <Session> ("Session")
2902 		.addFunction ("save_state", &Session::save_state)
2903 		.addFunction ("rename", &Session::rename)
2904 		.addFunction ("set_dirty", &Session::set_dirty)
2905 		.addFunction ("unknown_processors", &Session::unknown_processors)
2906 		.addFunction ("export_track_state", &Session::export_track_state)
2907 
2908 		.addFunction<RouteList (Session::*)(uint32_t, PresentationInfo::order_t, const std::string&, const std::string&, PlaylistDisposition)> ("new_route_from_template", &Session::new_route_from_template)
2909 		// TODO  session_add_audio_track  session_add_midi_track  session_add_mixed_track
2910 		//.addFunction ("new_midi_track", &Session::new_midi_track)
2911 		.endClass ()
2912 
2913 		.endNamespace (); // ARDOUR
2914 }
2915 
2916 void
osc(lua_State * L)2917 LuaBindings::osc (lua_State* L)
2918 {
2919 	luabridge::getGlobalNamespace (L)
2920 		.beginNamespace ("ARDOUR")
2921 		.beginNamespace ("LuaOSC")
2922 		.beginClass<LuaOSC::Address> ("Address")
2923 		.addConstructor<void (*) (std::string)> ()
2924 		.addCFunction ("send", &LuaOSC::Address::send)
2925 		.endClass ()
2926 		.endNamespace ()
2927 		.endNamespace ();
2928 }
2929 
2930 void
set_session(lua_State * L,Session * s)2931 LuaBindings::set_session (lua_State* L, Session *s)
2932 {
2933 	/* LuaBridge uses unique keys to identify classes/c-types.
2934 	 *
2935 	 * Those keys are "generated" by using the memory-address of a static
2936 	 * variable, templated for every Class.
2937 	 * (see libs/lua/LuaBridge/detail/ClassInfo.h)
2938 	 *
2939 	 * When linking the final executable there must be exactly one static
2940 	 * function (static variable) for every templated class.
2941 	 * This works fine on OSX and Linux...
2942 	 *
2943 	 * Windows (mingw and MSVC) however expand the template differently for libardour
2944 	 * AND gtk2_ardour. We end up with two identical static functions
2945 	 * at different addresses!!
2946 	 *
2947 	 * The Solution: have gtk2_ardour never include LuaBridge headers directly
2948 	 * and always go via libardour function calls for classes that are registered
2949 	 * in libardour. (calling lua itself is fine,  calling c-functions in the GUI
2950 	 * which expand the template is not)
2951 	 *
2952 	 * (the actual cause: even static symbols in a .dll have no fixed address
2953 	 * and are mapped when loading the dll. static functions in .exe do have a fixed
2954 	 * address)
2955 	 *
2956 	 * libardour:
2957 	 *  0000000000000000 I __imp__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
2958 	 *  0000000000000000 I __nm__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
2959 	 *  0000000000000000 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
2960 	 *
2961 	 * ardour.exe
2962 	 *  000000000104f560 d .data$_ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
2963 	 *  000000000104f560 D _ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
2964 	 *  0000000000e9baf0 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
2965 	 *
2966 	 *
2967 	 */
2968 	luabridge::push <Session *> (L, s);
2969 	lua_setglobal (L, "Session");
2970 
2971 	if (s) {
2972 		// call lua function.
2973 		luabridge::LuaRef cb_ses = luabridge::getGlobal (L, "new_session");
2974 		if (cb_ses.type() == LUA_TFUNCTION) { cb_ses(s->name()); } // TODO args
2975 	}
2976 }
2977