summaryrefslogtreecommitdiffstats
path: root/player/lua.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-13 01:14:07 +0200
committerwm4 <wm4@nowhere>2014-05-13 02:39:37 +0200
commit2279f718de746d5fed3b64df74e9c47af98975b5 (patch)
tree57aa74740fcd067a5e87cb9810b2888b0548aeee /player/lua.c
parent2a2dd8aac2d68db1471bbb4fd852f85f3fcf9c24 (diff)
downloadmpv-2279f718de746d5fed3b64df74e9c47af98975b5.tar.bz2
mpv-2279f718de746d5fed3b64df74e9c47af98975b5.tar.xz
player: reorganize how lua scripts are loaded
Make loading of scripts independent of Lua. Move some of the loading code from lua.c to scripting.c, and make it easier to add new scripting backends.
Diffstat (limited to 'player/lua.c')
-rw-r--r--player/lua.c125
1 files changed, 11 insertions, 114 deletions
diff --git a/player/lua.c b/player/lua.c
index 0c8c415630..1c8a5c6cb5 100644
--- a/player/lua.c
+++ b/player/lua.c
@@ -44,7 +44,6 @@
#include "command.h"
#include "client.h"
#include "libmpv/client.h"
-#include "lua.h"
// List of builtin modules and their contents as strings.
// All these are generated from player/lua/*.lua
@@ -55,7 +54,7 @@ static const char *builtin_lua_scripts[][2] = {
{"mp.assdraw",
# include "player/lua/assdraw.inc"
},
- {"@osc",
+ {"@osc.lua",
# include "player/lua/osc.inc"
},
{0}
@@ -140,27 +139,6 @@ static int run_event_loop(lua_State *L)
static void add_functions(struct script_ctx *ctx);
-static char *script_name_from_filename(void *talloc_ctx, const char *fname)
-{
- fname = mp_basename(fname);
- if (fname[0] == '@')
- fname += 1;
- char *name = talloc_strdup(talloc_ctx, fname);
- // Drop .lua extension
- char *dot = strrchr(name, '.');
- if (dot)
- *dot = '\0';
- // Turn it into a safe identifier - this is used with e.g. dispatching
- // input via: "send scriptname ..."
- for (int n = 0; name[n]; n++) {
- char c = name[n];
- if (!(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z') &&
- !(c >= '0' && c <= '9'))
- name[n] = '_';
- }
- return talloc_asprintf(talloc_ctx, "%s", name);
-}
-
static int load_file(struct script_ctx *ctx, const char *fname)
{
int r = 0;
@@ -206,20 +184,10 @@ static bool require(lua_State *L, const char *name)
return true;
}
-struct thread_arg {
- struct MPContext *mpctx;
- mpv_handle *client;
- const char *fname;
-};
-
-static void *lua_thread(void *p)
+static int load_lua(struct mpv_handle *client, const char *fname)
{
- pthread_detach(pthread_self());
-
- struct thread_arg *arg = p;
- struct MPContext *mpctx = arg->mpctx;
- const char *fname = arg->fname;
- mpv_handle *client = arg->client;
+ struct MPContext *mpctx = mp_client_get_core(client);
+ int r = -1;
struct script_ctx *ctx = talloc_ptrtype(NULL, ctx);
*ctx = (struct script_ctx) {
@@ -301,40 +269,15 @@ static void *lua_thread(void *p)
if (mp_cpcall(L, run_event_loop, 0) != 0)
report_error(L);
+ r = 0;
+
error_out:
- MP_VERBOSE(ctx, "exiting.\n");
if (ctx->suspended)
mpv_resume(ctx->client);
if (ctx->state)
lua_close(ctx->state);
- mpv_destroy(ctx->client);
talloc_free(ctx);
- talloc_free(arg);
- return NULL;
-}
-
-static void mp_lua_load_script(struct MPContext *mpctx, const char *fname)
-{
- struct thread_arg *arg = talloc_ptrtype(NULL, arg);
- char *name = script_name_from_filename(arg, fname);
- *arg = (struct thread_arg){
- .mpctx = mpctx,
- .fname = talloc_strdup(arg, fname),
- // Create the client before creating the thread; otherwise a race
- // condition could happen, where MPContext is destroyed while the
- // thread tries to create the client.
- .client = mp_new_client(mpctx->clients, name),
- };
- if (!arg->client) {
- talloc_free(arg);
- return;
- }
-
- pthread_t thread;
- if (pthread_create(&thread, NULL, lua_thread, arg))
- talloc_free(arg);
-
- return;
+ return r;
}
static int check_loglevel(lua_State *L, int arg)
@@ -1099,53 +1042,7 @@ static void add_functions(struct script_ctx *ctx)
lua_setfield(L, -2, "get_property_osd");
}
-static int compare_filename(const void *pa, const void *pb)
-{
- char *a = (char *)pa;
- char *b = (char *)pb;
- return strcmp(a, b);
-}
-
-static char **list_lua_files(void *talloc_ctx, char *path)
-{
- char **files = NULL;
- int count = 0;
- DIR *dp = opendir(path);
- if (!dp)
- return NULL;
- struct dirent *ep;
- while ((ep = readdir(dp))) {
- char *ext = mp_splitext(ep->d_name, NULL);
- if (!ext || strcasecmp(ext, "lua") != 0)
- continue;
- char *fname = mp_path_join(talloc_ctx, bstr0(path), bstr0(ep->d_name));
- MP_TARRAY_APPEND(talloc_ctx, files, count, fname);
- }
- closedir(dp);
- qsort(files, count, sizeof(char *), compare_filename);
- MP_TARRAY_APPEND(talloc_ctx, files, count, NULL);
- return files;
-}
-
-void mp_lua_init(struct MPContext *mpctx)
-{
- // Load scripts from options
- if (mpctx->opts->lua_load_osc)
- mp_lua_load_script(mpctx, "@osc");
- char **files = mpctx->opts->lua_files;
- for (int n = 0; files && files[n]; n++) {
- if (files[n][0])
- mp_lua_load_script(mpctx, files[n]);
- }
- if (!mpctx->opts->auto_load_scripts)
- return;
- // Load ~/.mpv/lua/*
- void *tmp = talloc_new(NULL);
- char *lua_path = mp_find_user_config_file(tmp, mpctx->global, "lua");
- if (lua_path) {
- files = list_lua_files(tmp, lua_path);
- for (int n = 0; files && files[n]; n++)
- mp_lua_load_script(mpctx, files[n]);
- }
- talloc_free(tmp);
-}
+const struct mp_scripting mp_scripting_lua = {
+ .file_ext = "lua",
+ .load = load_lua,
+};