variables.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:16k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * variables.h: variables handling
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2004 VideoLAN
  5.  * $Id: variables.h 7997 2004-06-18 11:35:45Z sigmunau $
  6.  *
  7.  * Authors: Samuel Hocevar <sam@zoy.org>
  8.  *          Gildas Bazin <gbazin@netcourrier.com>
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /**
  25.  * defgroup variables Variables
  26.  *
  27.  * Functions for using the object variables in vlc.
  28.  *
  29.  * Vlc have a very powerful "object variable" infrastructure useful
  30.  * for many things.
  31.  *
  32.  * @{
  33.  */
  34. typedef struct callback_entry_t callback_entry_t;
  35. /**
  36.  * The structure describing a variable.
  37.  * note vlc_value_t is the common union for variable values
  38.  */
  39. struct variable_t
  40. {
  41.     /** The variable's exported value */
  42.     vlc_value_t  val;
  43.     char *       psz_name; /**< The variable unique name */
  44.     uint32_t     i_hash;   /**< (almost) unique hashed value */
  45.     int          i_type;   /**< The type of the variable */
  46.     /** The variable display name, mainly for use by the interfaces */
  47.     char *       psz_text;
  48.     /** A pointer to a comparison function */
  49.     int      ( * pf_cmp ) ( vlc_value_t, vlc_value_t );
  50.     /** A pointer to a duplication function */
  51.     void     ( * pf_dup ) ( vlc_value_t * );
  52.     /** A pointer to a deallocation function */
  53.     void     ( * pf_free ) ( vlc_value_t * );
  54.     /** Creation count: we only destroy the variable if it reaches 0 */
  55.     int          i_usage;
  56.     /** If the variable has min/max/step values */
  57.     vlc_value_t  min, max, step;
  58.     /** Index of the default choice, if the variable is to be chosen in
  59.      * a list */
  60.     int          i_default;
  61.     /** List of choices */
  62.     vlc_list_t   choices;
  63.     /** List of friendly names for the choices */
  64.     vlc_list_t   choices_text;
  65.     /** Set to TRUE if the variable is in a callback */
  66.     vlc_bool_t   b_incallback;
  67.     /** Number of registered callbacks */
  68.     int                i_entries;
  69.     /** Array of registered callbacks */
  70.     callback_entry_t * p_entries;
  71. };
  72. /*****************************************************************************
  73.  * Variable types - probably very incomplete
  74.  *****************************************************************************/
  75. #define VLC_VAR_TYPE      0x00ff
  76. #define VLC_VAR_FLAGS     0xff00
  77. /**
  78.  * defgroup var_type Variable types
  79.  * These are the different types a vlc variable can have.
  80.  * @{
  81.  */
  82. #define VLC_VAR_VOID      0x0010
  83. #define VLC_VAR_BOOL      0x0020
  84. #define VLC_VAR_INTEGER   0x0030
  85. #define VLC_VAR_HOTKEY    0x0031
  86. #define VLC_VAR_STRING    0x0040
  87. #define VLC_VAR_MODULE    0x0041
  88. #define VLC_VAR_FILE      0x0042
  89. #define VLC_VAR_DIRECTORY 0x0043
  90. #define VLC_VAR_VARIABLE  0x0044
  91. #define VLC_VAR_FLOAT     0x0050
  92. #define VLC_VAR_TIME      0x0060
  93. #define VLC_VAR_ADDRESS   0x0070
  94. #define VLC_VAR_MUTEX     0x0080
  95. #define VLC_VAR_LIST      0x0090
  96. /**@}*/
  97. /** defgroup var_flags Additive flags
  98.  * These flags are added to the type field of the variable. Most as a result of
  99.  * a __var_Change() call, but some may be added at creation time
  100.  * @{
  101.  */
  102. #define VLC_VAR_HASCHOICE 0x0100
  103. #define VLC_VAR_HASMIN    0x0200
  104. #define VLC_VAR_HASMAX    0x0400
  105. #define VLC_VAR_HASSTEP   0x0800
  106. #define VLC_VAR_ISLIST    0x1000
  107. #define VLC_VAR_ISCOMMAND 0x2000
  108. #define VLC_VAR_ISCONFIG  0x2000
  109. /** Creation flag */
  110. #define VLC_VAR_DOINHERIT 0x8000
  111. /**@}*/
  112. /**
  113.  * defgroup var_action Variable actions
  114.  * These are the different actions that can be used with __var_Change().
  115.  * The parameters given are the meaning of the two last parameters of
  116.  * __var_Change() when this action is being used.
  117.  * @{
  118.  */
  119. /**
  120.  * Set the minimum value of this variable
  121.  * param p_val The new minimum value
  122.  * param p_val2 Unused
  123.  */
  124. #define VLC_VAR_SETMIN              0x0010
  125. /**
  126.  * Set the maximum value of this variable
  127.  * param p_val The new maximum value
  128.  * param p_val2 Unused
  129.  */
  130. #define VLC_VAR_SETMAX              0x0011
  131. #define VLC_VAR_SETSTEP             0x0012
  132. /**
  133.  * Set the value of this variable without triggering any callbacks
  134.  * param p_val The new value
  135.  * param p_val2 Unused
  136.  */
  137. #define VLC_VAR_SETVALUE            0x0013
  138. #define VLC_VAR_SETTEXT             0x0014
  139. #define VLC_VAR_GETTEXT             0x0015
  140. #define VLC_VAR_ADDCHOICE           0x0020
  141. #define VLC_VAR_DELCHOICE           0x0021
  142. #define VLC_VAR_CLEARCHOICES        0x0022
  143. #define VLC_VAR_SETDEFAULT          0x0023
  144. #define VLC_VAR_GETCHOICES          0x0024
  145. #define VLC_VAR_FREECHOICES         0x0025
  146. #define VLC_VAR_GETLIST             0x0026
  147. #define VLC_VAR_FREELIST            0x0027
  148. #define VLC_VAR_CHOICESCOUNT        0x0028
  149. #define VLC_VAR_INHERITVALUE        0x0030
  150. #define VLC_VAR_TRIGGER_CALLBACKS   0x0035
  151. /**@}*/
  152. /*****************************************************************************
  153.  * Prototypes
  154.  *****************************************************************************/
  155. VLC_EXPORT( int, __var_Create, ( vlc_object_t *, const char *, int ) );
  156. VLC_EXPORT( int, __var_Destroy, ( vlc_object_t *, const char * ) );
  157. VLC_EXPORT( int, __var_Change, ( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ) );
  158. VLC_EXPORT( int, __var_Type, ( vlc_object_t *, const char * ) );
  159. VLC_EXPORT( int, __var_Set, ( vlc_object_t *, const char *, vlc_value_t ) );
  160. VLC_EXPORT( int, __var_Get, ( vlc_object_t *, const char *, vlc_value_t * ) );
  161. /**
  162.  * __var_Create() with automatic casting.
  163.  */
  164. #define var_Create(a,b,c) __var_Create( VLC_OBJECT(a), b, c )
  165. /**
  166.  * __var_Destroy() with automatic casting
  167.  */
  168. #define var_Destroy(a,b) __var_Destroy( VLC_OBJECT(a), b )
  169. /**
  170.  * __var_Change() with automatic casting
  171.  */
  172. #define var_Change(a,b,c,d,e) __var_Change( VLC_OBJECT(a), b, c, d, e )
  173. /**
  174.  * __var_Type() with automatic casting
  175.  */
  176. #define var_Type(a,b) __var_Type( VLC_OBJECT(a), b )
  177. /**
  178.  * __var_Set() with automatic casting
  179.  */
  180. #define var_Set(a,b,c) __var_Set( VLC_OBJECT(a), b, c )
  181. /**
  182.  * __var_Get() with automatic casting
  183.  */
  184. #define var_Get(a,b,c) __var_Get( VLC_OBJECT(a), b, c )
  185. /*****************************************************************************
  186.  * Variable callbacks
  187.  *****************************************************************************
  188.  * int MyCallback( vlc_object_t *p_this,
  189.  *                 char const *psz_variable,
  190.  *                 vlc_value_t oldvalue,
  191.  *                 vlc_value_t newvalue,
  192.  *                 void *p_data);
  193.  *****************************************************************************/
  194. VLC_EXPORT( int, __var_AddCallback, ( vlc_object_t *, const char *, vlc_callback_t, void * ) );
  195. VLC_EXPORT( int, __var_DelCallback, ( vlc_object_t *, const char *, vlc_callback_t, void * ) );
  196. /**
  197.  * __var_AddCallback() with automatic casting
  198.  */
  199. #define var_AddCallback(a,b,c,d) __var_AddCallback( VLC_OBJECT(a), b, c, d )
  200. /**
  201.  * __var_DelCallback() with automatic casting
  202.  */
  203. #define var_DelCallback(a,b,c,d) __var_DelCallback( VLC_OBJECT(a), b, c, d )
  204. /*****************************************************************************
  205.  * helpers functions
  206.  *****************************************************************************/
  207. /**
  208.  * Set the value of an integer variable
  209.  *
  210.  * param p_obj The object that holds the variable
  211.  * param psz_name The name of the variable
  212.  * param i The new integer value of this variable
  213.  */
  214. static inline int __var_SetInteger( vlc_object_t *p_obj, const char *psz_name, int i )
  215. {
  216.     vlc_value_t val;
  217.     val.i_int = i;
  218.     return __var_Set( p_obj, psz_name, val );
  219. }
  220. /**
  221.  * Set the value of an boolean variable
  222.  *
  223.  * param p_obj The object that holds the variable
  224.  * param psz_name The name of the variable
  225.  * param b The new boolean value of this variable
  226.  */
  227. static inline int __var_SetBool( vlc_object_t *p_obj, const char *psz_name, vlc_bool_t b )
  228. {
  229.     vlc_value_t val;
  230.     val.b_bool = b;
  231.     return __var_Set( p_obj, psz_name, val );
  232. }
  233. /**
  234.  * Set the value of a time variable
  235.  *
  236.  * param p_obj The object that holds the variable
  237.  * param psz_name The name of the variable
  238.  * param i The new time value of this variable
  239.  */
  240. static inline int __var_SetTime( vlc_object_t *p_obj, const char *psz_name, int64_t i )
  241. {
  242.     vlc_value_t val;
  243.     val.i_time = i;
  244.     return __var_Set( p_obj, psz_name, val );
  245. }
  246. /**
  247.  * Set the value of a float variable
  248.  *
  249.  * param p_obj The object that holds the variable
  250.  * param psz_name The name of the variable
  251.  * param f The new float value of this variable
  252.  */
  253. static inline int __var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f )
  254. {
  255.     vlc_value_t val;
  256.     val.f_float = f;
  257.     return __var_Set( p_obj, psz_name, val );
  258. }
  259. /**
  260.  * Set the value of a string variable
  261.  *
  262.  * param p_obj The object that holds the variable
  263.  * param psz_name The name of the variable
  264.  * param psz_string The new string value of this variable
  265.  */
  266. static inline int __var_SetString( vlc_object_t *p_obj, const char *psz_name, char *psz_string )
  267. {
  268.     vlc_value_t val;
  269.     val.psz_string = psz_string;
  270.     return __var_Set( p_obj, psz_name, val );
  271. }
  272. /**
  273.  * Trigger the callbacks on a void variable
  274.  *
  275.  * param p_obj The object that holds the variable
  276.  * param psz_name The name of the variable
  277.  */
  278. static inline int __var_SetVoid( vlc_object_t *p_obj, const char *psz_name )
  279. {
  280.     vlc_value_t val;
  281.     val.b_bool = VLC_TRUE;
  282.     return __var_Set( p_obj, psz_name, val );
  283. }
  284. /**
  285.  * __var_SetInteger() with automatic casting
  286.  */
  287. #define var_SetInteger(a,b,c)   __var_SetInteger( VLC_OBJECT(a),b,c)
  288. /**
  289.  * __var_SetBool() with automatic casting
  290.  */
  291. #define var_SetBool(a,b,c)   __var_SetBool( VLC_OBJECT(a),b,c)
  292. /**
  293.  * __var_SetTime() with automatic casting
  294.  */
  295. #define var_SetTime(a,b,c)      __var_SetTime( VLC_OBJECT(a),b,c)
  296. /**
  297.  * __var_SetFloat() with automatic casting
  298.  */
  299. #define var_SetFloat(a,b,c)     __var_SetFloat( VLC_OBJECT(a),b,c)
  300. /**
  301.  * __var_SetString() with automatic casting
  302.  */
  303. #define var_SetString(a,b,c)     __var_SetString( VLC_OBJECT(a),b,c)
  304. /**
  305.  * __var_SetVoid() with automatic casting
  306.  */
  307. #define var_SetVoid(a,b)        __var_SetVoid( VLC_OBJECT(a),b)
  308. /**
  309.  * Get a integer value
  310.  *
  311.  * param p_obj The object that holds the variable
  312.  * param psz_name The name of the variable
  313.  */
  314. static inline int __var_GetInteger( vlc_object_t *p_obj, const char *psz_name )
  315. {
  316.     vlc_value_t val;
  317.     if( !__var_Get( p_obj, psz_name, &val ) )
  318.         return val.i_int;
  319.     else
  320.         return 0;
  321. }
  322. /**
  323.  * Get a boolean value
  324.  *
  325.  * param p_obj The object that holds the variable
  326.  * param psz_name The name of the variable
  327.  */
  328. static inline int __var_GetBool( vlc_object_t *p_obj, const char *psz_name )
  329. {
  330.     vlc_value_t val;
  331.     if( !__var_Get( p_obj, psz_name, &val ) )
  332.         return val.b_bool;
  333.     else
  334.         return VLC_FALSE;
  335. }
  336. /**
  337.  * Get a time value
  338.  *
  339.  * param p_obj The object that holds the variable
  340.  * param psz_name The name of the variable
  341.  */
  342. static inline int64_t __var_GetTime( vlc_object_t *p_obj, const char *psz_name )
  343. {
  344.     vlc_value_t val;
  345.     if( !__var_Get( p_obj, psz_name, &val ) )
  346.         return val.i_time;
  347.     else
  348.         return 0;
  349. }
  350. /**
  351.  * Get a float value
  352.  *
  353.  * param p_obj The object that holds the variable
  354.  * param psz_name The name of the variable
  355.  */
  356. static inline float __var_GetFloat( vlc_object_t *p_obj, const char *psz_name )
  357. {
  358.     vlc_value_t val;
  359.     if( !__var_Get( p_obj, psz_name, &val ) )
  360.         return val.f_float;
  361.     else
  362.         return 0.0;
  363. }
  364. /**
  365.  * Get a string value
  366.  *
  367.  * param p_obj The object that holds the variable
  368.  * param psz_name The name of the variable
  369.  */
  370. static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
  371. {
  372.     vlc_value_t val;
  373.     if( !__var_Get( p_obj, psz_name, &val ) )
  374.         return val.psz_string;
  375.     else
  376.         return strdup( "" );
  377. }
  378. /**
  379.  * __var_GetInteger() with automatic casting
  380.  */
  381. #define var_GetInteger(a,b)   __var_GetInteger( VLC_OBJECT(a),b)
  382. /**
  383.  * __var_GetBool() with automatic casting
  384.  */
  385. #define var_GetBool(a,b)   __var_GetBool( VLC_OBJECT(a),b)
  386. /**
  387.  * __var_GetTime() with automatic casting
  388.  */
  389. #define var_GetTime(a,b)   __var_GetTime( VLC_OBJECT(a),b)
  390. /**
  391.  * __var_GetFloat() with automatic casting
  392.  */
  393. #define var_GetFloat(a,b)   __var_GetFloat( VLC_OBJECT(a),b)
  394. /**
  395.  * __var_GetString() with automatic casting
  396.  */
  397. #define var_GetString(a,b)   __var_GetString( VLC_OBJECT(a),b)
  398. /**
  399.  * Create a integer variable with inherit and get its value.
  400.  *
  401.  * param p_obj The object that holds the variable
  402.  * param psz_name The name of the variable
  403.  */
  404. static inline int __var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name )
  405. {
  406.     vlc_value_t val;
  407.     __var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  408.     if( !__var_Get( p_obj, psz_name, &val ) )
  409.         return val.i_int;
  410.     else
  411.         return 0;
  412. }
  413. /**
  414.  * Create a boolean variable with inherit and get its value.
  415.  *
  416.  * param p_obj The object that holds the variable
  417.  * param psz_name The name of the variable
  418.  */
  419. static inline int __var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name )
  420. {
  421.     vlc_value_t val;
  422.     __var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  423.     if( !__var_Get( p_obj, psz_name, &val ) )
  424.         return val.b_bool;
  425.     else
  426.         return VLC_FALSE;
  427. }
  428. /**
  429.  * Create a time variable with inherit and get its value.
  430.  *
  431.  * param p_obj The object that holds the variable
  432.  * param psz_name The name of the variable
  433.  */
  434. static inline int64_t __var_CreateGetTime( vlc_object_t *p_obj, const char *psz_name )
  435. {
  436.     vlc_value_t val;
  437.     __var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT );
  438.     if( !__var_Get( p_obj, psz_name, &val ) )
  439.         return val.i_time;
  440.     else
  441.         return 0;
  442. }
  443. /**
  444.  * Create a float variable with inherit and get its value.
  445.  *
  446.  * param p_obj The object that holds the variable
  447.  * param psz_name The name of the variable
  448.  */
  449. static inline float __var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name )
  450. {
  451.     vlc_value_t val;
  452.     __var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
  453.     if( !__var_Get( p_obj, psz_name, &val ) )
  454.         return val.f_float;
  455.     else
  456.         return 0.0;
  457. }
  458. /**
  459.  * Create a string variable with inherit and get its value.
  460.  *
  461.  * param p_obj The object that holds the variable
  462.  * param psz_name The name of the variable
  463.  */
  464. static inline char *__var_CreateGetString( vlc_object_t *p_obj, const char *psz_name )
  465. {
  466.     vlc_value_t val;
  467.     __var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  468.     if( !__var_Get( p_obj, psz_name, &val ) )
  469.         return val.psz_string;
  470.     else
  471.         return strdup( "" );
  472. }
  473. /**
  474.  * __var_CreateGetInteger() with automatic casting
  475.  */
  476. #define var_CreateGetInteger(a,b)   __var_CreateGetInteger( VLC_OBJECT(a),b)
  477. /**
  478.  * __var_CreateGetBool() with automatic casting
  479.  */
  480. #define var_CreateGetBool(a,b)   __var_CreateGetBool( VLC_OBJECT(a),b)
  481. /**
  482.  * __var_CreateGetTime() with automatic casting
  483.  */
  484. #define var_CreateGetTime(a,b)   __var_CreateGetTime( VLC_OBJECT(a),b)
  485. /**
  486.  * __var_CreateGetFloat() with automatic casting
  487.  */
  488. #define var_CreateGetFloat(a,b)   __var_CreateGetFloat( VLC_OBJECT(a),b)
  489. /**
  490.  * __var_CreateGetString() with automatic casting
  491.  */
  492. #define var_CreateGetString(a,b)   __var_CreateGetString( VLC_OBJECT(a),b)
  493. /**
  494.  * @}
  495.  */