From 80ca7c7067c55c3685110b701254567dbedeff0d Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Duraffort?= Date: Sun, 12 Sep 2010 19:24:10 +0200 Subject: [PATCH] lua: implement timers in vlc.misc --- modules/misc/lua/libs/misc.c | 88 ++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/modules/misc/lua/libs/misc.c b/modules/misc/lua/libs/misc.c index b2fb76e2a2..2d7bbc9227 100644 --- a/modules/misc/lua/libs/misc.c +++ b/modules/misc/lua/libs/misc.c @@ -6,6 +6,7 @@ * * Authors: Antoine Cellerier * Pierre d'Herbemont + * Rémi Duraffort * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -243,6 +244,91 @@ static int vlclua_action_id( lua_State *L ) return 1; } +/***************************************************************************** + * Timer functions + *****************************************************************************/ +static int vlclua_timer_schedule( lua_State *L ); + +static const luaL_Reg vlclua_timer_reg[] = { + { "schedule", vlclua_timer_schedule }, + { NULL, NULL } +}; + +typedef struct +{ + lua_State *L; + vlc_timer_t timer; + char *psz_callback; +} vlclua_timer_t; + +static int vlclua_timer_schedule( lua_State *L ) +{ + vlclua_timer_t **pp_timer = (vlclua_timer_t**)luaL_checkudata( L, 1, "timer" ); + if( !pp_timer || !*pp_timer ) + luaL_error( L, "Can't get pointer to timer" ); + + bool b_relative = luaL_checkboolean( L, 2 ); + mtime_t i_value = luaL_checkinteger( L, 3 ); + mtime_t i_interval = luaL_checkinteger( L, 4 ); + + vlc_timer_schedule( (*pp_timer)->timer, b_relative, i_value, i_interval ); + return 0; +} + +static void vlclua_timer_callback( void *data ) +{ + vlclua_timer_t *p_timer = (vlclua_timer_t*)data; + lua_State *L = p_timer->L; + + lua_getglobal( L, p_timer->psz_callback ); + if( lua_pcall( L, 0, 0, 0 ) ) + { + const char *psz_err = lua_tostring( L, -1 ); + fprintf( stderr, "Error while running the timer callback: %s\n", psz_err ); + lua_settop( L, 0 ); + } +} + +static int vlclua_timer_delete( lua_State *L ) +{ + vlclua_timer_t **pp_timer = (vlclua_timer_t**)luaL_checkudata( L, 1, "timer" ); + if( !pp_timer || !*pp_timer ) + luaL_error( L, "Can't get pointer to timer" ); + + vlc_timer_destroy( (*pp_timer)->timer ); + free( (*pp_timer)->psz_callback ); + return 0; +} + +static int vlclua_timer_create( lua_State *L ) +{ + vlclua_timer_t *p_timer = malloc( sizeof( vlclua_timer_t ) ); + if( !lua_isstring( L, 1 ) ) + return luaL_error( L, "timer(function_name)" ); + + if( vlc_timer_create( &p_timer->timer, vlclua_timer_callback, p_timer ) ) + return luaL_error( L, "Cannot initialize the timer" ); + + p_timer->L = L; + p_timer->psz_callback = strdup( luaL_checkstring( L, 1 ) ); + + vlclua_timer_t **pp_timer = lua_newuserdata( L, sizeof( vlclua_timer_t* ) ); + *pp_timer = p_timer; + + /* Create the object */ + if( luaL_newmetatable( L, "timer" ) ) + { + lua_newtable( L ); + luaL_register( L, NULL, vlclua_timer_reg ); + lua_setfield( L, -2, "__index" ); + lua_pushcfunction( L, vlclua_timer_delete ); + lua_setfield( L, -2, "__gc" ); + } + lua_setmetatable( L, -2 ); + + return 1; +} + /***************************************************************************** * *****************************************************************************/ @@ -268,6 +354,8 @@ static const luaL_Reg vlclua_misc_reg[] = { { "should_die", vlclua_intf_should_die }, { "quit", vlclua_quit }, + { "timer", vlclua_timer_create }, + { NULL, NULL } }; -- 2.39.2