configuration.h 19.1 KB
Newer Older
gbazin's avatar
 
gbazin committed
1
2
3
4
5
6
/*****************************************************************************
 * configuration.h : configuration management module
 * This file describes the programming interface for the configuration module.
 * It includes functions allowing to declare, get or set configuration options.
 *****************************************************************************
 * Copyright (C) 1999, 2000 VideoLAN
7
 * $Id$
gbazin's avatar
 
gbazin committed
8
 *
9
 * Authors: Gildas Bazin <gbazin@videolan.org>
gbazin's avatar
 
gbazin committed
10
11
12
13
14
 *
 * 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.
zorglub's avatar
zorglub committed
15
 *
gbazin's avatar
 
gbazin committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Macros used to build the configuration structure.
 *****************************************************************************/

gbazin's avatar
   
gbazin committed
30
/* Configuration hint types */
zorglub's avatar
zorglub committed
31
32


gbazin's avatar
   
gbazin committed
33
34
35
36
37
#define CONFIG_HINT_END                     0x0001  /* End of config */
#define CONFIG_HINT_CATEGORY                0x0002  /* Start of new category */
#define CONFIG_HINT_SUBCATEGORY             0x0003  /* Start of sub-category */
#define CONFIG_HINT_SUBCATEGORY_END         0x0004  /* End of sub-category */
#define CONFIG_HINT_USAGE                   0x0005  /* Usage information */
gbazin's avatar
 
gbazin committed
38

zorglub's avatar
zorglub committed
39
40
41
42
#define CONFIG_CATEGORY                     0x0006 /* Set category */
#define CONFIG_SUBCATEGORY                  0x0007 /* Set subcategory */
#define CONFIG_SECTION                      0x0008 /* Start of new section */

gbazin's avatar
   
gbazin committed
43
#define CONFIG_HINT                         0x000F
gbazin's avatar
   
gbazin committed
44
45

/* Configuration item types */
gbazin's avatar
   
gbazin committed
46
47
48
49
50
51
#define CONFIG_ITEM_STRING                  0x0010  /* String option */
#define CONFIG_ITEM_FILE                    0x0020  /* File option */
#define CONFIG_ITEM_MODULE                  0x0030  /* Module option */
#define CONFIG_ITEM_INTEGER                 0x0040  /* Integer option */
#define CONFIG_ITEM_BOOL                    0x0050  /* Bool option */
#define CONFIG_ITEM_FLOAT                   0x0060  /* Float option */
gbazin's avatar
   
gbazin committed
52
#define CONFIG_ITEM_DIRECTORY               0x0070  /* Directory option */
53
#define CONFIG_ITEM_KEY                     0x0080  /* Hot key option */
54
55
56
#define CONFIG_ITEM_MODULE_CAT              0x0090  /* Module option */
#define CONFIG_ITEM_MODULE_LIST             0x00A0  /* Module option */
#define CONFIG_ITEM_MODULE_LIST_CAT         0x00B0  /* Module option */
gbazin's avatar
   
gbazin committed
57

gbazin's avatar
   
gbazin committed
58
#define CONFIG_ITEM                         0x00F0
gbazin's avatar
 
gbazin committed
59

zorglub's avatar
zorglub committed
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*******************************************************************
 * All predefined categories and subcategories
 *******************************************************************/
#define CAT_INTERFACE 1
   #define SUBCAT_INTERFACE_GENERAL 101
   #define SUBCAT_INTERFACE_CONTROL 102
   #define SUBCAT_INTERFACE_HOTKEYS 103

#define CAT_AUDIO 2
   #define SUBCAT_AUDIO_GENERAL 201
   #define SUBCAT_AUDIO_AOUT 202
   #define SUBCAT_AUDIO_AFILTER 203
   #define SUBCAT_AUDIO_VISUAL 204
   #define SUBCAT_AUDIO_MISC 205

#define CAT_VIDEO 3
   #define SUBCAT_VIDEO_GENERAL 301
   #define SUBCAT_VIDEO_VOUT 302
   #define SUBCAT_VIDEO_VFILTER 303
   #define SUBCAT_VIDEO_TEXT 304
   #define SUBCAT_VIDEO_SUBPIC 305

#define CAT_INPUT 4
   #define SUBCAT_INPUT_ACCESS 401
   #define SUBCAT_INPUT_DEMUX 402
   #define SUBCAT_INPUT_VCODEC 403
   #define SUBCAT_INPUT_ACODEC 404
   #define SUBCAT_INPUT_SCODEC 405
   #define SUBCAT_INPUT_ADVANCED 406

#define CAT_SOUT 5
   #define SUBCAT_SOUT_GENERAL 501
   #define SUBCAT_SOUT_STREAM 502
   #define SUBCAT_SOUT_MUX 503
   #define SUBCAT_SOUT_ACO 504
   #define SUBCAT_SOUT_PACKETIZER 505
   #define SUBCAT_SOUT_SAP 506
   #define SUBCAT_SOUT_VOD 507

#define CAT_ADVANCED 6
   #define SUBCAT_ADVANCED_CPU 601
   #define SUBCAT_ADVANCED_MISC 602
   #define SUBCAT_ADVANCED_NETWORK 603
   #define SUBCAT_ADVANCED_XML 604

#define CAT_PLAYLIST 7
   #define SUBCAT_PLAYLIST_GENERAL 701
   #define SUBCAT_PLAYLIST_SD 702
   #define SUBCAT_PLAYLIST_EXPORT 703

struct config_category_t
{
    int         i_id;
    char       *psz_name;
    char       *psz_help;
};

117
struct module_config_t
gbazin's avatar
 
gbazin committed
118
{
Sam Hocevar's avatar
   
Sam Hocevar committed
119
    int          i_type;                               /* Configuration type */
120
    char        *psz_type;                          /* Configuration subtype */
gbazin's avatar
   
gbazin committed
121
    char        *psz_name;                                    /* Option name */
Sam Hocevar's avatar
   
Sam Hocevar committed
122
    char         i_short;                      /* Optional short option name */
gbazin's avatar
   
gbazin committed
123
124
125
    char        *psz_text;      /* Short comment on the configuration option */
    char        *psz_longtext;   /* Long comment on the configuration option */
    char        *psz_value;                                  /* Option value */
Sam Hocevar's avatar
   
Sam Hocevar committed
126
127
    int          i_value;                                    /* Option value */
    float        f_value;                                    /* Option value */
128
129
130
131
    int         i_min;                               /* Option minimum value */
    int         i_max;                               /* Option maximum value */
    float       f_min;                               /* Option minimum value */
    float       f_max;                               /* Option maximum value */
gbazin's avatar
 
gbazin committed
132

133
    /* Function to call when commiting a change */
gbazin's avatar
   
gbazin committed
134
135
    vlc_callback_t pf_callback;
    void          *p_callback_data;
136

137
    /* Values list */
gbazin's avatar
   
gbazin committed
138
    char       **ppsz_list;        /* List of possible values for the option */
139
140
141
    int         *pi_list;          /* Idem for integers */
    char       **ppsz_list_text;   /* Friendly names for list values */
    int          i_list;           /* Options list size */
gbazin's avatar
   
gbazin committed
142

143
144
145
146
147
148
    /* Actions list */
    vlc_callback_t *ppf_action;    /* List of possible actions for a config */
    char           **ppsz_action_text;         /* Friendly names for actions */
    int            i_action;                            /* actions list size */

    /* Misc */
gbazin's avatar
   
gbazin committed
149
    vlc_mutex_t *p_lock;            /* Lock to use when modifying the config */
150
    vlc_bool_t   b_dirty;          /* Dirty flag to indicate a config change */
gbazin's avatar
   
gbazin committed
151
152
153
154
155
156
    vlc_bool_t   b_advanced;          /* Flag to indicate an advanced option */

    /* Original option values */
    char        *psz_value_orig;
    int          i_value_orig;
    float        f_value_orig;
157
};
gbazin's avatar
 
gbazin committed
158
159
160
161
162

/*****************************************************************************
 * Prototypes - these methods are used to get, set or manipulate configuration
 * data.
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
163
VLC_EXPORT( int,    __config_GetType,  (vlc_object_t *, const char *) );
164
165
166
167
168
VLC_EXPORT( int,    __config_GetInt,   (vlc_object_t *, const char *) );
VLC_EXPORT( void,   __config_PutInt,   (vlc_object_t *, const char *, int) );
VLC_EXPORT( float,  __config_GetFloat, (vlc_object_t *, const char *) );
VLC_EXPORT( void,   __config_PutFloat, (vlc_object_t *, const char *, float) );
VLC_EXPORT( char *, __config_GetPsz,   (vlc_object_t *, const char *) );
169
VLC_EXPORT( void,   __config_PutPsz,   (vlc_object_t *, const char *, const char *) );
170

171
172
173
174
VLC_EXPORT( int,    __config_LoadCmdLine,  ( vlc_object_t *, int *, char *[], vlc_bool_t ) );
VLC_EXPORT( char *,   config_GetHomeDir,     ( void ) );
VLC_EXPORT( int,    __config_LoadConfigFile, ( vlc_object_t *, const char * ) );
VLC_EXPORT( int,    __config_SaveConfigFile, ( vlc_object_t *, const char * ) );
gbazin's avatar
   
gbazin committed
175
176
VLC_EXPORT( void,   __config_ResetAll, ( vlc_object_t * ) );

177
178
VLC_EXPORT( module_config_t *, config_FindConfig,( vlc_object_t *, const char * ) );
VLC_EXPORT( module_t *, config_FindModule,( vlc_object_t *, const char * ) );
gbazin's avatar
 
gbazin committed
179

180
181
VLC_EXPORT( void, config_Duplicate, ( module_t *, module_config_t * ) );
            void  config_Free       ( module_t * );
182

183
184
VLC_EXPORT( void, config_SetCallbacks, ( module_config_t *, module_config_t * ) );
VLC_EXPORT( void, config_UnsetCallbacks, ( module_config_t * ) );
gbazin's avatar
   
gbazin committed
185

gbazin's avatar
   
gbazin committed
186
#define config_GetType(a,b) __config_GetType(VLC_OBJECT(a),b)
187
188
189
190
191
192
#define config_GetInt(a,b) __config_GetInt(VLC_OBJECT(a),b)
#define config_PutInt(a,b,c) __config_PutInt(VLC_OBJECT(a),b,c)
#define config_GetFloat(a,b) __config_GetFloat(VLC_OBJECT(a),b)
#define config_PutFloat(a,b,c) __config_PutFloat(VLC_OBJECT(a),b,c)
#define config_GetPsz(a,b) __config_GetPsz(VLC_OBJECT(a),b)
#define config_PutPsz(a,b,c) __config_PutPsz(VLC_OBJECT(a),b,c)
gbazin's avatar
 
gbazin committed
193

194
195
196
#define config_LoadCmdLine(a,b,c,d) __config_LoadCmdLine(VLC_OBJECT(a),b,c,d)
#define config_LoadConfigFile(a,b) __config_LoadConfigFile(VLC_OBJECT(a),b)
#define config_SaveConfigFile(a,b) __config_SaveConfigFile(VLC_OBJECT(a),b)
gbazin's avatar
   
gbazin committed
197
#define config_ResetAll(a) __config_ResetAll(VLC_OBJECT(a))
198

199
200
201
/* internal only */
int config_CreateDir( vlc_object_t *, char * );

gbazin's avatar
 
gbazin committed
202
203
204
/*****************************************************************************
 * Macros used to build the configuration structure.
 *
gbazin's avatar
   
gbazin committed
205
206
207
 * Note that internally we support only 3 types of config data: int , float
 *   and string.
 *   The other types declared here just map to one of these 3 basic types but
gbazin's avatar
 
gbazin committed
208
209
210
 *   have the advantage of also providing very good hints to a configuration
 *   interface so as to make it more user friendly.
 * The configuration structure also includes category hints. These hints can
gbazin's avatar
   
gbazin committed
211
212
 *   provide a configuration interface with some very useful data and again
 *   allow for a more user friendly interface.
gbazin's avatar
 
gbazin committed
213
214
 *****************************************************************************/

zorglub's avatar
zorglub committed
215
#define set_category( i_id ) \
216
    i_config++; \
gbazin's avatar
   
gbazin committed
217
218
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
zorglub's avatar
zorglub committed
219
220
221
222
223
224
225
226
227
    { static module_config_t tmp = { CONFIG_CATEGORY, NULL, NULL , '\0', NULL, NULL, NULL, i_id }; p_config[ i_config ] = tmp;  }

#define set_subcategory( i_id ) \
    i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
    { static module_config_t tmp = { CONFIG_SUBCATEGORY, NULL, NULL , '\0', NULL, NULL, NULL, i_id }; p_config[ i_config ] = tmp;  }

#define set_section( text, longtext) \
228
    i_config++; \
gbazin's avatar
   
gbazin committed
229
230
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
zorglub's avatar
zorglub committed
231
232
233
234
235
236
237
238
239
240
241
242
    { static module_config_t tmp = { CONFIG_SECTION, NULL, NULL, '\0', text, longtext }; p_config[ i_config ] = tmp;  }

#define add_category_hint( text, longtext, advc ) \
            i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
                            (i_config+11) * sizeof(module_config_t)); \
    { static module_config_t tmp = { CONFIG_HINT_CATEGORY, NULL, NULL, '\0', text, longtext }; p_config[ i_config ] = tmp; p_config[i_config].b_advanced = advc; }

#define add_subcategory_hint( text, longtext ) \
            i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
                            (i_config+11) * sizeof(module_config_t)); \
243
    { static module_config_t tmp = { CONFIG_HINT_SUBCATEGORY, NULL, NULL, '\0', text, longtext }; p_config[ i_config ] = tmp; }
zorglub's avatar
zorglub committed
244
245


246
#define end_subcategory_hint \
247
    i_config++; \
gbazin's avatar
   
gbazin committed
248
249
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
250
    { static module_config_t tmp = { CONFIG_HINT_SUBCATEGORY_END, NULL, NULL, '\0' }; p_config[ i_config ] = tmp; }
251
#define add_usage_hint( text ) \
252
    i_config++; \
gbazin's avatar
   
gbazin committed
253
254
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
255
    { static module_config_t tmp = { CONFIG_HINT_USAGE, NULL, NULL, '\0', text }; p_config[ i_config ] = tmp; }
256

zorglub's avatar
zorglub committed
257

258
#define add_string( name, psz_value, p_callback, text, longtext, advc ) \
259
    i_config++; \
gbazin's avatar
   
gbazin committed
260
261
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
262
    { static module_config_t tmp = { CONFIG_ITEM_STRING, NULL, name, '\0', text, longtext, psz_value }; tmp.b_advanced = advc; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; }
263
#define add_file( name, psz_value, p_callback, text, longtext, advc ) \
264
    i_config++; \
gbazin's avatar
   
gbazin committed
265
266
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
267
    { static module_config_t tmp = { CONFIG_ITEM_FILE, NULL, name, '\0', text, longtext, psz_value, 0, 0 }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
gbazin's avatar
   
gbazin committed
268
#define add_directory( name, psz_value, p_callback, text, longtext, advc ) \
269
    i_config++; \
gbazin's avatar
   
gbazin committed
270
271
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
272
    { static module_config_t tmp = { CONFIG_ITEM_DIRECTORY, NULL, name, '\0', text, longtext, psz_value, 0, 0 }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
273

274
#define add_module( name, psz_caps, psz_value, p_callback, text, longtext, advc ) \
275
    i_config++; \
gbazin's avatar
   
gbazin committed
276
277
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
278
    { static module_config_t tmp = { CONFIG_ITEM_MODULE, psz_caps, name, '\0', text, longtext, psz_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
279

280
281
282
283
284
#define add_module_cat( name, i_subcategory, psz_value, p_callback, text, longtext, advc ) \
    i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
    { static module_config_t tmp = { CONFIG_ITEM_MODULE_CAT, NULL, name, '\0', text, longtext, psz_value, 0, 0.0, i_subcategory }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
285
286
287
288
289
290
291
292
293
294
295
296
297
298

#define add_module_list( name, psz_caps, psz_value, p_callback, text, longtext, advc ) \
    i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
    { static module_config_t tmp = { CONFIG_ITEM_MODULE_LIST, psz_caps, name, '\0', text, longtext, psz_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }


#define add_module_list_cat( name, i_subcategory, psz_value, p_callback, text, longtext, advc ) \
    i_config++; \
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
    { static module_config_t tmp = { CONFIG_ITEM_MODULE_LIST_CAT, NULL, name, '\0', text, longtext, psz_value, 0, 0.0, i_subcategory }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }

299
#define add_integer( name, i_value, p_callback, text, longtext, advc ) \
300
    i_config++; \
gbazin's avatar
   
gbazin committed
301
302
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
303
    { static module_config_t tmp = { CONFIG_ITEM_INTEGER, NULL, name, '\0', text, longtext, NULL, i_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
304

305
#define add_key( name, i_value, p_callback, text, longtext, advc ) \
306
    i_config++; \
gbazin's avatar
   
gbazin committed
307
308
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
309
    { static module_config_t tmp = { CONFIG_ITEM_KEY, NULL, name, '\0', text, longtext, NULL, i_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
310

311
#define add_integer_with_range( name, i_value, i_min, i_max, p_callback, text, longtext, advc ) \
312
    i_config++; \
gbazin's avatar
   
gbazin committed
313
314
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
315
    { static module_config_t tmp = { CONFIG_ITEM_INTEGER, NULL, name, '\0', text, longtext, NULL, i_value, 0, i_min, i_max }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
316

317
#define add_float( name, f_value, p_callback, text, longtext, advc ) \
318
    i_config++; \
gbazin's avatar
   
gbazin committed
319
320
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
321
    { static module_config_t tmp = { CONFIG_ITEM_FLOAT, NULL, name, '\0', text, longtext, NULL, 0, f_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
322

323
#define add_float_with_range( name, f_value, f_min, f_max, p_callback, text, longtext, advc ) \
324
    i_config++; \
gbazin's avatar
   
gbazin committed
325
326
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
327
    { static module_config_t tmp = { CONFIG_ITEM_FLOAT, NULL, name, '\0', text, longtext, NULL, 0, f_value, 0, 0, f_min, f_max }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
zorglub's avatar
zorglub committed
328

329
#define add_bool( name, b_value, p_callback, text, longtext, advc ) \
330
    i_config++; \
gbazin's avatar
   
gbazin committed
331
332
    if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, \
        (i_config+11) * sizeof(module_config_t)); \
333
334
335
336
337
338
339
340
341
    { static module_config_t tmp = { CONFIG_ITEM_BOOL, NULL, name, '\0', text, longtext, NULL, b_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }

/* Modifier macros for the config options (used for fine tuning) */
#define change_short( ch ) \
    p_config[i_config].i_short = ch;

#define change_string_list( list, list_text, list_update_func ) \
    p_config[i_config].i_list = sizeof(list)/sizeof(char *); \
    p_config[i_config].ppsz_list = list; \
342
    p_config[i_config].ppsz_list_text = list_text;
343
344
345
346

#define change_integer_list( list, list_text, list_update_func ) \
    p_config[i_config].i_list = sizeof(list)/sizeof(int); \
    p_config[i_config].pi_list = list; \
347
348
    p_config[i_config].ppsz_list_text = list_text;

349
350
351
352
353
354
355
356
#define change_integer_range( min, max ) \
    p_config[i_config].i_min = min; \
    p_config[i_config].i_max = max;

#define change_float_range( min, max ) \
    p_config[i_config].f_min = min; \
    p_config[i_config].f_max = max;

357
358
359
360
361
362
363
364
365
366
367
368
369
370
#define change_action_add( pf_action, action_text ) \
    if( !p_config[i_config].i_action ) \
    { p_config[i_config].ppsz_action_text = 0; \
      p_config[i_config].ppf_action = 0; } \
    p_config[i_config].ppf_action = (vlc_callback_t *) \
      realloc( p_config[i_config].ppf_action, \
      (p_config[i_config].i_action + 1) * sizeof(void *) ); \
    p_config[i_config].ppsz_action_text = (char **)\
      realloc( p_config[i_config].ppsz_action_text, \
      (p_config[i_config].i_action + 1) * sizeof(void *) ); \
    p_config[i_config].ppf_action[p_config[i_config].i_action] = pf_action; \
    p_config[i_config].ppsz_action_text[p_config[i_config].i_action] = \
      action_text; \
    p_config[i_config].i_action++;