vlc_variables.h 23.8 KB
Newer Older
1
/*****************************************************************************
Pere Orga's avatar
Pere Orga committed
2
 * vlc_variables.h: variables handling
3
 *****************************************************************************
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
4
 * Copyright (C) 2002-2004 VLC authors and VideoLAN
5
 * $Id$
6 7
 *
 * Authors: Samuel Hocevar <sam@zoy.org>
8
 *          Gildas Bazin <gbazin@netcourrier.com>
9
 *
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
10 11 12
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
13
 * (at your option) any later version.
14
 *
15 16
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
17 18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
19
 *
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
20 21 22
 * You should have received a copy of the GNU Lesser 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.
23 24
 *****************************************************************************/

25 26
#ifndef VLC_VARIABLES_H
#define VLC_VARIABLES_H 1
27

28 29 30 31 32
/**
 * \file
 * This file defines functions and structures for dynamic variables in vlc
 */

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
33 34 35 36 37 38 39 40 41 42 43
/**
 * \defgroup variables Variables
 *
 * Functions for using the object variables in vlc.
 *
 * Vlc have a very powerful "object variable" infrastructure useful
 * for many things.
 *
 * @{
 */

44
#define VLC_VAR_TYPE      0x00ff
45
#define VLC_VAR_CLASS     0x00f0
46 47
#define VLC_VAR_FLAGS     0xff00

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
/**
 * \defgroup var_type Variable types
 * These are the different types a vlc variable can have.
 * @{
 */
#define VLC_VAR_VOID      0x0010
#define VLC_VAR_BOOL      0x0020
#define VLC_VAR_INTEGER   0x0030
#define VLC_VAR_STRING    0x0040
#define VLC_VAR_VARIABLE  0x0044
#define VLC_VAR_FLOAT     0x0050
#define VLC_VAR_TIME      0x0060
#define VLC_VAR_ADDRESS   0x0070
#define VLC_VAR_COORDS    0x00A0
/**@}*/

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
64 65
/** \defgroup var_flags Additive flags
 * These flags are added to the type field of the variable. Most as a result of
66
 * a var_Change() call, but some may be added at creation time
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
67 68
 * @{
 */
69
#define VLC_VAR_HASCHOICE 0x0100
70 71 72
#define VLC_VAR_HASMIN    0x0200
#define VLC_VAR_HASMAX    0x0400
#define VLC_VAR_HASSTEP   0x0800
73

74
#define VLC_VAR_ISCOMMAND 0x2000
75

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
76
/** Creation flag */
basos G's avatar
basos G committed
77 78
/* If the variable is not found on the current module
   search all parents and finally module config until found */
79
#define VLC_VAR_DOINHERIT 0x8000
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
80
/**@}*/
81

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
82 83
/**
 * \defgroup var_action Variable actions
84
 * These are the different actions that can be used with var_Change().
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
85
 * The parameters given are the meaning of the two last parameters of
86
 * var_Change() when this action is being used.
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
87 88 89 90 91 92 93 94
 * @{
 */

/**
 * Set the minimum value of this variable
 * \param p_val The new minimum value
 * \param p_val2 Unused
 */
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
95
#define VLC_VAR_SETMIN              0x0010
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
96 97 98 99 100
/**
 * Set the maximum value of this variable
 * \param p_val The new maximum value
 * \param p_val2 Unused
 */
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
101 102
#define VLC_VAR_SETMAX              0x0011
#define VLC_VAR_SETSTEP             0x0012
103

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
104 105 106 107 108
/**
 * Set the value of this variable without triggering any callbacks
 * \param p_val The new value
 * \param p_val2 Unused
 */
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
109 110 111 112 113
#define VLC_VAR_SETVALUE            0x0013

#define VLC_VAR_SETTEXT             0x0014
#define VLC_VAR_GETTEXT             0x0015

114 115 116 117
#define VLC_VAR_GETMIN              0x0016
#define VLC_VAR_GETMAX              0x0017
#define VLC_VAR_GETSTEP             0x0018

Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
118 119 120 121 122
#define VLC_VAR_ADDCHOICE           0x0020
#define VLC_VAR_DELCHOICE           0x0021
#define VLC_VAR_CLEARCHOICES        0x0022
#define VLC_VAR_SETDEFAULT          0x0023
#define VLC_VAR_GETCHOICES          0x0024
123

Rémi Duraffort's avatar
Rémi Duraffort committed
124
#define VLC_VAR_CHOICESCOUNT        0x0026
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
125

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
126
/**@}*/
127

128
/** \defgroup var_GetAndSet Variable actions
129
 * These are the different actions that can be used with var_GetAndSet()
130 131
 * @{
 */
132 133 134 135 136 137
enum {
    VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */
    VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */
    VLC_VAR_INTEGER_OR,  /**< Binary OR over an integer bits field */
    VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */
};
138 139
/**@}*/

140 141 142
/*****************************************************************************
 * Prototypes
 *****************************************************************************/
143
VLC_API int var_Create( vlc_object_t *, const char *, int );
144
#define var_Create(a,b,c) var_Create( VLC_OBJECT(a), b, c )
145

146
VLC_API int var_Destroy( vlc_object_t *, const char * );
147 148
#define var_Destroy(a,b) var_Destroy( VLC_OBJECT(a), b )

149
VLC_API int var_Change( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * );
150 151
#define var_Change(a,b,c,d,e) var_Change( VLC_OBJECT(a), b, c, d, e )

152
VLC_API int var_Type( vlc_object_t *, const char * ) VLC_USED;
153 154
#define var_Type(a,b) var_Type( VLC_OBJECT(a), b )

155
VLC_API int var_Set( vlc_object_t *, const char *, vlc_value_t );
156 157
#define var_Set(a,b,c) var_Set( VLC_OBJECT(a), b, c )

158
VLC_API int var_Get( vlc_object_t *, const char *, vlc_value_t * );
159
#define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c )
160

161
VLC_API int var_SetChecked( vlc_object_t *, const char *, int, vlc_value_t );
162
#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v)
163
VLC_API int var_GetChecked( vlc_object_t *, const char *, int, vlc_value_t * );
164
#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v)
165
VLC_API int var_GetAndSet( vlc_object_t *, const char *, int, vlc_value_t * );
166

167
VLC_API int var_Inherit( vlc_object_t *, const char *, int, vlc_value_t * );
168

169
VLC_API void var_FreeList( vlc_value_t *, vlc_value_t * );
170

171

172 173 174 175 176 177 178 179 180
/*****************************************************************************
 * Variable callbacks
 *****************************************************************************
 * int MyCallback( vlc_object_t *p_this,
 *                 char const *psz_variable,
 *                 vlc_value_t oldvalue,
 *                 vlc_value_t newvalue,
 *                 void *p_data);
 *****************************************************************************/
181 182 183
VLC_API int var_AddCallback( vlc_object_t *, const char *, vlc_callback_t, void * );
VLC_API int var_DelCallback( vlc_object_t *, const char *, vlc_callback_t, void * );
VLC_API int var_TriggerCallback( vlc_object_t *, const char * );
184

185 186 187
VLC_API int var_AddListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * );
VLC_API int var_DelListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * );

188 189 190
#define var_AddCallback(a,b,c,d) var_AddCallback( VLC_OBJECT(a), b, c, d )
#define var_DelCallback(a,b,c,d) var_DelCallback( VLC_OBJECT(a), b, c, d )
#define var_TriggerCallback(a,b) var_TriggerCallback( VLC_OBJECT(a), b )
191

192 193 194
#define var_AddListCallback(a,b,c,d) var_AddListCallback( VLC_OBJECT(a), b, c, d )
#define var_DelListCallback(a,b,c,d) var_DelListCallback( VLC_OBJECT(a), b, c, d )

195 196 197
/*****************************************************************************
 * helpers functions
 *****************************************************************************/
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
198 199 200 201 202 203 204 205

/**
 * Set the value of an integer variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 * \param i The new integer value of this variable
 */
206 207
static inline int var_SetInteger( vlc_object_t *p_obj, const char *psz_name,
                                  int64_t i )
208 209 210
{
    vlc_value_t val;
    val.i_int = i;
211
    return var_SetChecked( p_obj, psz_name, VLC_VAR_INTEGER, val );
212
}
Rémi Duraffort's avatar
Rémi Duraffort committed
213

214 215 216 217 218
/**
 * Set the value of an boolean variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
219
 * \param b The new boolean value of this variable
220
 */
221
static inline int var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool b )
222 223 224
{
    vlc_value_t val;
    val.b_bool = b;
225
    return var_SetChecked( p_obj, psz_name, VLC_VAR_BOOL, val );
226 227
}

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
228 229 230 231 232 233 234
/**
 * Set the value of a time variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 * \param i The new time value of this variable
 */
235
static inline int var_SetTime( vlc_object_t *p_obj, const char *psz_name, int64_t i )
236 237 238
{
    vlc_value_t val;
    val.i_time = i;
239
    return var_SetChecked( p_obj, psz_name, VLC_VAR_TIME, val );
240
}
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
241

242 243 244 245 246 247 248 249 250 251
static inline int var_SetCoords( vlc_object_t *obj, const char *name,
                                 int32_t x, int32_t y )
{
    vlc_value_t val;
    val.coords.x = x;
    val.coords.y = y;
    return var_SetChecked (obj, name, VLC_VAR_COORDS, val);
}
#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y)

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
252 253 254 255 256 257 258
/**
 * Set the value of a float variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 * \param f The new float value of this variable
 */
259
static inline int var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f )
260 261 262
{
    vlc_value_t val;
    val.f_float = f;
263
    return var_SetChecked( p_obj, psz_name, VLC_VAR_FLOAT, val );
264
}
Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
265

266 267 268 269 270 271 272
/**
 * Set the value of a string variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 * \param psz_string The new string value of this variable
 */
273
static inline int var_SetString( vlc_object_t *p_obj, const char *psz_name, const char *psz_string )
274 275
{
    vlc_value_t val;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
276
    val.psz_string = (char *)psz_string;
277
    return var_SetChecked( p_obj, psz_name, VLC_VAR_STRING, val );
278 279
}

280 281 282 283 284 285 286 287
/**
 * Set the value of a pointer variable
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 * \param ptr The new pointer value of this variable
 */
static inline
288
int var_SetAddress( vlc_object_t *p_obj, const char *psz_name, void *ptr )
289 290 291 292 293 294
{
    vlc_value_t val;
    val.p_address = ptr;
    return var_SetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, val );
}

295 296 297 298 299 300
#define var_SetInteger(a,b,c)   var_SetInteger( VLC_OBJECT(a),b,c)
#define var_SetBool(a,b,c)      var_SetBool( VLC_OBJECT(a),b,c)
#define var_SetTime(a,b,c)      var_SetTime( VLC_OBJECT(a),b,c)
#define var_SetFloat(a,b,c)     var_SetFloat( VLC_OBJECT(a),b,c)
#define var_SetString(a,b,c)    var_SetString( VLC_OBJECT(a),b,c)
#define var_SetAddress(o, n, p) var_SetAddress(VLC_OBJECT(o), n, p)
Rémi Duraffort's avatar
Rémi Duraffort committed
301

302

303
/**
304 305
 * Get an integer value
*
306 307 308
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
309
VLC_USED
310
static inline int64_t var_GetInteger( vlc_object_t *p_obj, const char *psz_name )
311
{
312 313
    vlc_value_t val;
    if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) )
314 315 316 317 318
        return val.i_int;
    else
        return 0;
}

319 320 321 322 323 324
/**
 * Get a boolean value
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
325
VLC_USED
326
static inline bool var_GetBool( vlc_object_t *p_obj, const char *psz_name )
327
{
328
    vlc_value_t val; val.b_bool = false;
329

330
    if( !var_GetChecked( p_obj, psz_name, VLC_VAR_BOOL, &val ) )
331 332
        return val.b_bool;
    else
333
        return false;
334 335
}

336 337 338 339 340 341
/**
 * Get a time value
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
342
VLC_USED
343
static inline int64_t var_GetTime( vlc_object_t *p_obj, const char *psz_name )
344
{
Clément Stenac's avatar
Clément Stenac committed
345
    vlc_value_t val; val.i_time = 0L;
346
    if( !var_GetChecked( p_obj, psz_name, VLC_VAR_TIME, &val ) )
347 348 349 350 351
        return val.i_time;
    else
        return 0;
}

352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
static inline void var_GetCoords( vlc_object_t *obj, const char *name,
                                  int32_t *px, int32_t *py )
{
    vlc_value_t val;

    if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val)))
    {
        *px = val.coords.x;
        *py = val.coords.y;
    }
    else
        *px = *py = 0;
}
#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y)

367 368 369 370 371 372
/**
 * Get a float value
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
373
VLC_USED
374
static inline float var_GetFloat( vlc_object_t *p_obj, const char *psz_name )
375
{
Clément Stenac's avatar
Clément Stenac committed
376
    vlc_value_t val; val.f_float = 0.0;
377
    if( !var_GetChecked( p_obj, psz_name, VLC_VAR_FLOAT, &val ) )
378 379 380 381 382 383 384 385 386 387 388
        return val.f_float;
    else
        return 0.0;
}

/**
 * Get a string value
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
389
VLC_USED VLC_MALLOC
390
static inline char *var_GetString( vlc_object_t *p_obj, const char *psz_name )
391
{
Clément Stenac's avatar
Clément Stenac committed
392
    vlc_value_t val; val.psz_string = NULL;
393
    if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) )
394
        return NULL;
395
    else
396
        return val.psz_string;
397 398
}

399
VLC_USED VLC_MALLOC
400
static inline char *var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name )
401 402
{
    vlc_value_t val;
403
    if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) )
404
        return NULL;
405
    if( val.psz_string && *val.psz_string )
406
        return val.psz_string;
407
    free( val.psz_string );
408 409 410
    return NULL;
}

411
VLC_USED
412
static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name )
413 414 415 416 417 418 419
{
    vlc_value_t val;
    if( var_GetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, &val ) )
        return NULL;
    else
        return val.p_address;
}
420

421 422 423 424 425
/**
 * Increment an integer variable
 * \param p_obj the object that holds the variable
 * \param psz_name the name of the variable
 */
426
static inline int64_t var_IncInteger( vlc_object_t *p_obj, const char *psz_name )
427
{
428 429
    vlc_value_t val;
    val.i_int = 1;
430 431
    if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) )
        return 0;
432
    return val.i_int;
433
}
434
#define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b )
435 436 437 438 439 440

/**
 * Decrement an integer variable
 * \param p_obj the object that holds the variable
 * \param psz_name the name of the variable
 */
441
static inline int64_t var_DecInteger( vlc_object_t *p_obj, const char *psz_name )
442
{
443 444
    vlc_value_t val;
    val.i_int = -1;
445 446
    if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) )
        return 0;
447
    return val.i_int;
448
}
449
#define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b )
450

451
static inline uint64_t var_OrInteger( vlc_object_t *obj, const char *name,
452 453 454 455
                                      unsigned v )
{
    vlc_value_t val;
    val.i_int = v;
456 457
    if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val ) )
        return 0;
458 459 460 461
    return val.i_int;
}
#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c)

462
static inline uint64_t var_NAndInteger( vlc_object_t *obj, const char *name,
463 464 465 466
                                        unsigned v )
{
    vlc_value_t val;
    val.i_int = v;
467 468
    if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val ) )
        return 0;
469 470 471 472
    return val.i_int;
}
#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c)

473 474 475 476 477 478
/**
 * Create a integer variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
479
VLC_USED
480
static inline int64_t var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name )
481
{
482 483
    var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    return var_GetInteger( p_obj, psz_name );
484 485
}

486 487 488 489 490 491
/**
 * Create a boolean variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
492
VLC_USED
493
static inline bool var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name )
494
{
495 496
    var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
    return var_GetBool( p_obj, psz_name );
497 498
}

499 500 501 502 503 504
/**
 * Create a time variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
505
VLC_USED
506
static inline int64_t var_CreateGetTime( vlc_object_t *p_obj, const char *psz_name )
507
{
508 509
    var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT );
    return var_GetTime( p_obj, psz_name );
510 511 512 513 514 515 516 517
}

/**
 * Create a float variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
518
VLC_USED
519
static inline float var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name )
520
{
521 522
    var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
    return var_GetFloat( p_obj, psz_name );
523 524 525 526 527 528 529 530
}

/**
 * Create a string variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
531
VLC_USED VLC_MALLOC
532
static inline char *var_CreateGetString( vlc_object_t *p_obj,
533
                                           const char *psz_name )
534
{
535 536
    var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT );
    return var_GetString( p_obj, psz_name );
537
}
538

539
VLC_USED VLC_MALLOC
540
static inline char *var_CreateGetNonEmptyString( vlc_object_t *p_obj,
541 542
                                                   const char *psz_name )
{
543 544
    var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT );
    return var_GetNonEmptyString( p_obj, psz_name );
545 546
}

547 548 549 550 551 552
/**
 * Create an address variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
553
VLC_USED
554
static inline void *var_CreateGetAddress( vlc_object_t *p_obj,
555 556
                                           const char *psz_name )
{
557 558
    var_Create( p_obj, psz_name, VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT );
    return var_GetAddress( p_obj, psz_name );
559 560
}

561 562 563 564 565 566 567
#define var_CreateGetInteger(a,b)   var_CreateGetInteger( VLC_OBJECT(a),b)
#define var_CreateGetBool(a,b)   var_CreateGetBool( VLC_OBJECT(a),b)
#define var_CreateGetTime(a,b)   var_CreateGetTime( VLC_OBJECT(a),b)
#define var_CreateGetFloat(a,b)   var_CreateGetFloat( VLC_OBJECT(a),b)
#define var_CreateGetString(a,b)   var_CreateGetString( VLC_OBJECT(a),b)
#define var_CreateGetNonEmptyString(a,b)   var_CreateGetNonEmptyString( VLC_OBJECT(a),b)
#define var_CreateGetAddress(a,b)  var_CreateGetAddress( VLC_OBJECT(a),b)
568

569 570 571 572 573 574
/**
 * Create a integer command variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
575
VLC_USED
576
static inline int64_t var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name )
577
{
578
    var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT
579
                                   | VLC_VAR_ISCOMMAND );
580
    return var_GetInteger( p_obj, psz_name );
581 582 583 584 585 586 587 588
}

/**
 * Create a boolean command variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
589
VLC_USED
590
static inline bool var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name )
591
{
592
    var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT
593
                                   | VLC_VAR_ISCOMMAND );
594
    return var_GetBool( p_obj, psz_name );
595 596 597 598 599 600 601 602
}

/**
 * Create a time command variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
603
VLC_USED
604
static inline int64_t var_CreateGetTimeCommand( vlc_object_t *p_obj, const char *psz_name )
605
{
606
    var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT
607
                                   | VLC_VAR_ISCOMMAND );
608
    return var_GetTime( p_obj, psz_name );
609 610 611 612 613 614 615 616
}

/**
 * Create a float command variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
617
VLC_USED
618
static inline float var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name )
619
{
620
    var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT
621
                                   | VLC_VAR_ISCOMMAND );
622
    return var_GetFloat( p_obj, psz_name );
623 624 625 626 627 628 629 630
}

/**
 * Create a string command variable with inherit and get its value.
 *
 * \param p_obj The object that holds the variable
 * \param psz_name The name of the variable
 */
631
VLC_USED VLC_MALLOC
632
static inline char *var_CreateGetStringCommand( vlc_object_t *p_obj,
633 634
                                           const char *psz_name )
{
635
    var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT
636
                                   | VLC_VAR_ISCOMMAND );
637
    return var_GetString( p_obj, psz_name );
638 639
}

640
VLC_USED VLC_MALLOC
641
static inline char *var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj,
642 643
                                                   const char *psz_name )
{
644
    var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT
645
                                   | VLC_VAR_ISCOMMAND );
646
    return var_GetNonEmptyString( p_obj, psz_name );
647 648
}

649 650 651 652 653 654
#define var_CreateGetIntegerCommand(a,b)   var_CreateGetIntegerCommand( VLC_OBJECT(a),b)
#define var_CreateGetBoolCommand(a,b)   var_CreateGetBoolCommand( VLC_OBJECT(a),b)
#define var_CreateGetTimeCommand(a,b)   var_CreateGetTimeCommand( VLC_OBJECT(a),b)
#define var_CreateGetFloatCommand(a,b)   var_CreateGetFloatCommand( VLC_OBJECT(a),b)
#define var_CreateGetStringCommand(a,b)   var_CreateGetStringCommand( VLC_OBJECT(a),b)
#define var_CreateGetNonEmptyStringCommand(a,b)   var_CreateGetNonEmptyStringCommand( VLC_OBJECT(a),b)
655

656
VLC_USED
657
static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name )
658 659
{
    vlc_value_t count;
660
    if( var_Change( p_obj, psz_name, VLC_VAR_CHOICESCOUNT, &count, NULL ) )
661 662 663
        return 0;
    return count.i_int;
}
664
#define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b)
665

666

667
static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name )
668 669
{
    vlc_value_t val;
670 671
    if( var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val ) )
        return false;
672
    return val.b_bool;
673
}
674
#define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b )
675

Laurent Aimar's avatar
Laurent Aimar committed
676

677
VLC_USED
Laurent Aimar's avatar
Laurent Aimar committed
678 679 680 681 682 683 684 685 686 687
static inline bool var_InheritBool( vlc_object_t *obj, const char *name )
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_BOOL, &val ) )
        val.b_bool = false;
    return val.b_bool;
}
#define var_InheritBool(o, n) var_InheritBool(VLC_OBJECT(o), n)

688
VLC_USED
689
static inline int64_t var_InheritInteger( vlc_object_t *obj, const char *name )
690 691 692 693 694 695 696 697 698
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_INTEGER, &val ) )
        val.i_int = 0;
    return val.i_int;
}
#define var_InheritInteger(o, n) var_InheritInteger(VLC_OBJECT(o), n)

699
VLC_USED
700 701 702 703 704 705 706 707 708 709
static inline float var_InheritFloat( vlc_object_t *obj, const char *name )
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_FLOAT, &val ) )
        val.f_float = 0.;
    return val.f_float;
}
#define var_InheritFloat(o, n) var_InheritFloat(VLC_OBJECT(o), n)

710
VLC_USED VLC_MALLOC
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
static inline char *var_InheritString( vlc_object_t *obj, const char *name )
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_STRING, &val ) )
        val.psz_string = NULL;
    else if( val.psz_string && !*val.psz_string )
    {
        free( val.psz_string );
        val.psz_string = NULL;
    }
    return val.psz_string;
}
#define var_InheritString(o, n) var_InheritString(VLC_OBJECT(o), n)

726
VLC_USED
727 728 729 730 731 732 733 734 735 736
static inline mtime_t var_InheritTime( vlc_object_t *obj, const char *name )
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_TIME, &val ) )
        val.i_time = 0;
    return val.i_time;
}
#define var_InheritTime(o, n) var_InheritTime(VLC_OBJECT(o), n)

737
VLC_USED
738 739 740 741 742 743 744 745
static inline void *var_InheritAddress( vlc_object_t *obj, const char *name )
{
    vlc_value_t val;

    if( var_Inherit( obj, name, VLC_VAR_ADDRESS, &val ) )
        val.p_address = NULL;
    return val.p_address;
}
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
746
#define var_InheritAddress(o, n) var_InheritAddress(VLC_OBJECT(o), n)
747

748
VLC_API int var_InheritURational( vlc_object_t *, unsigned *num, unsigned *den, const char *var );
749 750
#define var_InheritURational(a,b,c,d) var_InheritURational(VLC_OBJECT(a), b, c, d)

751 752 753 754 755 756 757 758
#define var_GetInteger(a,b)   var_GetInteger( VLC_OBJECT(a),b)
#define var_GetBool(a,b)   var_GetBool( VLC_OBJECT(a),b)
#define var_GetTime(a,b)   var_GetTime( VLC_OBJECT(a),b)
#define var_GetFloat(a,b)   var_GetFloat( VLC_OBJECT(a),b)
#define var_GetString(a,b)   var_GetString( VLC_OBJECT(a),b)
#define var_GetNonEmptyString(a,b)   var_GetNonEmptyString( VLC_OBJECT(a),b)
#define var_GetAddress(a,b)  var_GetAddress( VLC_OBJECT(a),b)

759
VLC_API int var_LocationParse(vlc_object_t *, const char *mrl, const char *prefix);
760 761
#define var_LocationParse(o, m, p) var_LocationParse(VLC_OBJECT(o), m, p)

Sigmund Augdal Helberg's avatar
Sigmund Augdal Helberg committed
762 763 764
/**
 * @}
 */
765
#endif /*  _VLC_VARIABLES_H */