diff options
| -rw-r--r-- | abletonlink.c | 166 | ||||
| -rw-r--r-- | spec/abletonlink_spec.lua | 22 |
2 files changed, 170 insertions, 18 deletions
diff --git a/abletonlink.c b/abletonlink.c index c6649b5..a4a8caf 100644 --- a/abletonlink.c +++ b/abletonlink.c @@ -24,6 +24,17 @@ static int l_create_link(lua_State* L) { return 1; } +static int l_create_session_state(lua_State* L) { + abl_link_session_state* session_state = (abl_link_session_state*)lua_newuserdata(L, sizeof(abl_link_session_state)); + + *session_state = abl_link_create_session_state(); + + luaL_getmetatable(L, "abletonlink.session_state"); + 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"); @@ -31,6 +42,13 @@ static abl_link checklink(lua_State *L) { return *link; } +static abl_link_session_state checksessionstate(lua_State *L, int ud) { + abl_link_session_state* session_state = (abl_link_session_state*)luaL_checkudata(L, ud, "abletonlink.session_state"); + luaL_argcheck(L, session_state != NULL, 1, "`session_state' expected"); + luaL_argcheck(L, session_state->impl != NULL, 1, "`session_state' is already destroyed"); + return *session_state; +} + 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"); @@ -83,6 +101,34 @@ static int l_clock_micros(lua_State* L) { return 1; } +static int l_capture_audio_session_state(lua_State* L) { + abl_link link = checklink(L); + abl_link_session_state session_state = checksessionstate(L, 2); + abl_link_capture_audio_session_state(link, session_state); + return 0; +} + +static int l_commit_audio_session_state(lua_State* L) { + abl_link link = checklink(L); + abl_link_session_state session_state = checksessionstate(L, 2); + abl_link_commit_audio_session_state(link, session_state); + return 0; +} + +static int l_capture_app_session_state(lua_State* L) { + abl_link link = checklink(L); + abl_link_session_state session_state = checksessionstate(L, 2); + abl_link_capture_app_session_state(link, session_state); + return 0; +} + +static int l_commit_app_session_state(lua_State* L) { + abl_link link = checklink(L); + abl_link_session_state session_state = checksessionstate(L, 2); + abl_link_commit_app_session_state(link, session_state); + return 0; +} + static const luaL_Reg abl_link_r[] = { { "destroy", l_destroy_link }, { "is_enabled", l_is_enabled}, @@ -91,34 +137,126 @@ static const luaL_Reg abl_link_r[] = { { "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; + abl_link_session_state* session_state = (abl_link_session_state*)luaL_checkudata(L, 1, "abletonlink.session_state"); + luaL_argcheck(L, session_state != NULL, 1, "`session_state' expected"); + if (session_state->impl) { + abl_link_destroy_session_state(*session_state); + session_state->impl = NULL; } return 0; } +static int l_tempo(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double bpm = abl_link_tempo(session_state); + lua_pushnumber(L, bpm); + return 1; +} + +static int l_set_tempo(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double bpm = luaL_checknumber(L, 2); + int64_t at_time = luaL_checkinteger(L, 3); + abl_link_set_tempo(session_state, bpm, at_time); + return 0; +} + +static int l_beat_at_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + int64_t time = luaL_checkinteger(L, 2); + double quantum = luaL_checknumber(L, 3); + double beat = abl_link_beat_at_time(session_state, time, quantum); + lua_pushnumber(L, beat); + return 1; +} + +static int l_phase_at_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + int64_t time = luaL_checkinteger(L, 2); + double quantum = luaL_checknumber(L, 3); + double phase = abl_link_phase_at_time(session_state, time, quantum); + lua_pushnumber(L, phase); + return 1; +} + +static int l_time_at_beat(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double beat = luaL_checknumber(L, 2); + double quantum = luaL_checknumber(L, 3); + int64_t time = abl_link_time_at_beat(session_state, beat, quantum); + lua_pushinteger(L, time); + return 1; +} + +static int l_request_beat_at_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double beat = luaL_checknumber(L, 2); + int64_t time = luaL_checkinteger(L, 3); + double quantum = luaL_checknumber(L, 4); + abl_link_request_beat_at_time(session_state, beat, time, quantum); + return 0; +} + +static int l_force_beat_at_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double beat = luaL_checknumber(L, 2); + int64_t time = luaL_checkinteger(L, 3); + double quantum = luaL_checknumber(L, 4); + abl_link_force_beat_at_time(session_state, beat, time, quantum); + return 0; +} + +static int l_is_playing(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + bool playing = abl_link_is_playing(session_state); + lua_pushboolean(L, playing); + return 1; +} + +static int l_set_is_playing(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + bool playing = lua_toboolean(L, 2); + int64_t time = luaL_checkinteger(L, 3); + abl_link_set_is_playing(session_state, playing, time); + return 0; +} + +static int l_time_for_is_playing(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + int64_t time = abl_link_time_for_is_playing(session_state); + lua_pushinteger(L, time); + return 1; +} + +static int l_request_beat_at_start_playing_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + double beat = luaL_checknumber(L, 2); + double quantum = luaL_checknumber(L, 3); + abl_link_request_beat_at_start_playing_time(session_state, beat, quantum); + return 0; +} + +static int l_set_is_playing_and_request_beat_at_time(lua_State* L) { + abl_link_session_state session_state = checksessionstate(L, 1); + bool playing = lua_toboolean(L, 2); + int64_t time = luaL_checkinteger(L, 3); + double beat = luaL_checknumber(L, 4); + double quantum = luaL_checknumber(L, 5); + abl_link_set_is_playing_and_request_beat_at_time(session_state, playing, time, beat, quantum); + 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 }, @@ -131,13 +269,13 @@ static const luaL_Reg abl_link_session_state_r[] = { { "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 }, + { "create_session_state", l_create_session_state }, { NULL, NULL }, }; diff --git a/spec/abletonlink_spec.lua b/spec/abletonlink_spec.lua index a2e4398..b0d62c1 100644 --- a/spec/abletonlink_spec.lua +++ b/spec/abletonlink_spec.lua @@ -19,10 +19,7 @@ describe("abletonlink library", function() it("can create and destroy link objects", function() local l = link.create(120) l:destroy() - - assert.has.error(function() - l:is_enabled() - end) + assert.has.error(function() l:is_enabled() end) end) it("can be enabled and disabled", function() @@ -78,4 +75,21 @@ describe("abletonlink library", function() last = next end end) + + describe("app state", function() + it("can be created and destroyed", function() + local s = link.create_session_state() + s:tempo() + s:destroy() + assert.has.error(function() s:tempo() end) + end) + + it("can get/set tempo", function() + local s = link.create_session_state() + s:set_tempo(120, 0) + assert.is.equal(120, s:tempo()) + s:set_tempo(90, 0) + assert.is.equal(90, s:tempo()) + end) + end) end) |
