[vlc-commits] commit: lua: implement timers in vlc.misc ( Rémi Duraffort )
git at videolan.org
git at videolan.org
Sun Sep 12 19:24:43 CEST 2010
vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Sun Sep 12 19:24:10 2010 +0200| [80ca7c7067c55c3685110b701254567dbedeff0d] | committer: Rémi Duraffort
lua: implement timers in vlc.misc
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=80ca7c7067c55c3685110b701254567dbedeff0d
---
modules/misc/lua/libs/misc.c | 88 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 88 insertions(+), 0 deletions(-)
diff --git a/modules/misc/lua/libs/misc.c b/modules/misc/lua/libs/misc.c
index b2fb76e..2d7bbc9 100644
--- a/modules/misc/lua/libs/misc.c
+++ b/modules/misc/lua/libs/misc.c
@@ -6,6 +6,7 @@
*
* Authors: Antoine Cellerier <dionoea at videolan tod org>
* Pierre d'Herbemont <pdherbemont # videolan.org>
+ * Rémi Duraffort <ivoire # videolan tod org>
*
* 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
@@ -244,6 +245,91 @@ static int vlclua_action_id( lua_State *L )
}
/*****************************************************************************
+ * 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;
+}
+
+/*****************************************************************************
*
*****************************************************************************/
static const luaL_Reg vlclua_misc_reg[] = {
@@ -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 }
};
More information about the vlc-commits
mailing list