objects.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * objects.c: Generic lua<->vlc object wrapper
  3.  *****************************************************************************
  4.  * Copyright (C) 2007-2008 the VideoLAN team
  5.  * $Id: 950f5fe78752237b057432a11d0d8cb05d4ab99b $
  6.  *
  7.  * Authors: Antoine Cellerier <dionoea at videolan tod org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifndef  _GNU_SOURCE
  27. #   define  _GNU_SOURCE
  28. #endif
  29. #ifdef HAVE_CONFIG_H
  30. # include "config.h"
  31. #endif
  32. #include <vlc_common.h>
  33. #include <lua.h>        /* Low level lua C API */
  34. #include <lauxlib.h>    /* Higher level C API */
  35. #include "../vlc.h"
  36. #include "../libs.h"
  37. #include "objects.h"
  38. #include "playlist.h"
  39. #include "input.h"
  40. typedef struct
  41. {
  42.     vlc_object_t *p_obj;
  43. } vlclua_object_t;
  44. /*****************************************************************************
  45.  * Generic vlc_object_t wrapper creation
  46.  *****************************************************************************/
  47. int __vlclua_push_vlc_object( lua_State *L, vlc_object_t *p_obj,
  48.                               lua_CFunction pf_gc )
  49. {
  50.     vlc_object_t **udata = (vlc_object_t **)
  51.         lua_newuserdata( L, sizeof( vlc_object_t * ) );
  52.     *udata = p_obj;
  53.     if( luaL_newmetatable( L, "vlc_object" ) )
  54.     {
  55.         /* Hide the metatable */
  56.         lua_pushstring( L, "none of your business" );
  57.         lua_setfield( L, -2, "__metatable" );
  58.         if( pf_gc ) /* FIXME */
  59.         {
  60.             /* Set the garbage collector if needed */
  61.             lua_pushcfunction( L, pf_gc );
  62.             lua_setfield( L, -2, "__gc" );
  63.         }
  64.     }
  65.     lua_setmetatable( L, -2 );
  66.     return 1;
  67. }
  68. int vlclua_gc_release( lua_State *L )
  69. {
  70.     vlc_object_t **p_obj = (vlc_object_t **)luaL_checkudata( L, 1, "vlc_object" );
  71.     lua_pop( L, 1 );
  72.     vlc_object_release( *p_obj );
  73.     return 0;
  74. }
  75. static int vlc_object_type_from_string( const char *psz_name )
  76. {
  77.     static const struct
  78.     {
  79.         int i_type;
  80.         const char *psz_name;
  81.     } pp_objects[] =
  82.         { { VLC_OBJECT_INPUT, "input" },
  83.           { VLC_OBJECT_DECODER, "decoder" },
  84.           { VLC_OBJECT_VOUT, "vout" },
  85.           { VLC_OBJECT_AOUT, "aout" },
  86.           { VLC_OBJECT_GENERIC, "generic" },
  87.           { 0, "" } };
  88.     int i;
  89.     for( i = 0; pp_objects[i].i_type; i++ )
  90.     {
  91.         if( !strcmp( psz_name, pp_objects[i].psz_name ) )
  92.             return pp_objects[i].i_type;
  93.     }
  94.     return 0;
  95. }
  96. static int vlc_object_search_mode_from_string( const char *psz_name )
  97. {
  98.     static const struct
  99.     {
  100.         int i_mode;
  101.         const char *psz_name;
  102.     } pp_modes[] =
  103.         { { FIND_PARENT, "parent" },
  104.           { FIND_CHILD, "child" },
  105.           { FIND_ANYWHERE, "anywhere" },
  106.           { 0, "" } };
  107.     int i;
  108.     for( i = 0; pp_modes[i].i_mode; i++ )
  109.     {
  110.         if( !strcmp( psz_name, pp_modes[i].psz_name ) )
  111.             return pp_modes[i].i_mode;
  112.     }
  113.     return 0;
  114. }
  115. static int vlclua_object_find( lua_State *L )
  116. {
  117.     const char *psz_type = luaL_checkstring( L, 2 );
  118.     const char *psz_mode = luaL_checkstring( L, 3 );
  119.     vlc_object_t *p_this;
  120.     int i_type = vlc_object_type_from_string( psz_type );
  121.     int i_mode = vlc_object_search_mode_from_string( psz_mode );
  122.     vlc_object_t *p_result;
  123.     if( !i_type )
  124.         return luaL_error( L, ""%s" is not a valid object type.", psz_type );
  125.     if( !i_mode )
  126.         return luaL_error( L, ""%s" is not a valid search mode.", psz_mode );
  127.     if( lua_type( L, 1 ) == LUA_TNIL )
  128.         p_this = vlclua_get_this( L );
  129.     else
  130.     {
  131.         vlc_object_t **p_obj = luaL_checkudata( L, 1, "vlc_object" );
  132.         p_this = *p_obj;
  133.     }
  134.     p_result = vlc_object_find( p_this, i_type, i_mode );
  135.     if( !p_result )
  136.         lua_pushnil( L );
  137.     else
  138.         vlclua_push_vlc_object( L, p_result, vlclua_gc_release );
  139.     return 1;
  140. }
  141. static int vlclua_object_find_name( lua_State *L )
  142. {
  143.     const char *psz_name = luaL_checkstring( L, 2 );
  144.     const char *psz_mode = luaL_checkstring( L, 3 );
  145.     vlc_object_t *p_this;
  146.     int i_mode = vlc_object_search_mode_from_string( psz_mode );
  147.     vlc_object_t *p_result;
  148.     if( !i_mode )
  149.         return luaL_error( L, ""%s" is not a valid search mode.",
  150.                            psz_mode );
  151.     if( lua_type( L, 1 ) == LUA_TNIL )
  152.         p_this = vlclua_get_this( L );
  153.     else
  154.     {
  155.         vlc_object_t **p_obj = luaL_checkudata( L, 1, "vlc_object" );
  156.         p_this = *p_obj;
  157.     }
  158.     p_result = vlc_object_find_name( p_this, psz_name, i_mode );
  159.     if( !p_result )
  160.         lua_pushnil( L );
  161.     else
  162.         vlclua_push_vlc_object( L, p_result, vlclua_gc_release );
  163.     return 1;
  164. }
  165. static int vlclua_get_libvlc( lua_State *L )
  166. {
  167.     vlclua_push_vlc_object( L, vlclua_get_this( L )->p_libvlc,
  168.                             NULL );
  169.     return 1;
  170. }
  171. static int vlclua_get_playlist( lua_State *L )
  172. {
  173.     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
  174.     if( p_playlist )
  175.     {
  176.         vlclua_push_vlc_object( L, p_playlist, vlclua_gc_release );
  177.     }
  178.     else lua_pushnil( L );
  179.     //vlclua_release_playlist_internal( p_playlist );
  180.     return 1;
  181. }
  182. static int vlclua_get_input( lua_State *L )
  183. {
  184.     input_thread_t *p_input = vlclua_get_input_internal( L );
  185.     if( p_input )
  186.     {
  187.         vlclua_push_vlc_object( L, p_input, vlclua_gc_release );
  188.     }
  189.     else lua_pushnil( L );
  190.     return 1;
  191. }
  192. /*****************************************************************************
  193.  *
  194.  *****************************************************************************/
  195. static const luaL_Reg vlclua_object_reg[] = {
  196.     { "input", vlclua_get_input },
  197.     { "playlist", vlclua_get_playlist },
  198.     { "libvlc", vlclua_get_libvlc },
  199.     { "find", vlclua_object_find },
  200.     { "find_name", vlclua_object_find_name },
  201.     { NULL, NULL }
  202. };
  203. void luaopen_object( lua_State *L )
  204. {
  205.     lua_newtable( L );
  206.     luaL_register( L, NULL, vlclua_object_reg );
  207.     lua_setfield( L, -2, "object" );
  208. }