diff options
| author | s-ol <s+removethis@s-ol.nu> | 2022-12-13 12:31:29 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2022-12-13 15:38:48 +0000 |
| commit | 428b68cfd0b767cdfc716ffb68f8746e3ae192e0 (patch) | |
| tree | 13b8d39a21041bb7bb2f84e77864cbcb89879014 /abletonlink.c | |
| download | lua-abletonlink-428b68cfd0b767cdfc716ffb68f8746e3ae192e0.tar.gz lua-abletonlink-428b68cfd0b767cdfc716ffb68f8746e3ae192e0.zip | |
implement simple get/setters
Diffstat (limited to 'abletonlink.c')
| -rw-r--r-- | abletonlink.c | 172 |
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; +} |
