diff --git a/libs/ardour/ardour/lua_script_params.h b/libs/ardour/ardour/lua_script_params.h new file mode 100644 index 0000000000..6b041dec3b --- /dev/null +++ b/libs/ardour/ardour/lua_script_params.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 Robin Gareus + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ +#ifndef _ardour_lua_script_params_h_ +#define _ardour_lua_script_params_h_ + +#include "ardour/luascripting.h" +#include "LuaBridge/LuaBridge.h" + +/* Semantically these are static functions of the LuaScripting class + * but are kept separately to minimize header includes. + * + * LuaScripting itself is a standalone abstraction (not depending on luabridge) + * luascripting.h is included by session.h (this file is not). + * + * The implementation of these functions is in libs/ardour/luascripting.cc + */ +namespace ARDOUR { namespace LuaScriptParams { + + LuaScriptParamList script_params (LuaScriptInfoPtr, const std::string &); + LuaScriptParamList script_params (const std::string &, const std::string &, bool file=true); + void params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList&); + void ref_to_params (LuaScriptParamList&, luabridge::LuaRef *tbl_args); + +} } // namespace + +#endif // _ardour_lua_script_params_h_ diff --git a/libs/ardour/ardour/luascripting.h b/libs/ardour/ardour/luascripting.h index a5a066b2cd..d55f131799 100644 --- a/libs/ardour/ardour/luascripting.h +++ b/libs/ardour/ardour/luascripting.h @@ -101,12 +101,6 @@ public: void refresh (); static LuaScriptInfoPtr script_info (const std::string &script ) { return scan_script ("", script); } - - static LuaScriptParamList script_params (LuaScriptInfoPtr, const std::string &); - static LuaScriptParamList session_script_params (LuaScriptInfoPtr lsi) { - return script_params (lsi, "sess_params"); - } - static bool try_compile (const std::string&, const LuaScriptParamList&); static std::string get_factory_bytecode (const std::string&); diff --git a/libs/ardour/luascripting.cc b/libs/ardour/luascripting.cc index d3768c17d5..5350ea8f11 100644 --- a/libs/ardour/luascripting.cc +++ b/libs/ardour/luascripting.cc @@ -23,6 +23,7 @@ #include "pbd/compose.h" #include "ardour/luascripting.h" +#include "ardour/lua_script_params.h" #include "ardour/search_paths.h" #include "lua/luastate.h" @@ -275,24 +276,33 @@ LuaScriptInfo::str2type (const std::string& str) { } LuaScriptParamList -LuaScripting::script_params (LuaScriptInfoPtr lsi, const std::string &fn) +LuaScriptParams::script_params (LuaScriptInfoPtr lsi, const std::string &pname) +{ + assert (lsi); + return LuaScriptParams::script_params (lsi->path, pname); +} + +LuaScriptParamList +LuaScriptParams::script_params (const std::string& s, const std::string &pname, bool file) { LuaScriptParamList rv; - assert (lsi); LuaState lua; lua_State* L = lua.getState(); - lua.Print.connect (&LuaScripting::lua_print); lua.do_command ("io = nil;"); lua.do_command ("function ardour () end"); try { - lua.do_file (lsi->path); + if (file) { + lua.do_file (s); + } else { + lua.do_command (s); + } } catch (luabridge::LuaException const& e) { return rv; } - luabridge::LuaRef lua_params = luabridge::getGlobal (L, fn.c_str()); + luabridge::LuaRef lua_params = luabridge::getGlobal (L, pname.c_str()); if (lua_params.isFunction ()) { luabridge::LuaRef params = lua_params (); if (params.isTable ()) { @@ -320,6 +330,33 @@ LuaScripting::script_params (LuaScriptInfoPtr lsi, const std::string &fn) return rv; } +void +LuaScriptParams::params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList& args) +{ + assert (tbl_args && (*tbl_args).isTable ()); + for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) { + if ((*i)->optional && !(*i)->is_set) { continue; } + (*tbl_args)[(*i)->name] = (*i)->value; + } +} + +void +LuaScriptParams::ref_to_params (LuaScriptParamList& args, luabridge::LuaRef *tbl_ref) +{ + assert (tbl_ref && (*tbl_ref).isTable ()); + for (luabridge::Iterator i (*tbl_ref); !i.isNil (); ++i) { + if (!i.key ().isString ()) { assert(0); continue; } + std::string name = i.key ().cast (); + std::string value = i.value ().cast (); + for (LuaScriptParamList::const_iterator ii = args.begin(); ii != args.end(); ++ii) { + if ((*ii)->name == name) { + (*ii)->value = value; + break; + } + } + } +} + bool LuaScripting::try_compile (const std::string& script, const LuaScriptParamList& args) { diff --git a/libs/lua/LuaBridge/LuaBridge.h b/libs/lua/LuaBridge/LuaBridge.h index a7384f68d3..706e77cbfd 100644 --- a/libs/lua/LuaBridge/LuaBridge.h +++ b/libs/lua/LuaBridge/LuaBridge.h @@ -51,6 +51,8 @@ #include #include +#include "lua/luastate.h" + #define LUABRIDGE_MAJOR_VERSION 2 #define LUABRIDGE_MINOR_VERSION 0 #define LUABRIDGE_VERSION 200