summaryrefslogtreecommitdiff
path: root/libs/ardour/lua_api.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-12-08 12:44:36 +0100
committerRobin Gareus <robin@gareus.org>2016-12-08 12:45:44 +0100
commitf05f19bdd4c376d8427f488ab9c812df4d400fbc (patch)
tree0a1f3c7c5b03b97853deb8d2d5cf4ee37f4ec71c /libs/ardour/lua_api.cc
parent3d925ef503faae520c670464653856f62c6ca56b (diff)
add Lua bindings for Timecode conversion
Diffstat (limited to 'libs/ardour/lua_api.cc')
-rw-r--r--libs/ardour/lua_api.cc122
1 files changed, 122 insertions, 0 deletions
diff --git a/libs/ardour/lua_api.cc b/libs/ardour/lua_api.cc
index 6a2dbbe9f6..5af9a6c960 100644
--- a/libs/ardour/lua_api.cc
+++ b/libs/ardour/lua_api.cc
@@ -253,6 +253,128 @@ ARDOUR::LuaAPI::plugin_automation (lua_State *L)
}
int
+ARDOUR::LuaAPI::sample_to_timecode (lua_State *L)
+{
+ int top = lua_gettop (L);
+ if (top < 3) {
+ return luaL_argerror (L, 1, "invalid number of arguments sample_to_timecode (TimecodeFormat, sample_rate, sample)");
+ }
+ typedef Timecode::TimecodeFormat T;
+ T tf = luabridge::Stack<T>::get (L, 1);
+ double sample_rate = luabridge::Stack<double>::get (L, 2);
+ int64_t sample = luabridge::Stack<int64_t>::get (L, 3);
+
+ Timecode::Time timecode;
+
+ Timecode::sample_to_timecode (
+ sample, timecode, false, false,
+ Timecode::timecode_to_frames_per_second (tf),
+ Timecode::timecode_has_drop_frames (tf),
+ sample_rate,
+ 0, false, 0);
+
+ luabridge::Stack<uint32_t>::push (L, timecode.hours);
+ luabridge::Stack<uint32_t>::push (L, timecode.minutes);
+ luabridge::Stack<uint32_t>::push (L, timecode.seconds);
+ luabridge::Stack<uint32_t>::push (L, timecode.frames);
+ return 4;
+}
+
+int
+ARDOUR::LuaAPI::timecode_to_sample (lua_State *L)
+{
+ int top = lua_gettop (L);
+ if (top < 6) {
+ return luaL_argerror (L, 1, "invalid number of arguments sample_to_timecode (TimecodeFormat, sample_rate, hh, mm, ss, ff)");
+ }
+ typedef Timecode::TimecodeFormat T;
+ T tf = luabridge::Stack<T>::get (L, 1);
+ double sample_rate = luabridge::Stack<double>::get (L, 2);
+ int hh = luabridge::Stack<int>::get (L, 3);
+ int mm = luabridge::Stack<int>::get (L, 4);
+ int ss = luabridge::Stack<int>::get (L, 5);
+ int ff = luabridge::Stack<int>::get (L, 6);
+
+ Timecode::Time timecode;
+ timecode.negative = false;
+ timecode.hours = hh;
+ timecode.minutes = mm;
+ timecode.seconds = ss;
+ timecode.frames = ff;
+ timecode.subframes = 0;
+ timecode.rate = Timecode::timecode_to_frames_per_second (tf);
+ timecode.drop = Timecode::timecode_has_drop_frames (tf);
+
+ int64_t sample;
+
+ Timecode::timecode_to_sample (
+ timecode, sample, false, false,
+ sample_rate, 0, false, 0);
+
+ luabridge::Stack<int64_t>::push (L, sample);
+ return 1;
+}
+
+int
+ARDOUR::LuaAPI::sample_to_timecode_lua (lua_State *L)
+{
+ int top = lua_gettop (L);
+ if (top < 2) {
+ return luaL_argerror (L, 1, "invalid number of arguments sample_to_timecode (sample)");
+ }
+ Session const* const s = luabridge::Userdata::get <Session> (L, 1, true);
+ int64_t sample = luabridge::Stack<int64_t>::get (L, 2);
+
+ Timecode::Time timecode;
+
+ Timecode::sample_to_timecode (
+ sample, timecode, false, false,
+ s->timecode_frames_per_second (),
+ s->timecode_drop_frames (),
+ s->frame_rate (),
+ 0, false, 0);
+
+ luabridge::Stack<uint32_t>::push (L, timecode.hours);
+ luabridge::Stack<uint32_t>::push (L, timecode.minutes);
+ luabridge::Stack<uint32_t>::push (L, timecode.seconds);
+ luabridge::Stack<uint32_t>::push (L, timecode.frames);
+ return 4;
+}
+int
+ARDOUR::LuaAPI::timecode_to_sample_lua (lua_State *L)
+{
+ int top = lua_gettop (L);
+ if (top < 5) {
+ return luaL_argerror (L, 1, "invalid number of arguments sample_to_timecode (hh, mm, ss, ff)");
+ }
+ Session const* const s = luabridge::Userdata::get <Session> (L, 1, true);
+ int hh = luabridge::Stack<int>::get (L, 2);
+ int mm = luabridge::Stack<int>::get (L, 3);
+ int ss = luabridge::Stack<int>::get (L, 4);
+ int ff = luabridge::Stack<int>::get (L, 5);
+
+ Timecode::Time timecode;
+ timecode.negative = false;
+ timecode.hours = hh;
+ timecode.minutes = mm;
+ timecode.seconds = ss;
+ timecode.frames = ff;
+ timecode.subframes = 0;
+ timecode.rate = s->timecode_frames_per_second ();
+ timecode.drop = s->timecode_drop_frames ();
+
+ int64_t sample;
+
+ Timecode::timecode_to_sample (
+ timecode, sample, false, false,
+ s->frame_rate (),
+ 0, false, 0);
+
+ luabridge::Stack<int64_t>::push (L, sample);
+ return 1;
+}
+
+int
ARDOUR::LuaOSC::Address::send (lua_State *L)
{
Address * const luaosc = luabridge::Userdata::get <Address> (L, 1, false);