directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor...
[mplayer.git] / m_option.h
blobdc691d87f3da74becf8ab425664d93467a61ef8d
1 #ifndef _M_OPTION_H
2 #define _M_OPTION_H
4 typedef struct m_option_type m_option_type_t;
5 typedef struct m_option m_option_t;
6 struct m_struct_st;
8 ///////////////////////////// Options types declarations ////////////////////////////
10 // Simple types
11 extern m_option_type_t m_option_type_flag;
12 extern m_option_type_t m_option_type_int;
13 extern m_option_type_t m_option_type_float;
14 extern m_option_type_t m_option_type_double;
15 extern m_option_type_t m_option_type_string;
16 extern m_option_type_t m_option_type_string_list;
17 extern m_option_type_t m_option_type_position;
19 extern m_option_type_t m_option_type_print;
20 extern m_option_type_t m_option_type_print_indirect;
21 extern m_option_type_t m_option_type_subconfig;
22 extern m_option_type_t m_option_type_imgfmt;
24 // Func based types
25 extern m_option_type_t m_option_type_func_full;
26 extern m_option_type_t m_option_type_func_param;
27 extern m_option_type_t m_option_type_func;
29 typedef void (*m_opt_default_func_t)(m_option_t *, char*);
30 typedef int (*m_opt_func_full_t)(m_option_t *, char *, char *);
31 typedef int (*m_opt_func_param_t)(m_option_t *, char *);
32 typedef int (*m_opt_func_t)(m_option_t *);
33 ///////////// Backward compat
34 typedef m_opt_default_func_t cfg_default_func_t;
35 typedef m_opt_func_full_t cfg_func_arg_param_t;
36 typedef m_opt_func_param_t cfg_func_param_t;
37 typedef m_opt_func_t cfg_func_t;
39 typedef struct {
40 void** list;
41 void* name_off;
42 void* info_off;
43 void* desc_off;
44 } m_obj_list_t;
46 typedef struct {
47 char* name;
48 char** attribs;
49 } m_obj_settings_t;
50 extern m_option_type_t m_option_type_obj_settings_list;
52 // Presets are mean to be used with options struct
55 typedef struct {
56 struct m_struct_st* in_desc;
57 struct m_struct_st* out_desc;
58 void* presets; // Pointer to an arry of struct defined by in_desc
59 void* name_off; // Offset of the preset name inside the in_struct
60 } m_obj_presets_t;
61 extern m_option_type_t m_option_type_obj_presets;
63 extern m_option_type_t m_option_type_custom_url;
65 typedef struct {
66 struct m_struct_st* desc; // Fields description
67 char separator; // Field separator to use
68 } m_obj_params_t;
69 extern m_option_type_t m_option_type_obj_params;
71 typedef struct {
72 int start;
73 int end;
74 } m_span_t;
75 extern m_obj_params_t m_span_params_def;
78 // FIXME: backward compatibility
79 #define CONF_TYPE_FLAG (&m_option_type_flag)
80 #define CONF_TYPE_INT (&m_option_type_int)
81 #define CONF_TYPE_FLOAT (&m_option_type_float)
82 #define CONF_TYPE_DOUBLE (&m_option_type_double)
83 #define CONF_TYPE_STRING (&m_option_type_string)
84 #define CONF_TYPE_FUNC (&m_option_type_func)
85 #define CONF_TYPE_FUNC_PARAM (&m_option_type_func_param)
86 #define CONF_TYPE_PRINT (&m_option_type_print)
87 #define CONF_TYPE_PRINT_INDIRECT (&m_option_type_print_indirect)
88 #define CONF_TYPE_FUNC_FULL (&m_option_type_func_full)
89 #define CONF_TYPE_SUBCONFIG (&m_option_type_subconfig)
90 #define CONF_TYPE_STRING_LIST (&m_option_type_string_list)
91 #define CONF_TYPE_POSITION (&m_option_type_position)
92 #define CONF_TYPE_IMGFMT (&m_option_type_imgfmt)
93 #define CONF_TYPE_SPAN (&m_option_type_span)
94 #define CONF_TYPE_OBJ_SETTINGS_LIST (&m_option_type_obj_settings_list)
95 #define CONF_TYPE_OBJ_PRESETS (&m_option_type_obj_presets)
96 #define CONF_TYPE_CUSTOM_URL (&m_option_type_custom_url)
97 #define CONF_TYPE_OBJ_PARAMS (&m_option_type_obj_params)
99 /////////////////////////////////////////////////////////////////////////////////////////////
101 struct m_option_type {
102 char* name;
103 char* comments; // syntax desc, etc
104 unsigned int size; // size needed for a save slot
105 unsigned int flags;
107 // parse is the only requiered function all others can be NULL
108 // If dst if non-NULL it should create/update the save slot
109 // If dst is NULL it should just test the validity of the arg if possible
110 // Src tell from where come this setting (ie cfg file, command line, playlist, ....
111 // It should return 1 if param was used, 0 if not.
112 // On error it must return 1 of the error code below
113 int (*parse)(m_option_t* opt,char *name, char *param, void* dst, int src);
114 // Print back a value in human form
115 char* (*print)(m_option_t* opt, void* val);
117 // These 3 will be a memcpy in 50% of the case, it's called to save/restore the status of
118 // the var it's there for complex type like CONF_TYPE_FUNC*
119 // update a save slot (dst) from the current value in the prog (src)
120 void (*save)(m_option_t* opt,void* dst, void* src);
121 // set the current value (dst) from a save slot
122 void (*set)(m_option_t* opt,void* dst, void* src);
123 // Copy betewen 2 slot (if NULL and size > 0 a memcpy will be used
124 void (*copy)(m_option_t* opt,void* dst, void* src);
125 // Free the data allocated for a save slot if needed
126 void (*free)(void* dst);
129 struct m_option {
130 char *name;
131 void *p;
132 m_option_type_t* type;
133 unsigned int flags;
134 double min,max;
135 // This used to be function pointer to hold a 'reverse to defaults' func.
136 // Nom it can be used to pass any type of extra args.
137 // Passing a 'default func' is still valid for all func based option types
138 void* priv; // Type dependent data (for all kind of extended setting)
142 //////////////////////////////// Option flags /////////////////////////////////
144 // Option flags
145 #define M_OPT_MIN (1<<0)
146 #define M_OPT_MAX (1<<1)
147 #define M_OPT_RANGE (M_OPT_MIN|M_OPT_MAX)
148 #define M_OPT_NOCFG (1<<2)
149 #define M_OPT_NOCMD (1<<3)
150 // This option is global : it won't be saved on push and the command
151 // line parser will set it when it's parsed (ie. it won't be set later)
152 // e.g options : -v, -quiet
153 #define M_OPT_GLOBAL (1<<4)
154 // Do not save this option : it won't be saved on push but the command
155 // line parser will put it with it's entry (ie : it may be set later)
156 // e.g options : -include
157 #define M_OPT_NOSAVE (1<<5)
158 // Emulate old behaviour by pushing the option only if it was set by the user
159 #define M_OPT_OLD (1<<6)
161 // FIXME: backward compatibility
162 #define CONF_MIN M_OPT_MIN
163 #define CONF_MAX M_OPT_MAX
164 #define CONF_RANGE M_OPT_RANGE
165 #define CONF_NOCFG M_OPT_NOCFG
166 #define CONF_NOCMD M_OPT_NOCMD
167 #define CONF_GLOBAL M_OPT_GLOBAL
168 #define CONF_NOSAVE M_OPT_NOSAVE
169 #define CONF_OLD M_OPT_OLD
172 ///////////////////////////// Option type flags ///////////////////////////////////
174 // These flags are for the parsers. The description here apply to the m_config_t
175 // based parsers (ie. cmd line and config file parsers)
176 // Some parser will refuse option types that have some of these flags
178 // This flag is used for the subconfig
179 // When this flag is set, opt->p should point to another m_option_t array
180 // Only the parse function will be called. If dst is set, it should create/update
181 // an array of char* containg opt/val pairs.
182 // Then the options in the child array will then be set automaticly.
183 // You can only affect the way suboption are parsed.
184 // Also note that suboptions may be directly accessed by using -option:subopt blah :-)
185 #define M_OPT_TYPE_HAS_CHILD (1<<0)
186 // If this flag is set the option type support option name with * at the end (used for -aa*)
187 // This only affect the option name matching, the option type have to implement
188 // the needed stuff.
189 #define M_OPT_TYPE_ALLOW_WILDCARD (1<<1)
190 // This flag indicate that the data is dynamicly allocated (opt->p point to a pointer)
191 // It enable a little hack wich replace the initial value by a dynamic copy
192 // in case the initial value is staticly allocated (pretty common with strings)
193 #define M_OPT_TYPE_DYNAMIC (1<<2)
194 /// If this is set the parse function doesn't directly return
195 // the wanted thing. Options use this if for some reasons they have to wait
196 // until the set call to be able to correctly set the target var.
197 // So for those types you have to first parse and then set the target var
198 // If this flag isn't set you can parse directly to the target var
199 // It's used for the callback based option as the callback call may append
200 // later on.
201 #define M_OPT_TYPE_INDIRECT (1<<3)
204 ///////////////////////////// Parser flags ////////////////////////////////////////
206 // Config mode : some parser type behave differently depending
207 // on config->mode value wich is passed in the src param of parse()
208 #define M_CONFIG_FILE 0
209 #define M_COMMAND_LINE 1
211 // Option parser error code
212 #define M_OPT_UNKNOWN -1
213 #define M_OPT_MISSING_PARAM -2
214 #define M_OPT_INVALID -3
215 #define M_OPT_OUT_OF_RANGE -4
216 #define M_OPT_PARSER_ERR -5
217 #define M_OPT_EXIT -6
219 // FIXME: backward compatibility
220 #define ERR_NOT_AN_OPTION M_OPT_UNKNOWN
221 #define ERR_MISSING_PARAM M_OPT_MISSING_PARAM
222 #define ERR_OUT_OF_RANGE M_OPT_OUT_OF_RANGE
223 #define ERR_FUNC_ERR M_OPT_PARSER_ERR
225 m_option_t* m_option_list_find(m_option_t* list,char* name);
227 inline static int
228 m_option_parse(m_option_t* opt,char *name, char *param, void* dst, int src) {
229 return opt->type->parse(opt,name,param,dst,src);
232 inline static char*
233 m_option_print(m_option_t* opt, void* val_ptr) {
234 if(opt->type->print)
235 return opt->type->print(opt,val_ptr);
236 else
237 return (char*)-1;
240 inline static void
241 m_option_save(m_option_t* opt,void* dst, void* src) {
242 if(opt->type->save)
243 opt->type->save(opt,dst,src);
246 inline static void
247 m_option_set(m_option_t* opt,void* dst, void* src) {
248 if(opt->type->set)
249 opt->type->set(opt,dst,src);
252 inline static void
253 m_option_copy(m_option_t* opt,void* dst, void* src) {
254 if(opt->type->copy)
255 opt->type->set(opt,dst,src);
256 else if(opt->type->size > 0)
257 memcpy(dst,src,opt->type->size);
260 inline static void
261 m_option_free(m_option_t* opt,void* dst) {
262 if(opt->type->free)
263 opt->type->free(dst);
266 #endif /* _M_OPTION_H */