aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--backends/lua.c22
-rw-r--r--backends/lua.md6
-rw-r--r--midimonster.h2
3 files changed, 26 insertions, 4 deletions
diff --git a/backends/lua.c b/backends/lua.c
index ee9e03f..510fc72 100644
--- a/backends/lua.c
+++ b/backends/lua.c
@@ -9,6 +9,7 @@
#endif
#define LUA_REGISTRY_KEY "_midimonster_lua_instance"
+#define LUA_REGISTRY_CURRENT_CHANNEL "_midimonster_lua_channel"
static size_t timers = 0;
static lua_timer* timer = NULL;
@@ -189,6 +190,7 @@ static int lua_callback_interval(lua_State* interpreter){
if(lua_gettable(interpreter, LUA_REGISTRYINDEX) == LUA_TNUMBER){
//already interval'd
reference = luaL_checkinteger(interpreter, 4);
+ DBGPF("Updating interval to %" PRIu64 " msec", interval);
}
else if(interval){
//get a reference to the function
@@ -199,6 +201,8 @@ static int lua_callback_interval(lua_State* interpreter){
lua_pushvalue(interpreter, 1);
lua_pushinteger(interpreter, reference);
lua_settable(interpreter, LUA_REGISTRYINDEX);
+
+ DBGPF("Registered interval with %" PRIu64 " msec", interval);
}
//find matching timer
@@ -273,6 +277,12 @@ static int lua_callback_output_value(lua_State* interpreter){
return lua_callback_value(interpreter, 0);
}
+static int lua_callback_input_channel(lua_State* interpreter){
+ lua_pushstring(interpreter, LUA_REGISTRY_CURRENT_CHANNEL);
+ lua_gettable(interpreter, LUA_REGISTRYINDEX);
+ return 1;
+}
+
static int lua_configure(char* option, char* value){
LOG("No backend configuration possible");
return 1;
@@ -320,6 +330,7 @@ static instance* lua_instance(){
lua_register(data->interpreter, "interval", lua_callback_interval);
lua_register(data->interpreter, "input_value", lua_callback_input_value);
lua_register(data->interpreter, "output_value", lua_callback_output_value);
+ lua_register(data->interpreter, "input_channel", lua_callback_input_channel);
//store instance pointer to the lua state
lua_pushstring(data->interpreter, LUA_REGISTRY_KEY);
@@ -374,6 +385,11 @@ static int lua_set(instance* inst, size_t num, channel** c, channel_value* v){
data->input[c[n]->ident] = v[n].normalised;
//call lua channel handlers if present
if(data->reference[c[n]->ident] != LUA_NOREF){
+ //push the channel name
+ lua_pushstring(data->interpreter, LUA_REGISTRY_CURRENT_CHANNEL);
+ lua_pushstring(data->interpreter, data->channel_name[c[n]->ident]);
+ lua_settable(data->interpreter, LUA_REGISTRYINDEX);
+
lua_rawgeti(data->interpreter, LUA_REGISTRYINDEX, data->reference[c[n]->ident]);
lua_pushnumber(data->interpreter, v[n].normalised);
if(lua_pcall(data->interpreter, 1, 0, 0) != LUA_OK){
@@ -382,6 +398,11 @@ static int lua_set(instance* inst, size_t num, channel** c, channel_value* v){
}
}
}
+
+ //clear the channel name
+ lua_pushstring(data->interpreter, LUA_REGISTRY_CURRENT_CHANNEL);
+ lua_pushnil(data->interpreter);
+ lua_settable(data->interpreter, LUA_REGISTRYINDEX);
return 0;
}
@@ -422,6 +443,7 @@ static int lua_handle(size_t num, managed_fd* fds){
timer[n].delta %= timer[n].interval;
lua_rawgeti(timer[n].interpreter, LUA_REGISTRYINDEX, timer[n].reference);
lua_pcall(timer[n].interpreter, 0, 0, 0);
+ DBGPF("Calling interval timer function %" PRIsize_t, n);
}
}
}
diff --git a/backends/lua.md b/backends/lua.md
index f38e189..650fdb9 100644
--- a/backends/lua.md
+++ b/backends/lua.md
@@ -16,7 +16,7 @@ The following functions are provided within the Lua interpreter for interaction
| `interval(function, number)` | `interval(update, 100)` | Register a function to be called periodically. Intervals are milliseconds (rounded to the nearest 10 ms) |
| `input_value(string)` | `input_value("foo")` | Get the last input value on a channel |
| `output_value(string)` | `output_value("bar")` | Get the last output value on a channel |
-
+| `input_channel()` | `print(input_channel())` | Returns the name of the input channel whose handler function is currently running or `nil` if in an `interval`'ed function (or the initial parse step) |
Example script:
```
@@ -58,8 +58,8 @@ lua1.foo > lua2.bar
#### Known bugs / problems
-Using any of the interface functions (`output`, `interval`, `input_value`, `output_value`) as an
-input channel name to a Lua instance will not call any handler functions.
+Using any of the interface functions (`output`, `interval`, `input_value`, `output_value`, `input_channel`)
+as an input channel name to a Lua instance will not call any handler functions.
Using these names as arguments to the output and value interface functions works as intended.
Output values will not trigger corresponding input event handlers unless the channel is mapped
diff --git a/midimonster.h b/midimonster.h
index 5844bb9..c5a6cf5 100644
--- a/midimonster.h
+++ b/midimonster.h
@@ -7,7 +7,7 @@
/* Core version unless set by the build process */
#ifndef MIDIMONSTER_VERSION
- #define MIDIMONSTER_VERSION "v0.3-dist"
+ #define MIDIMONSTER_VERSION "v0.4-dist"
#endif
/* Set backend name if unset */