#include #include #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; }