aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--abletonlink.c166
-rw-r--r--spec/abletonlink_spec.lua22
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)