📄 variables.c
字号:
/***************************************************************************** * variables.c: Generic lua<->vlc variables interface ***************************************************************************** * Copyright (C) 2007-2008 the VideoLAN team * $Id$ * * Authors: Antoine Cellerier <dionoea at 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 * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#ifndef _GNU_SOURCE# define _GNU_SOURCE#endif#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <lua.h> /* Low level lua C API */#include <lauxlib.h> /* Higher level C API */#include <lualib.h> /* Lua libs */#include "../vlc.h"#include "../libs.h"#include "variables.h"#include "objects.h"/***************************************************************************** * Variables handling *****************************************************************************/int vlclua_pushvalue( lua_State *L, int i_type, vlc_value_t val ){ switch( i_type &= 0xf0 ) { case VLC_VAR_VOID: vlclua_error( L ); break; case VLC_VAR_BOOL: lua_pushboolean( L, val.b_bool ); break; case VLC_VAR_INTEGER: lua_pushinteger( L, val.i_int ); break; case VLC_VAR_STRING: lua_pushstring( L, val.psz_string ); break; case VLC_VAR_FLOAT: lua_pushnumber( L, val.f_float ); break; case VLC_VAR_TIME: /* FIXME? (we're losing some precision, but does it really matter?) */ lua_pushnumber( L, ((double)val.i_time)/1000000. ); break; case VLC_VAR_ADDRESS: vlclua_error( L ); break; case VLC_VAR_MUTEX: vlclua_error( L ); break; case VLC_VAR_LIST: { int i_count = val.p_list->i_count; int i; lua_createtable( L, i_count, 0 ); for( i = 0; i < i_count; i++ ) { lua_pushinteger( L, i+1 ); if( !vlclua_pushvalue( L, val.p_list->pi_types[i], val.p_list->p_values[i] ) ) lua_pushnil( L ); lua_settable( L, -3 ); } } break; default: vlclua_error( L ); } return 1;}static int vlclua_tovalue( lua_State *L, int i_type, vlc_value_t *val ){ switch( i_type & 0xf0 ) { case VLC_VAR_VOID: break; case VLC_VAR_BOOL: val->b_bool = luaL_checkboolean( L, -1 ); break; case VLC_VAR_INTEGER: val->i_int = luaL_checkint( L, -1 ); break; case VLC_VAR_STRING: val->psz_string = (char*)luaL_checkstring( L, -1 ); /* XXX: Beware, this only stays valid as long as (L,-1) stays in the stack */ break; case VLC_VAR_FLOAT: val->f_float = luaL_checknumber( L, -1 ); break; case VLC_VAR_TIME: { double f = luaL_checknumber( L, -1 ); val->i_time = (int64_t)(f*1000000.); } break; case VLC_VAR_ADDRESS: vlclua_error( L ); break; case VLC_VAR_MUTEX: vlclua_error( L ); break; case VLC_VAR_LIST: vlclua_error( L ); break; default: vlclua_error( L ); } return 1;}static int vlclua_var_get( lua_State *L ){ int i_type; vlc_value_t val; vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); i_type = var_Type( *pp_obj, psz_var ); if( var_Get( *pp_obj, psz_var, &val ) != VLC_SUCCESS ) return 0; lua_pop( L, 2 ); return vlclua_pushvalue( L, i_type, val );}static int vlclua_var_set( lua_State *L ){ int i_type; vlc_value_t val; vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); int i_ret; i_type = var_Type( *pp_obj, psz_var ); vlclua_tovalue( L, i_type, &val ); i_ret = var_Set( *pp_obj, psz_var, val ); lua_pop( L, 3 ); return vlclua_push_ret( L, i_ret );}static int vlclua_var_create( lua_State *L ){ vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); int i_type; switch( lua_type( L, 3 ) ) { case LUA_TNUMBER: i_type = VLC_VAR_FLOAT; break; case LUA_TBOOLEAN: i_type = VLC_VAR_BOOL; break; case LUA_TSTRING: i_type = VLC_VAR_STRING; break; default: return 0; } int i_ret = var_Create( *pp_obj, psz_var, i_type ); if( i_ret != VLC_SUCCESS ) return vlclua_push_ret( L, i_ret ); vlc_value_t val; vlclua_tovalue( L, i_type, &val ); return vlclua_push_ret( L, var_Set( *pp_obj, psz_var, val ) );}static int vlclua_var_get_list( lua_State *L ){ vlc_value_t val; vlc_value_t text; vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); const char *psz_var = luaL_checkstring( L, 2 ); int i_ret = var_Change( *pp_obj, psz_var, VLC_VAR_GETLIST, &val, &text ); if( i_ret < 0 ) return vlclua_push_ret( L, i_ret ); vlclua_pushvalue( L, VLC_VAR_LIST, val ); vlclua_pushvalue( L, VLC_VAR_LIST, text ); var_Change( *pp_obj, psz_var, VLC_VAR_FREELIST, &val, &text ); return 2;}static int vlclua_command( lua_State *L ){ vlc_object_t * p_this = vlclua_get_this( L ); const char *psz_name; const char *psz_cmd; const char *psz_arg; char *psz_msg; psz_name = luaL_checkstring( L, 1 ); psz_cmd = luaL_checkstring( L, 2 ); psz_arg = luaL_checkstring( L, 3 ); lua_pop( L, 3 ); var_Command( p_this, psz_name, psz_cmd, psz_arg, &psz_msg ); if( psz_msg ) { lua_pushstring( L, psz_msg ); free( psz_msg ); } else { lua_pushstring( L, "" ); } return 1;}static int vlclua_libvlc_command( lua_State *L ){ vlc_object_t * p_this = vlclua_get_this( L ); const char *psz_cmd; vlc_value_t val_arg; psz_cmd = luaL_checkstring( L, 1 ); val_arg.psz_string = strdup( luaL_optstring( L, 2, "" ) ); lua_pop( L, 2 ); int i_type = var_Type( p_this->p_libvlc, psz_cmd ); if( ! i_type & VLC_VAR_ISCOMMAND ) { free( val_arg.psz_string ); return luaL_error( L, "libvlc's \"%s\" is not a command", psz_cmd ); } return vlclua_push_ret( L, var_Set( p_this->p_libvlc, psz_cmd, val_arg ) );}int __vlclua_var_toggle_or_set( lua_State *L, vlc_object_t *p_obj, const char *psz_name ){ bool b_bool; if( lua_gettop( L ) > 1 ) return vlclua_error( L ); if( lua_gettop( L ) == 0 ) b_bool = !var_GetBool( p_obj, psz_name ); else /* lua_gettop( L ) == 1 */ { b_bool = luaL_checkboolean( L, -1 )?true:false; lua_pop( L, 1 ); } if( b_bool != var_GetBool( p_obj, psz_name ) ) var_SetBool( p_obj, psz_name, b_bool ); lua_pushboolean( L, b_bool ); return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -