1 /*****************************************************************************
2 * var.c: object variables for input thread
3 *****************************************************************************
4 * Copyright (C) 2004-2007 VLC authors and VideoLAN
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this program; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
31 #include <vlc_common.h>
37 #include "input_internal.h"
39 /*****************************************************************************
41 *****************************************************************************/
42 static int StateCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
43 vlc_value_t oldval
, vlc_value_t newval
, void * );
44 static int RateCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
45 vlc_value_t oldval
, vlc_value_t newval
, void * );
46 static int PositionCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
47 vlc_value_t oldval
, vlc_value_t newval
, void * );
48 static int TimeCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
49 vlc_value_t oldval
, vlc_value_t newval
, void * );
50 static int TimeOffsetCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
51 vlc_value_t oldval
, vlc_value_t newval
, void * );
52 static int ProgramCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
53 vlc_value_t oldval
, vlc_value_t newval
, void * );
54 static int TitleCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
55 vlc_value_t oldval
, vlc_value_t newval
, void * );
56 static int SeekpointCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
57 vlc_value_t oldval
, vlc_value_t newval
, void * );
58 static int NavigationCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
59 vlc_value_t oldval
, vlc_value_t newval
, void * );
60 static int EsVideoCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
61 vlc_value_t oldval
, vlc_value_t newval
, void * );
62 static int EsAudioCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
63 vlc_value_t oldval
, vlc_value_t newval
, void * );
64 static int EsSpuCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
65 vlc_value_t oldval
, vlc_value_t newval
, void * );
66 static int EsDelayCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
67 vlc_value_t oldval
, vlc_value_t newval
, void * );
69 static int BookmarkCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
70 vlc_value_t oldval
, vlc_value_t newval
, void * );
72 static int RecordCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
73 vlc_value_t oldval
, vlc_value_t newval
,
75 static int FrameNextCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
76 vlc_value_t oldval
, vlc_value_t newval
,
82 vlc_callback_t callback
;
83 } vlc_input_callback_t
;
85 static void InputAddCallbacks( input_thread_t
*, const vlc_input_callback_t
* );
86 static void InputDelCallbacks( input_thread_t
*, const vlc_input_callback_t
* );
88 #ifdef CALLBACK /* For windows */
89 # undef CALLBACK /* We don't care of this one here */
91 /* List all callbacks added by input */
92 #define CALLBACK(name,cb) { name, cb }
93 static const vlc_input_callback_t p_input_callbacks
[] =
95 CALLBACK( "state", StateCallback
),
96 CALLBACK( "rate", RateCallback
),
97 CALLBACK( "position", PositionCallback
),
98 CALLBACK( "time", TimeCallback
),
99 CALLBACK( "time-offset", TimeOffsetCallback
),
100 CALLBACK( "bookmark", BookmarkCallback
),
101 CALLBACK( "program", ProgramCallback
),
102 CALLBACK( "title", TitleCallback
),
103 CALLBACK( "chapter", SeekpointCallback
),
104 CALLBACK( "audio-delay", EsDelayCallback
),
105 CALLBACK( "spu-delay", EsDelayCallback
),
106 CALLBACK( "video-es", EsVideoCallback
),
107 CALLBACK( "audio-es", EsAudioCallback
),
108 CALLBACK( "spu-es", EsSpuCallback
),
109 CALLBACK( "record", RecordCallback
),
110 CALLBACK( "frame-next", FrameNextCallback
),
112 CALLBACK( NULL
, NULL
)
114 static const vlc_input_callback_t p_input_title_navigation_callbacks
[] =
116 CALLBACK( "next-title", TitleCallback
),
117 CALLBACK( "prev-title", TitleCallback
),
118 CALLBACK( "menu-popup", TitleCallback
),
119 CALLBACK( "menu-title", TitleCallback
),
121 CALLBACK( NULL
, NULL
)
123 static const vlc_input_callback_t p_input_seekpoint_navigation_callbacks
[] =
125 CALLBACK( "next-chapter", SeekpointCallback
),
126 CALLBACK( "prev-chapter", SeekpointCallback
),
128 CALLBACK( NULL
, NULL
)
132 /*****************************************************************************
133 * input_ControlVarInit:
134 * Create all control object variables with their callbacks
135 *****************************************************************************/
136 void input_ControlVarInit ( input_thread_t
*p_input
)
138 vlc_value_t val
, text
;
141 var_Create( p_input
, "state", VLC_VAR_INTEGER
);
142 val
.i_int
= input_priv(p_input
)->i_state
;
143 var_Change( p_input
, "state", VLC_VAR_SETVALUE
, &val
, NULL
);
146 var_Create( p_input
, "rate", VLC_VAR_FLOAT
| VLC_VAR_DOINHERIT
);
148 var_Create( p_input
, "frame-next", VLC_VAR_VOID
);
151 var_Create( p_input
, "position", VLC_VAR_FLOAT
);
154 var_Create( p_input
, "time", VLC_VAR_INTEGER
);
155 var_Create( p_input
, "time-offset", VLC_VAR_INTEGER
); /* relative */
158 var_Create( p_input
, "bookmark", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
);
159 val
.psz_string
= _("Bookmark");
160 var_Change( p_input
, "bookmark", VLC_VAR_SETTEXT
, &val
, NULL
);
163 var_Create( p_input
, "program", VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
164 var_Get( p_input
, "program", &val
);
166 var_Change( p_input
, "program", VLC_VAR_DELCHOICE
, &val
, NULL
);
167 text
.psz_string
= _("Program");
168 var_Change( p_input
, "program", VLC_VAR_SETTEXT
, &text
, NULL
);
171 var_Create( p_input
, "programs", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
172 text
.psz_string
= _("Programs");
173 var_Change( p_input
, "programs", VLC_VAR_SETTEXT
, &text
, NULL
);
176 var_Create( p_input
, "title", VLC_VAR_INTEGER
);
177 text
.psz_string
= _("Title");
178 var_Change( p_input
, "title", VLC_VAR_SETTEXT
, &text
, NULL
);
181 var_Create( p_input
, "chapter", VLC_VAR_INTEGER
);
182 text
.psz_string
= _("Chapter");
183 var_Change( p_input
, "chapter", VLC_VAR_SETTEXT
, &text
, NULL
);
186 var_Create( p_input
, "audio-delay", VLC_VAR_INTEGER
);
187 var_SetInteger( p_input
, "audio-delay",
188 1000 * var_GetInteger( p_input
, "audio-desync" ) );
189 var_Create( p_input
, "spu-delay", VLC_VAR_INTEGER
);
193 var_Create( p_input
, "video-es", VLC_VAR_INTEGER
);
194 var_Change( p_input
, "video-es", VLC_VAR_SETVALUE
, &val
, NULL
);
195 text
.psz_string
= _("Video Track");
196 var_Change( p_input
, "video-es", VLC_VAR_SETTEXT
, &text
, NULL
);
199 var_Create( p_input
, "audio-es", VLC_VAR_INTEGER
);
200 var_Change( p_input
, "audio-es", VLC_VAR_SETVALUE
, &val
, NULL
);
201 text
.psz_string
= _("Audio Track");
202 var_Change( p_input
, "audio-es", VLC_VAR_SETTEXT
, &text
, NULL
);
205 var_Create( p_input
, "spu-es", VLC_VAR_INTEGER
);
206 var_Change( p_input
, "spu-es", VLC_VAR_SETVALUE
, &val
, NULL
);
207 text
.psz_string
= _("Subtitle Track");
208 var_Change( p_input
, "spu-es", VLC_VAR_SETTEXT
, &text
, NULL
);
210 var_Create( p_input
, "spu-choice", VLC_VAR_INTEGER
);
211 var_SetInteger( p_input
, "spu-choice", -1 );
213 /* Special read only objects variables for intf */
214 var_Create( p_input
, "bookmarks", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
216 var_Create( p_input
, "length", VLC_VAR_INTEGER
);
218 var_Create( p_input
, "bit-rate", VLC_VAR_INTEGER
);
219 var_Create( p_input
, "sample-rate", VLC_VAR_INTEGER
);
221 /* Special "intf-event" variable. */
222 var_Create( p_input
, "intf-event", VLC_VAR_INTEGER
);
225 * XXX we put callback only in non preparsing mode. We need to create the variable
226 * unless someone want to check all var_Get/var_Change return value ... */
227 if( !input_priv(p_input
)->b_preparsing
)
228 InputAddCallbacks( p_input
, p_input_callbacks
);
231 /*****************************************************************************
232 * input_ControlVarStop:
233 *****************************************************************************/
234 void input_ControlVarStop( input_thread_t
*p_input
)
236 demux_t
* p_demux
= input_priv(p_input
)->master
->p_demux
;
239 if( !input_priv(p_input
)->b_preparsing
)
240 InputDelCallbacks( p_input
, p_input_callbacks
);
242 if( input_priv(p_input
)->i_title
> 1 )
243 InputDelCallbacks( p_input
, p_input_title_navigation_callbacks
);
245 for( int i
= 0; i
< input_priv(p_input
)->i_title
; i
++ )
247 char name
[sizeof("title ") + 3 * sizeof (int)];
249 sprintf( name
, "title %2u", i
);
250 var_DelCallback( p_input
, name
, NavigationCallback
, (void *)(intptr_t)i
);
253 if( !demux_Control( p_demux
, DEMUX_GET_TITLE
, &i_cur_title
) )
255 const input_title_t
* t
= input_priv(p_input
)->title
[ i_cur_title
];
257 if( t
->i_seekpoint
> 1 )
258 InputDelCallbacks( p_input
, p_input_seekpoint_navigation_callbacks
);
262 /*****************************************************************************
263 * input_ControlVarNavigation:
264 * Create all remaining control object variables
265 *****************************************************************************/
266 void input_ControlVarNavigation( input_thread_t
*p_input
)
270 /* Create more command variables */
271 if( input_priv(p_input
)->i_title
> 1 )
273 if( var_Type( p_input
, "next-title" ) == 0 ) {
274 var_Create( p_input
, "next-title", VLC_VAR_VOID
);
275 text
.psz_string
= _("Next title");
276 var_Change( p_input
, "next-title", VLC_VAR_SETTEXT
, &text
, NULL
);
277 var_AddCallback( p_input
, "next-title", TitleCallback
, NULL
);
280 if( var_Type( p_input
, "prev-title" ) == 0 ) {
281 var_Create( p_input
, "prev-title", VLC_VAR_VOID
);
282 text
.psz_string
= _("Previous title");
283 var_Change( p_input
, "prev-title", VLC_VAR_SETTEXT
, &text
, NULL
);
284 var_AddCallback( p_input
, "prev-title", TitleCallback
, NULL
);
287 if( var_Type( p_input
, "menu-title" ) == 0 ) {
288 var_Create( p_input
, "menu-title", VLC_VAR_VOID
);
289 text
.psz_string
= _("Menu title");
290 var_Change( p_input
, "menu-title", VLC_VAR_SETTEXT
, &text
, NULL
);
291 var_AddCallback( p_input
, "menu-title", TitleCallback
, NULL
);
294 if( var_Type( p_input
, "menu-popup" ) == 0 ) {
295 var_Create( p_input
, "menu-popup", VLC_VAR_VOID
);
296 text
.psz_string
= _("Menu popup");
297 var_Change( p_input
, "menu-popup", VLC_VAR_SETTEXT
, &text
, NULL
);
298 var_AddCallback( p_input
, "menu-popup", TitleCallback
, NULL
);
302 /* Create titles and chapters */
303 var_Change( p_input
, "title", VLC_VAR_CLEARCHOICES
, NULL
, NULL
);
305 for( int i
= 0; i
< input_priv(p_input
)->i_title
; i
++ )
307 vlc_value_t val2
, text2
;
308 char title
[sizeof("title ") + 3 * sizeof (int)];
310 /* Add Navigation entries */
311 sprintf( title
, "title %2u", i
);
312 var_Destroy( p_input
, title
);
313 var_Create( p_input
, title
, VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
);
314 var_AddCallback( p_input
, title
,
315 NavigationCallback
, (void *)(intptr_t)i
);
317 char psz_length
[MSTRTIME_MAX_SIZE
+ sizeof(" []")];
318 if( input_priv(p_input
)->title
[i
]->i_length
> 0 )
320 strcpy( psz_length
, " [" );
321 secstotimestr( &psz_length
[2], input_priv(p_input
)->title
[i
]->i_length
/ CLOCK_FREQ
);
322 strcat( psz_length
, "]" );
325 psz_length
[0] = '\0';
327 if( input_priv(p_input
)->title
[i
]->psz_name
== NULL
||
328 *input_priv(p_input
)->title
[i
]->psz_name
== '\0' )
330 if( asprintf( &text
.psz_string
, _("Title %i%s"),
331 i
+ input_priv(p_input
)->i_title_offset
, psz_length
) == -1 )
336 if( asprintf( &text
.psz_string
, "%s%s",
337 input_priv(p_input
)->title
[i
]->psz_name
, psz_length
) == -1 )
341 /* Add title choice */
343 var_Change( p_input
, "title", VLC_VAR_ADDCHOICE
, &val2
, &text
);
345 free( text
.psz_string
);
347 for( int j
= 0; j
< input_priv(p_input
)->title
[i
]->i_seekpoint
; j
++ )
351 if( input_priv(p_input
)->title
[i
]->seekpoint
[j
]->psz_name
== NULL
||
352 *input_priv(p_input
)->title
[i
]->seekpoint
[j
]->psz_name
== '\0' )
355 if( asprintf( &text2
.psz_string
, _("Chapter %i"),
356 j
+ input_priv(p_input
)->i_seekpoint_offset
) == -1 )
362 strdup( input_priv(p_input
)->title
[i
]->seekpoint
[j
]->psz_name
);
365 var_Change( p_input
, title
, VLC_VAR_ADDCHOICE
, &val2
, &text2
);
366 free( text2
.psz_string
);
372 /*****************************************************************************
373 * input_ControlVarTitle:
374 * Create all variables for a title
375 *****************************************************************************/
376 void input_ControlVarTitle( input_thread_t
*p_input
, int i_title
)
378 const input_title_t
*t
= input_priv(p_input
)->title
[i_title
];
382 /* Create/Destroy command variables */
383 if( t
->i_seekpoint
<= 1 )
385 var_Destroy( p_input
, "next-chapter" );
386 var_Destroy( p_input
, "prev-chapter" );
388 else if( var_Type( p_input
, "next-chapter" ) == 0 )
390 var_Create( p_input
, "next-chapter", VLC_VAR_VOID
);
391 text
.psz_string
= _("Next chapter");
392 var_Change( p_input
, "next-chapter", VLC_VAR_SETTEXT
, &text
, NULL
);
393 var_AddCallback( p_input
, "next-chapter", SeekpointCallback
, NULL
);
395 var_Create( p_input
, "prev-chapter", VLC_VAR_VOID
);
396 text
.psz_string
= _("Previous chapter");
397 var_Change( p_input
, "prev-chapter", VLC_VAR_SETTEXT
, &text
, NULL
);
398 var_AddCallback( p_input
, "prev-chapter", SeekpointCallback
, NULL
);
401 /* Build chapter list */
402 var_Change( p_input
, "chapter", VLC_VAR_CLEARCHOICES
, NULL
, NULL
);
403 for( i
= 0; i
< t
->i_seekpoint
; i
++ )
408 if( t
->seekpoint
[i
]->psz_name
== NULL
||
409 *t
->seekpoint
[i
]->psz_name
== '\0' )
412 if( asprintf( &text
.psz_string
, _("Chapter %i"),
413 i
+ input_priv(p_input
)->i_seekpoint_offset
) == -1 )
418 text
.psz_string
= strdup( t
->seekpoint
[i
]->psz_name
);
421 var_Change( p_input
, "chapter", VLC_VAR_ADDCHOICE
, &val
, &text
);
422 free( text
.psz_string
);
426 /*****************************************************************************
427 * input_ConfigVarInit:
428 * Create all config object variables
429 *****************************************************************************/
430 void input_ConfigVarInit ( input_thread_t
*p_input
)
432 /* Create Object Variables for private use only */
434 if( !input_priv(p_input
)->b_preparsing
)
436 var_Create( p_input
, "video", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
437 var_Create( p_input
, "audio", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
438 var_Create( p_input
, "spu", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
440 var_Create( p_input
, "audio-track", VLC_VAR_INTEGER
|VLC_VAR_DOINHERIT
);
441 var_Create( p_input
, "sub-track", VLC_VAR_INTEGER
|VLC_VAR_DOINHERIT
);
443 var_Create( p_input
, "audio-language",
444 VLC_VAR_STRING
|VLC_VAR_DOINHERIT
);
445 var_Create( p_input
, "sub-language",
446 VLC_VAR_STRING
|VLC_VAR_DOINHERIT
);
447 var_Create( p_input
, "menu-language",
448 VLC_VAR_STRING
|VLC_VAR_DOINHERIT
);
450 var_Create( p_input
, "audio-track-id",
451 VLC_VAR_INTEGER
|VLC_VAR_DOINHERIT
);
452 var_Create( p_input
, "sub-track-id",
453 VLC_VAR_INTEGER
|VLC_VAR_DOINHERIT
);
455 var_Create( p_input
, "sub-file", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
456 var_Create( p_input
, "sub-autodetect-file", VLC_VAR_BOOL
|
458 var_Create( p_input
, "sub-autodetect-path", VLC_VAR_STRING
|
460 var_Create( p_input
, "sub-autodetect-fuzzy", VLC_VAR_INTEGER
|
463 var_Create( p_input
, "sout", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
464 var_Create( p_input
, "sout-all", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
465 var_Create( p_input
, "sout-audio", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
466 var_Create( p_input
, "sout-video", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
467 var_Create( p_input
, "sout-spu", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
468 var_Create( p_input
, "sout-keep", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
470 var_Create( p_input
, "input-repeat",
471 VLC_VAR_INTEGER
|VLC_VAR_DOINHERIT
);
472 var_Create( p_input
, "start-time", VLC_VAR_FLOAT
|VLC_VAR_DOINHERIT
);
473 var_Create( p_input
, "stop-time", VLC_VAR_FLOAT
|VLC_VAR_DOINHERIT
);
474 var_Create( p_input
, "run-time", VLC_VAR_FLOAT
|VLC_VAR_DOINHERIT
);
475 var_Create( p_input
, "input-fast-seek", VLC_VAR_BOOL
|VLC_VAR_DOINHERIT
);
477 var_Create( p_input
, "input-slave",
478 VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
480 var_Create( p_input
, "audio-desync",
481 VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
482 var_Create( p_input
, "cr-average",
483 VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
484 var_Create( p_input
, "clock-synchro",
485 VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
488 var_Create( p_input
, "can-seek", VLC_VAR_BOOL
);
489 var_SetBool( p_input
, "can-seek", true ); /* Fixed later*/
491 var_Create( p_input
, "can-pause", VLC_VAR_BOOL
);
492 var_SetBool( p_input
, "can-pause", true ); /* Fixed later*/
494 var_Create( p_input
, "can-rate", VLC_VAR_BOOL
);
495 var_SetBool( p_input
, "can-rate", false );
497 var_Create( p_input
, "can-rewind", VLC_VAR_BOOL
);
498 var_SetBool( p_input
, "can-rewind", false );
500 var_Create( p_input
, "can-record", VLC_VAR_BOOL
);
501 var_SetBool( p_input
, "can-record", false ); /* Fixed later*/
503 var_Create( p_input
, "record", VLC_VAR_BOOL
);
504 var_SetBool( p_input
, "record", false );
506 var_Create( p_input
, "teletext-es", VLC_VAR_INTEGER
);
507 var_SetInteger( p_input
, "teletext-es", -1 );
509 var_Create( p_input
, "signal-quality", VLC_VAR_FLOAT
);
510 var_SetFloat( p_input
, "signal-quality", -1 );
512 var_Create( p_input
, "signal-strength", VLC_VAR_FLOAT
);
513 var_SetFloat( p_input
, "signal-strength", -1 );
515 var_Create( p_input
, "program-scrambled", VLC_VAR_BOOL
);
516 var_SetBool( p_input
, "program-scrambled", false );
518 var_Create( p_input
, "cache", VLC_VAR_FLOAT
);
519 var_SetFloat( p_input
, "cache", 0.0 );
522 var_Create( p_input
, "input-record-native", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
525 var_Create( p_input
, "access", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
526 var_Create( p_input
, "demux", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
527 var_Create( p_input
, "demux-filter", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
528 var_Create( p_input
, "stream-filter", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
531 var_Create( p_input
, "meta-title", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
532 var_Create( p_input
, "meta-author", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
533 var_Create( p_input
, "meta-artist", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
534 var_Create( p_input
, "meta-genre", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
535 var_Create( p_input
, "meta-copyright", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
536 var_Create( p_input
, "meta-description", VLC_VAR_STRING
|VLC_VAR_DOINHERIT
);
537 var_Create( p_input
, "meta-date", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
538 var_Create( p_input
, "meta-url", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
541 /*****************************************************************************
542 * Callbacks managements:
543 *****************************************************************************/
544 static void InputAddCallbacks( input_thread_t
*p_input
,
545 const vlc_input_callback_t
*p_callbacks
)
548 for( i
= 0; p_callbacks
[i
].psz_name
!= NULL
; i
++ )
549 var_AddCallback( p_input
,
550 p_callbacks
[i
].psz_name
,
551 p_callbacks
[i
].callback
, NULL
);
554 static void InputDelCallbacks( input_thread_t
*p_input
,
555 const vlc_input_callback_t
*p_callbacks
)
558 for( i
= 0; p_callbacks
[i
].psz_name
!= NULL
; i
++ )
559 var_DelCallback( p_input
,
560 p_callbacks
[i
].psz_name
,
561 p_callbacks
[i
].callback
, NULL
);
564 /*****************************************************************************
566 *****************************************************************************/
567 static int StateCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
568 vlc_value_t oldval
, vlc_value_t newval
,
571 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
572 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
574 if( newval
.i_int
== PLAYING_S
|| newval
.i_int
== PAUSE_S
)
576 input_ControlPush( p_input
, INPUT_CONTROL_SET_STATE
, &newval
);
583 static int RateCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
584 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
586 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
587 VLC_UNUSED(oldval
); VLC_UNUSED(p_data
); VLC_UNUSED(psz_cmd
);
589 newval
.i_int
= INPUT_RATE_DEFAULT
/ newval
.f_float
;
590 input_ControlPush( p_input
, INPUT_CONTROL_SET_RATE
, &newval
);
595 static int PositionCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
596 vlc_value_t oldval
, vlc_value_t newval
,
599 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
601 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
603 /* Update "length" for better intf behaviour */
604 const int64_t i_length
= var_GetInteger( p_input
, "length" );
605 if( i_length
> 0 && newval
.f_float
>= 0.f
&& newval
.f_float
<= 1.f
)
609 val
.i_int
= i_length
* newval
.f_float
;
610 var_Change( p_input
, "time", VLC_VAR_SETVALUE
, &val
, NULL
);
613 input_ControlPush( p_input
, INPUT_CONTROL_SET_POSITION
, &newval
);
617 static int TimeCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
618 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
620 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
621 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
623 /* Update "position" for better intf behaviour */
624 const int64_t i_length
= var_GetInteger( p_input
, "length" );
625 if( i_length
> 0 && newval
.i_int
>= 0 && newval
.i_int
<= i_length
)
629 val
.f_float
= (double)newval
.i_int
/(double)i_length
;
630 var_Change( p_input
, "position", VLC_VAR_SETVALUE
, &val
, NULL
);
632 * Notify the intf that a new event has been occurred.
633 * XXX this is a bit hackish but it's the only way to do it now.
635 var_SetInteger( p_input
, "intf-event", INPUT_EVENT_POSITION
);
638 input_ControlPush( p_input
, INPUT_CONTROL_SET_TIME
, &newval
);
642 static int TimeOffsetCallback( vlc_object_t
*obj
, char const *varname
,
643 vlc_value_t prev
, vlc_value_t cur
, void *data
)
645 VLC_UNUSED(varname
); VLC_UNUSED(prev
); VLC_UNUSED(data
);
647 int64_t i_time
= var_GetInteger( obj
, "time" ) + cur
.i_int
;
650 var_SetInteger( obj
, "time", i_time
);
654 static int ProgramCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
655 vlc_value_t oldval
, vlc_value_t newval
,
658 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
659 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
661 input_ControlPush( p_input
, INPUT_CONTROL_SET_PROGRAM
, &newval
);
666 static int TitleCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
667 vlc_value_t oldval
, vlc_value_t newval
,
670 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
671 vlc_value_t val
, count
;
672 VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
674 if( !strcmp( psz_cmd
, "next-title" ) )
676 input_ControlPush( p_input
, INPUT_CONTROL_SET_TITLE_NEXT
, NULL
);
678 val
.i_int
= var_GetInteger( p_input
, "title" ) + 1;
679 var_Change( p_input
, "title", VLC_VAR_CHOICESCOUNT
, &count
, NULL
);
680 if( val
.i_int
< count
.i_int
)
681 var_Change( p_input
, "title", VLC_VAR_SETVALUE
, &val
, NULL
);
683 else if( !strcmp( psz_cmd
, "prev-title" ) )
685 input_ControlPush( p_input
, INPUT_CONTROL_SET_TITLE_PREV
, NULL
);
687 val
.i_int
= var_GetInteger( p_input
, "title" ) - 1;
689 var_Change( p_input
, "title", VLC_VAR_SETVALUE
, &val
, NULL
);
691 else if( !strcmp( psz_cmd
, "menu-title" ) )
693 input_ControlPush( p_input
, INPUT_CONTROL_NAV_MENU
, NULL
);
695 else if( !strcmp( psz_cmd
, "menu-popup" ) )
697 input_ControlPush( p_input
, INPUT_CONTROL_NAV_POPUP
, NULL
);
701 input_ControlPush( p_input
, INPUT_CONTROL_SET_TITLE
, &newval
);
707 static int SeekpointCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
708 vlc_value_t oldval
, vlc_value_t newval
,
711 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
712 vlc_value_t val
, count
;
713 VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
715 if( !strcmp( psz_cmd
, "next-chapter" ) )
717 input_ControlPush( p_input
, INPUT_CONTROL_SET_SEEKPOINT_NEXT
, NULL
);
719 val
.i_int
= var_GetInteger( p_input
, "chapter" ) + 1;
720 var_Change( p_input
, "chapter", VLC_VAR_CHOICESCOUNT
, &count
, NULL
);
721 if( val
.i_int
< count
.i_int
)
722 var_Change( p_input
, "chapter", VLC_VAR_SETVALUE
, &val
, NULL
);
724 else if( !strcmp( psz_cmd
, "prev-chapter" ) )
726 input_ControlPush( p_input
, INPUT_CONTROL_SET_SEEKPOINT_PREV
, NULL
);
728 val
.i_int
= var_GetInteger( p_input
, "chapter" ) - 1;
730 var_Change( p_input
, "chapter", VLC_VAR_SETVALUE
, &val
, NULL
);
734 input_ControlPush( p_input
, INPUT_CONTROL_SET_SEEKPOINT
, &newval
);
740 static int NavigationCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
741 vlc_value_t oldval
, vlc_value_t newval
,
744 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
746 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
);
748 /* Issue a title change */
749 val
.i_int
= (intptr_t)p_data
;
750 input_ControlPush( p_input
, INPUT_CONTROL_SET_TITLE
, &val
);
752 var_Change( p_input
, "title", VLC_VAR_SETVALUE
, &val
, NULL
);
754 /* And a chapter change */
755 input_ControlPush( p_input
, INPUT_CONTROL_SET_SEEKPOINT
, &newval
);
757 var_Change( p_input
, "chapter", VLC_VAR_SETVALUE
, &newval
, NULL
);
762 static int EsVideoCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
763 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
765 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
766 VLC_UNUSED( psz_cmd
); VLC_UNUSED( oldval
); VLC_UNUSED( p_data
);
768 if( newval
.i_int
< 0 )
769 newval
.i_int
= -VIDEO_ES
; /* disable video es */
771 var_SetBool( p_input
, "video", true );
773 input_ControlPush( p_input
, INPUT_CONTROL_SET_ES
, &newval
);
778 static int EsAudioCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
779 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
781 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
782 VLC_UNUSED( psz_cmd
); VLC_UNUSED( oldval
); VLC_UNUSED( p_data
);
784 if( newval
.i_int
< 0 )
785 newval
.i_int
= -AUDIO_ES
; /* disable audio es */
787 var_SetBool( p_input
, "audio", true );
789 input_ControlPush( p_input
, INPUT_CONTROL_SET_ES
, &newval
);
794 static int EsSpuCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
795 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
797 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
798 VLC_UNUSED( psz_cmd
); VLC_UNUSED( oldval
); VLC_UNUSED( p_data
);
800 if( newval
.i_int
< 0 )
801 newval
.i_int
= -SPU_ES
; /* disable spu es */
803 var_SetBool( p_input
, "spu", true );
805 input_ControlPush( p_input
, INPUT_CONTROL_SET_ES
, &newval
);
810 static int EsDelayCallback ( vlc_object_t
*p_this
, char const *psz_cmd
,
811 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
813 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
814 VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
816 if( !strcmp( psz_cmd
, "audio-delay" ) )
818 input_ControlPush( p_input
, INPUT_CONTROL_SET_AUDIO_DELAY
, &newval
);
820 else if( !strcmp( psz_cmd
, "spu-delay" ) )
822 input_ControlPush( p_input
, INPUT_CONTROL_SET_SPU_DELAY
, &newval
);
827 static int BookmarkCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
828 vlc_value_t oldval
, vlc_value_t newval
,
831 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
832 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
834 input_ControlPush( p_input
, INPUT_CONTROL_SET_BOOKMARK
, &newval
);
839 static int RecordCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
840 vlc_value_t oldval
, vlc_value_t newval
,
843 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
844 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
846 input_ControlPush( p_input
, INPUT_CONTROL_SET_RECORD_STATE
, &newval
);
851 static int FrameNextCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
852 vlc_value_t oldval
, vlc_value_t newval
,
855 input_thread_t
*p_input
= (input_thread_t
*)p_this
;
856 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
); VLC_UNUSED(p_data
);
859 input_ControlPush( p_input
, INPUT_CONTROL_SET_FRAME_NEXT
, NULL
);