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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * misc.c
  3.  *****************************************************************************
  4.  * Copyright (C) 2007-2008 the VideoLAN team
  5.  * $Id: 3a390af031efeb20b3345343b89029ca03d5525d $
  6.  *
  7.  * Authors: Antoine Cellerier <dionoea at videolan tod org>
  8.  *          Pierre d'Herbemont <pdherbemont # videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifndef  _GNU_SOURCE
  28. #   define  _GNU_SOURCE
  29. #endif
  30. #ifdef HAVE_CONFIG_H
  31. # include "config.h"
  32. #endif
  33. #include <vlc_common.h>
  34. #include <vlc_plugin.h>
  35. #include <vlc_meta.h>
  36. #include <vlc_charset.h>
  37. #include <vlc_aout.h>
  38. #include <vlc_interface.h>
  39. #include <lua.h>        /* Low level lua C API */
  40. #include <lauxlib.h>    /* Higher level C API */
  41. #include <lualib.h>     /* Lua libs */
  42. #include "../vlc.h"
  43. #include "../libs.h"
  44. /*****************************************************************************
  45.  * Internal lua<->vlc utils
  46.  *****************************************************************************/
  47. vlc_object_t * vlclua_get_this( lua_State *L )
  48. {
  49.     vlc_object_t * p_this;
  50.     lua_getglobal( L, "vlc" );
  51.     lua_getfield( L, -1, "private" );
  52.     p_this = (vlc_object_t*)lua_topointer( L, lua_gettop( L ) );
  53.     lua_pop( L, 2 );
  54.     return p_this;
  55. }
  56. /*****************************************************************************
  57.  * VLC error code translation
  58.  *****************************************************************************/
  59. int vlclua_push_ret( lua_State *L, int i_error )
  60. {
  61.     lua_pushnumber( L, i_error );
  62.     lua_pushstring( L, vlc_error( i_error ) );
  63.     return 2;
  64. }
  65. /*****************************************************************************
  66.  * Get the VLC version string
  67.  *****************************************************************************/
  68. static int vlclua_version( lua_State *L )
  69. {
  70.     lua_pushstring( L, VLC_Version() );
  71.     return 1;
  72. }
  73. /*****************************************************************************
  74.  * Get the VLC copyright
  75.  *****************************************************************************/
  76. static int vlclua_copyright( lua_State *L )
  77. {
  78.     lua_pushstring( L, COPYRIGHT_MESSAGE );
  79.     return 1;
  80. }
  81. /*****************************************************************************
  82.  * Get the VLC license msg/disclaimer
  83.  *****************************************************************************/
  84. static int vlclua_license( lua_State *L )
  85. {
  86.     lua_pushstring( L, LICENSE_MSG );
  87.     return 1;
  88. }
  89. /*****************************************************************************
  90.  * Quit VLC
  91.  *****************************************************************************/
  92. static int vlclua_quit( lua_State *L )
  93. {
  94.     vlc_object_t *p_this = vlclua_get_this( L );
  95.     /* The rc.c code also stops the playlist ... not sure if this is needed
  96.      * though. */
  97.     libvlc_Quit( p_this->p_libvlc );
  98.     return 0;
  99. }
  100. /*****************************************************************************
  101.  * Global properties getters
  102.  *****************************************************************************/
  103. static int vlclua_datadir( lua_State *L )
  104. {
  105.     lua_pushstring( L, config_GetDataDir() );
  106.     return 1;
  107. }
  108. static int vlclua_userdatadir( lua_State *L )
  109. {
  110.     char *data = config_GetUserDataDir();
  111.     lua_pushstring( L, data );
  112.     free( data );
  113.     return 1;
  114. }
  115. static int vlclua_homedir( lua_State *L )
  116. {
  117.     lua_pushstring( L, config_GetHomeDir() );
  118.     return 1;
  119. }
  120. static int vlclua_configdir( lua_State *L )
  121. {
  122.     char *dir = config_GetUserConfDir();
  123.     lua_pushstring( L, dir );
  124.     free( dir );
  125.     return 1;
  126. }
  127. static int vlclua_cachedir( lua_State *L )
  128. {
  129.     char *dir = config_GetCacheDir();
  130.     lua_pushstring( L, dir );
  131.     free( dir );
  132.     return 1;
  133. }
  134. static int vlclua_datadir_list( lua_State *L )
  135. {
  136.     const char *psz_dirname = luaL_checkstring( L, 1 );
  137.     char  *ppsz_dir_list[] = { NULL, NULL, NULL, NULL };
  138.     char **ppsz_dir = ppsz_dir_list;
  139.     int i = 1;
  140.     if( vlclua_dir_list( psz_dirname, ppsz_dir_list ) != VLC_SUCCESS )
  141.         return 0;
  142.     lua_newtable( L );
  143.     for( ; *ppsz_dir; ppsz_dir++ )
  144.     {
  145.         lua_pushstring( L, *ppsz_dir );
  146.         lua_rawseti( L, -2, i );
  147.         i ++;
  148.     }
  149.     vlclua_dir_list_free( ppsz_dir_list );
  150.     return 1;
  151. }
  152. /*****************************************************************************
  153.  *
  154.  *****************************************************************************/
  155. static int vlclua_lock_and_wait( lua_State *L )
  156. {
  157.     intf_thread_t *p_intf = (intf_thread_t *)vlclua_get_this( L );
  158.     intf_sys_t *p_sys = p_intf->p_sys;
  159.     vlc_mutex_lock( &p_sys->lock );
  160.     while( !p_sys->exiting )
  161.         vlc_cond_wait( &p_sys->wait, &p_sys->lock );
  162.     vlc_mutex_unlock( &p_sys->lock );
  163.     lua_pushboolean( L, 1 );
  164.     return 1;
  165. }
  166. static int vlclua_mdate( lua_State *L )
  167. {
  168.     lua_pushnumber( L, mdate() );
  169.     return 1;
  170. }
  171. static int vlclua_mwait( lua_State *L )
  172. {
  173.     double f = luaL_checknumber( L, 1 );
  174.     mwait( (int64_t)f );
  175.     return 0;
  176. }
  177. static int vlclua_intf_should_die( lua_State *L )
  178. {
  179.     intf_thread_t *p_intf = (intf_thread_t*)vlclua_get_this( L );
  180.     lua_pushboolean( L, p_intf->p_sys->exiting );
  181.     return 1;
  182. }
  183. /*****************************************************************************
  184.  *
  185.  *****************************************************************************/
  186. static const luaL_Reg vlclua_misc_reg[] = {
  187.     { "version", vlclua_version },
  188.     { "copyright", vlclua_copyright },
  189.     { "license", vlclua_license },
  190.     { "datadir", vlclua_datadir },
  191.     { "userdatadir", vlclua_userdatadir },
  192.     { "homedir", vlclua_homedir },
  193.     { "configdir", vlclua_configdir },
  194.     { "cachedir", vlclua_cachedir },
  195.     { "datadir_list", vlclua_datadir_list },
  196.     { "mdate", vlclua_mdate },
  197.     { "mwait", vlclua_mwait },
  198.     { "lock_and_wait", vlclua_lock_and_wait },
  199.     { "should_die", vlclua_intf_should_die },
  200.     { "quit", vlclua_quit },
  201.     { NULL, NULL }
  202. };
  203. void luaopen_misc( lua_State *L )
  204. {
  205.     lua_newtable( L );
  206.     luaL_register( L, NULL, vlclua_misc_reg );
  207.     lua_setfield( L, -2, "misc" );
  208. }