From 86a45e3cac26fd02fe49b5ef7ebe7259a1aad979 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 10 Apr 2016 17:35:02 +0200 Subject: [PATCH] add lua bindings for Automation Events --- libs/ardour/ardour/lua_api.h | 18 +++++++++++++ libs/ardour/lua_api.cc | 45 ++++++++++++++++++++++++++++++++ libs/ardour/luabindings.cc | 50 ++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) diff --git a/libs/ardour/ardour/lua_api.h b/libs/ardour/ardour/lua_api.h index d93b73373d..840c90081b 100644 --- a/libs/ardour/ardour/lua_api.h +++ b/libs/ardour/ardour/lua_api.h @@ -93,6 +93,24 @@ namespace ARDOUR { namespace LuaAPI { */ bool set_plugin_insert_param (boost::shared_ptr pi, uint32_t which, float val); + /** + * A convenience function to get a AutomationControList and ParamaterDescriptor + * for a given plugin control. + * + * This is equivalent to the following lua code + * + * function (processor, param_id) + * local plugininsert = processor:to_insert () + * local plugin = plugininsert:plugin(0) + * local _, t = plugin:get_parameter_descriptor(param_id, ARDOUR.ParameterDescriptor ()) + * local ctrl = Evoral.Parameter (ARDOUR.AutomationType.PluginAutomation, 0, param_id) + * local ac = pi:automation_control (ctrl, false) + * local acl = ac:alist() + * return ac:alist(), ac:to_ctrl():list(), t[2] + * end + * + */ + int plugin_automation (lua_State *lua); } } /* namespace */ namespace ARDOUR { namespace LuaOSC { diff --git a/libs/ardour/lua_api.cc b/libs/ardour/lua_api.cc index 02a4de4658..e24902999d 100644 --- a/libs/ardour/lua_api.cc +++ b/libs/ardour/lua_api.cc @@ -183,6 +183,51 @@ ARDOUR::LuaAPI::set_processor_param (boost::shared_ptr proc, uint32_t return set_plugin_insert_param (pi, which, val); } +int +ARDOUR::LuaAPI::plugin_automation (lua_State *L) +{ + typedef boost::shared_ptr T; + + int top = lua_gettop(L); + if (top < 2) { + return luaL_argerror (L, 1, "invalid number of arguments, :plugin_automation (plugin, parameter_number)"); + } + T* const p = luabridge::Userdata::get(L, 1, false); + uint32_t which = luabridge::Stack::get (L, 2); + if (!p) { + return luaL_error (L, "Invalid pointer to Ardour:Processor"); + } + boost::shared_ptr pi = boost::dynamic_pointer_cast (*p); + if (!pi) { + return luaL_error (L, "Given Processor is not a Plugin Insert"); + } + boost::shared_ptr plugin = pi->plugin(); + if (!plugin) { + return luaL_error (L, "Given Processor is not a Plugin"); + } + + bool ok=false; + uint32_t controlid = plugin->nth_parameter (which, ok); + if (!ok) { + return luaL_error (L, "Invalid Parameter"); + } + if (!plugin->parameter_is_input (controlid)) { + return luaL_error (L, "Given Parameter is not an input"); + } + + ParameterDescriptor pd; + if (plugin->get_parameter_descriptor (controlid, pd) != 0) { + return luaL_error (L, "Cannot describe parameter"); + } + + boost::shared_ptr c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid)); + + luabridge::Stack >::push (L, c->alist()); + luabridge::Stack >::push (L, c->list()); + luabridge::Stack::push (L, pd); + return 3; +} + int ARDOUR::LuaOSC::Address::send (lua_State *L) { diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 9130af69d5..d1bf193ed9 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -24,6 +24,7 @@ #include "evoral/ControlList.hpp" #include "evoral/Range.hpp" +#include "ardour/amp.h" #include "ardour/audioengine.h" #include "ardour/audiosource.h" #include "ardour/audio_backend.h" @@ -108,6 +109,10 @@ LuaBindings::common (lua_State* L) .addFunction ("to_s", &PBD::ID::to_s) // TODO special case LUA __tostring ? .endClass () + .beginClass ("XMLNode") + .addFunction ("name", &XMLNode::name) + .endClass () + .beginClass ("Stateful") .addFunction ("properties", &PBD::Stateful::properties) .addFunction ("clear_changes", &PBD::Stateful::clear_changes) @@ -174,6 +179,15 @@ LuaBindings::common (lua_State* L) .beginWSPtrClass ("ControlList") .addFunction ("add", &Evoral::ControlList::add) + .addFunction ("thin", &Evoral::ControlList::thin) + .addFunction ("eval", &Evoral::ControlList::eval) + .addRefFunction ("rt_safe_eval", &Evoral::ControlList::rt_safe_eval) + .addFunction ("interpolation", &Evoral::ControlList::interpolation) + .addFunction ("set_interpolation", &Evoral::ControlList::set_interpolation) + .addFunction ("truncate_end", &Evoral::ControlList::truncate_end) + .addFunction ("truncate_start", &Evoral::ControlList::truncate_start) + .addFunction ("clear", (void (Evoral::ControlList::*)(double, double))&Evoral::ControlList::clear) + .addFunction ("in_write_pass", &Evoral::ControlList::in_write_pass) .endClass () .beginWSPtrClass ("ControlSet") @@ -197,6 +211,13 @@ LuaBindings::common (lua_State* L) .addData ("to", &Evoral::Range::to) .endClass () + /* libevoral enums */ + .beginNamespace ("InterpolationStyle") + .addConst ("Discrete", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Discrete)) + .addConst ("Linear", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Linear)) + .addConst ("Curved", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Curved)) + .endNamespace () + .endNamespace () // Evoral .beginNamespace ("ARDOUR") @@ -263,6 +284,17 @@ LuaBindings::common (lua_State* L) .deriveClass ("OwnedPropertyList") .endClass () + .beginWSPtrClass ("AutomationList") + .addCast ("to_stateful") + .addCast ("to_statefuldestructible") + .addCast ("list") + .addFunction ("get_state", &AutomationList::get_state) + .addFunction ("memento_command", &AutomationList::memento_command) + .addFunction ("touching", &AutomationList::touching) + .addFunction ("writing", &AutomationList::writing) + .addFunction ("touch_enabled", &AutomationList::touch_enabled) + .endClass () + .deriveClass ("Location") .addFunction ("locked", &Location::locked) .addFunction ("lock", &Location::lock) @@ -322,6 +354,8 @@ LuaBindings::common (lua_State* L) .addFunction ("main_outs", &Route::main_outs) .addFunction ("muted", &Route::muted) .addFunction ("soloed", &Route::soloed) + .addFunction ("amp", &Route::amp) + .addFunction ("trim", &Route::trim) .endClass () .deriveWSPtrClass ("Playlist") @@ -338,6 +372,7 @@ LuaBindings::common (lua_State* L) .addFunction ("find_next_region", &Playlist::find_next_region) .addFunction ("find_next_region_boundary", &Playlist::find_next_region_boundary) .addFunction ("count_regions_at", &Playlist::count_regions_at) + .addFunction ("regions_touched", &Playlist::regions_touched) .addFunction ("regions_with_start_within", &Playlist::regions_with_start_within) .addFunction ("regions_with_end_within", &Playlist::regions_with_end_within) .addFunction ("raise_region", &Playlist::raise_region) @@ -508,13 +543,24 @@ LuaBindings::common (lua_State* L) .endClass () .deriveWSPtrClass ("AutomationControl") + .addCast ("to_ctrl") .addFunction ("automation_state", &AutomationControl::automation_state) + .addFunction ("automation_style", &AutomationControl::automation_style) + .addFunction ("set_automation_state", &AutomationControl::set_automation_state) .addFunction ("set_automation_style", &AutomationControl::set_automation_style) .addFunction ("start_touch", &AutomationControl::start_touch) .addFunction ("stop_touch", &AutomationControl::stop_touch) .addFunction ("get_value", &AutomationControl::get_value) .addFunction ("set_value", &AutomationControl::set_value) .addFunction ("writable", &AutomationControl::writable) + .addFunction ("alist", &AutomationControl::alist) + .endClass () + + .deriveWSPtrClass ("GainControl") + .endClass () + + .deriveWSPtrClass ("Amp") + .addFunction ("gain_control", (boost::shared_ptr(Amp::*)())&Amp::gain_control) .endClass () .deriveWSPtrClass ("PluginControl") @@ -642,6 +688,8 @@ LuaBindings::common (lua_State* L) .beginNamespace ("AutomationType") .addConst ("PluginAutomation", ARDOUR::AutomationType(PluginAutomation)) + .addConst ("PluginAutomation", ARDOUR::AutomationType(GainAutomation)) + .addConst ("PluginAutomation", ARDOUR::AutomationType(TrimAutomation)) .endNamespace () .beginNamespace ("SrcQuality") @@ -759,6 +807,7 @@ LuaBindings::common (lua_State* L) .addFunction ("begin_reversible_command", (void (Session::*)(const std::string&))&Session::begin_reversible_command) .addFunction ("commit_reversible_command", &Session::commit_reversible_command) .addFunction ("abort_reversible_command", &Session::abort_reversible_command) + .addFunction ("add_command", &Session::add_command) .addFunction ("add_stateful_diff_command", &Session::add_stateful_diff_command) .endClass () @@ -784,6 +833,7 @@ LuaBindings::common (lua_State* L) .addFunction ("new_plugin", ARDOUR::LuaAPI::new_plugin) .addFunction ("set_processor_param", ARDOUR::LuaAPI::set_processor_param) .addFunction ("set_plugin_insert_param", ARDOUR::LuaAPI::set_plugin_insert_param) + .addCFunction ("plugin_automation", ARDOUR::LuaAPI::plugin_automation) .addFunction ("usleep", Glib::usleep) .endNamespace ()