aboutsummaryrefslogtreecommitdiffstats
path: root/abletonlink.c
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2022-12-13 12:31:29 +0000
committers-ol <s+removethis@s-ol.nu>2022-12-13 15:38:48 +0000
commit428b68cfd0b767cdfc716ffb68f8746e3ae192e0 (patch)
tree13b8d39a21041bb7bb2f84e77864cbcb89879014 /abletonlink.c
downloadlua-abletonlink-428b68cfd0b767cdfc716ffb68f8746e3ae192e0.tar.gz
lua-abletonlink-428b68cfd0b767cdfc716ffb68f8746e3ae192e0.zip
implement simple get/setters
Diffstat (limited to 'abletonlink.c')
-rw-r--r--abletonlink.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/abletonlink.c b/abletonlink.c
new file mode 100644
index 0000000..c6649b5
--- /dev/null
+++ b/abletonlink.c
@@ -0,0 +1,172 @@
+#include <lua.h>
+#include <lauxlib.h>
+#include "link/extensions/abl_link/include/abl_link.h"
+
+#if LUA_VERSION_NUM > 501
+#define luax_len(L, i) (int) lua_rawlen(L, i)
+#define luax_register(L, f) luaL_setfuncs(L, f, 0)
+#else
+#define luax_len(L, i) (int) lua_objlen(L, i)
+#define luax_register(L, f) luaL_register(L, NULL, f)
+#define LUA_RIDX_MAINTHREAD 1
+#endif
+
+static int l_create_link(lua_State* L) {
+ double bpm = luaL_checknumber(L, 1);
+
+ abl_link* link = (abl_link*)lua_newuserdata(L, sizeof(abl_link));
+
+ *link = abl_link_create(bpm);
+
+ luaL_getmetatable(L, "abletonlink.link");
+ lua_setmetatable(L, -2);
+
+ return 1;
+}
+
+static abl_link checklink(lua_State *L) {
+ abl_link* link = (abl_link*)luaL_checkudata(L, 1, "abletonlink.link");
+ luaL_argcheck(L, link != NULL, 1, "`link' expected");
+ luaL_argcheck(L, link->impl != NULL, 1, "`link' is already destroyed");
+ return *link;
+}
+
+static int l_destroy_link(lua_State* L) {
+ abl_link* link = (abl_link*)luaL_checkudata(L, 1, "abletonlink.link");
+ luaL_argcheck(L, link != NULL, 1, "`link' expected");
+ if (link->impl) {
+ abl_link_destroy(*link);
+ link->impl = NULL;
+ }
+ return 0;
+}
+
+static int l_is_enabled(lua_State* L) {
+ abl_link link = checklink(L);
+ bool enabled = abl_link_is_enabled(link);
+ lua_pushboolean(L, enabled);
+ return 1;
+}
+
+static int l_enable(lua_State* L) {
+ abl_link link = checklink(L);
+ bool enable = lua_isnoneornil(L, 2) ? true : lua_toboolean(L, 2);
+ abl_link_enable(link, enable);
+ return 0;
+}
+
+static int l_is_start_stop_sync_enabled(lua_State* L) {
+ abl_link link = checklink(L);
+ bool enabled = abl_link_is_start_stop_sync_enabled(link);
+ lua_pushboolean(L, enabled);
+ return 1;
+}
+
+static int l_enable_start_stop_sync(lua_State* L) {
+ abl_link link = checklink(L);
+ bool enable = lua_isnoneornil(L, 2) ? true : lua_toboolean(L, 2);
+ abl_link_enable_start_stop_sync(link, enable);
+ return 0;
+}
+
+static int l_num_peers(lua_State* L) {
+ abl_link link = checklink(L);
+ uint64_t peers = abl_link_num_peers(link);
+ lua_pushinteger(L, peers);
+ return 1;
+}
+
+static int l_clock_micros(lua_State* L) {
+ abl_link link = checklink(L);
+ int64_t micros = abl_link_clock_micros(link);
+ lua_pushinteger(L, micros);
+ return 1;
+}
+
+static const luaL_Reg abl_link_r[] = {
+ { "destroy", l_destroy_link },
+ { "is_enabled", l_is_enabled},
+ { "enable", l_enable },
+ { "is_start_stop_sync_enabled", l_is_start_stop_sync_enabled },
+ { "enable_start_stop_sync", l_enable_start_stop_sync},
+ { "num_peers", l_num_peers },
+ { "clock_micros", l_clock_micros },
+ /*
+ { "capture_audio_session_state", l_capture_audio_session_state },
+ { "commit_audio_session_state", l_commit_audio_session_state },
+ { "capture_app_session_state", l_capture_app_session_state },
+ { "commit_app_session_state", l_commit_app_session_state },
+ */
+ { "__gc", l_destroy_link },
+ { NULL, NULL },
+};
+
+static abl_link_session_state* checksessionstate(lua_State *L) {
+ void *ud = luaL_checkudata(L, 1, "abletonlink.session_state");
+ luaL_argcheck(L, ud != NULL, 1, "`session_state' expected");
+ return (abl_link_session_state*)ud;
+}
+
+static int l_destroy_session_state(lua_State* L) {
+ abl_link_session_state* state = checksessionstate(L);
+ if (state->impl) {
+ abl_link_destroy_session_state(*state);
+ state->impl = NULL;
+ }
+ return 0;
+}
+
+static const luaL_Reg abl_link_session_state_r[] = {
+ { "destroy", l_destroy_session_state },
+ /*
+ { "tempo", l_tempo },
+ { "set_tempo", l_set_tempo },
+ { "beat_at_time", l_beat_at_time },
+ { "phase_at_time", l_phase_at_time },
+ { "time_at_beat", l_time_at_beat },
+ { "request_beat_at_time", l_request_beat_at_time },
+ { "force_beat_at_time", l_force_beat_at_time },
+ { "is_playing", l_is_playing },
+ { "set_is_playing", l_set_is_playing },
+ { "time_for_is_playing", l_time_for_is_playing },
+ { "request_beat_at_start_playing_time", l_request_beat_at_start_playing_time },
+ { "set_is_playing_and_request_beat_at_time", l_set_is_playing_and_request_beat_at_time },
+ */
+ { "__gc", l_destroy_session_state },
+ { NULL, NULL },
+};
+
+static const luaL_Reg abletonlink[] = {
+ { "create", l_create_link },
+ { NULL, NULL },
+};
+
+int luaopen_abletonlink(lua_State* L) {
+ luaL_newmetatable(L, "abletonlink.link");
+ lua_getmetatable(L, -1);
+
+ // m.__index = m
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -1, "__index");
+
+ // register
+ luax_register(L, abl_link_r);
+ lua_pop(L, 1);
+
+ luaL_newmetatable(L, "abletonlink.session_state");
+ lua_getmetatable(L, -1);
+
+ // m.__index = m
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -1, "__index");
+
+ // register
+ luax_register(L, abl_link_session_state_r);
+ lua_pop(L, 1);
+
+ lua_newtable(L);
+ lua_pushstring(L, "v1.0.0");
+ lua_setfield(L, -2, "_VERSION");
+ luax_register(L, abletonlink);
+ return 1;
+}