var.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:31k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * var.c: object variables for input thread
  3.  *****************************************************************************
  4.  * Copyright (C) 2004-2007 the VideoLAN team
  5.  * $Id: fcad8118d8ae7eade55d8418b008cf5a90e257fa $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  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 General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include "input_internal.h"
  33. /*****************************************************************************
  34.  * Callbacks
  35.  *****************************************************************************/
  36. static int StateCallback   ( vlc_object_t *p_this, char const *psz_cmd,
  37.                              vlc_value_t oldval, vlc_value_t newval, void * );
  38. static int RateCallback    ( vlc_object_t *p_this, char const *psz_cmd,
  39.                              vlc_value_t oldval, vlc_value_t newval, void * );
  40. static int PositionCallback( vlc_object_t *p_this, char const *psz_cmd,
  41.                              vlc_value_t oldval, vlc_value_t newval, void * );
  42. static int TimeCallback    ( vlc_object_t *p_this, char const *psz_cmd,
  43.                              vlc_value_t oldval, vlc_value_t newval, void * );
  44. static int ProgramCallback ( vlc_object_t *p_this, char const *psz_cmd,
  45.                              vlc_value_t oldval, vlc_value_t newval, void * );
  46. static int TitleCallback   ( vlc_object_t *p_this, char const *psz_cmd,
  47.                              vlc_value_t oldval, vlc_value_t newval, void * );
  48. static int SeekpointCallback( vlc_object_t *p_this, char const *psz_cmd,
  49.                              vlc_value_t oldval, vlc_value_t newval, void * );
  50. static int NavigationCallback( vlc_object_t *p_this, char const *psz_cmd,
  51.                              vlc_value_t oldval, vlc_value_t newval, void * );
  52. static int ESCallback      ( vlc_object_t *p_this, char const *psz_cmd,
  53.                              vlc_value_t oldval, vlc_value_t newval, void * );
  54. static int EsDelayCallback ( vlc_object_t *p_this, char const *psz_cmd,
  55.                              vlc_value_t oldval, vlc_value_t newval, void * );
  56. static int BookmarkCallback( vlc_object_t *p_this, char const *psz_cmd,
  57.                              vlc_value_t oldval, vlc_value_t newval, void * );
  58. static int RecordCallback( vlc_object_t *p_this, char const *psz_cmd,
  59.                            vlc_value_t oldval, vlc_value_t newval,
  60.                            void *p_data );
  61. static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd,
  62.                               vlc_value_t oldval, vlc_value_t newval,
  63.                               void *p_data );
  64. typedef struct
  65. {
  66.     const char *psz_name;
  67.     vlc_callback_t callback;
  68. } vlc_input_callback_t;
  69. static void InputAddCallbacks( input_thread_t *, const vlc_input_callback_t * );
  70. static void InputDelCallbacks( input_thread_t *, const vlc_input_callback_t * );
  71. #ifdef CALLBACK /* For windows */
  72. # undef CALLBACK /* We don't care of this one here */
  73. #endif
  74. /* List all callbacks added by input */
  75. #define CALLBACK(name,cb) { name, cb }
  76. static const vlc_input_callback_t p_input_callbacks[] =
  77. {
  78.     CALLBACK( "state", StateCallback ),
  79.     CALLBACK( "rate", RateCallback ),
  80.     CALLBACK( "rate-slower", RateCallback ),
  81.     CALLBACK( "rate-faster", RateCallback ),
  82.     CALLBACK( "position", PositionCallback ),
  83.     CALLBACK( "position-offset", PositionCallback ),
  84.     CALLBACK( "time", TimeCallback ),
  85.     CALLBACK( "time-offset", TimeCallback ),
  86.     CALLBACK( "bookmark", BookmarkCallback ),
  87.     CALLBACK( "program", ProgramCallback ),
  88.     CALLBACK( "title", TitleCallback ),
  89.     CALLBACK( "chapter", SeekpointCallback ),
  90.     CALLBACK( "audio-delay", EsDelayCallback ),
  91.     CALLBACK( "spu-delay", EsDelayCallback ),
  92.     CALLBACK( "video-es", ESCallback ),
  93.     CALLBACK( "audio-es", ESCallback ),
  94.     CALLBACK( "spu-es", ESCallback ),
  95.     CALLBACK( "record", RecordCallback ),
  96.     CALLBACK( "frame-next", FrameNextCallback ),
  97.     CALLBACK( NULL, NULL )
  98. };
  99. static const vlc_input_callback_t p_input_navigation_callbacks[] =
  100. {
  101.     CALLBACK( "next-title", TitleCallback ),
  102.     CALLBACK( "prev-title", TitleCallback ),
  103.     CALLBACK( NULL, NULL )
  104. };
  105. static const vlc_input_callback_t p_input_title_callbacks[] =
  106. {
  107.     CALLBACK( "next-chapter", SeekpointCallback ),
  108.     CALLBACK( "prev-chapter", SeekpointCallback ),
  109.     CALLBACK( NULL, NULL )
  110. };
  111. #undef CALLBACK
  112. /*****************************************************************************
  113.  * input_ControlVarInit:
  114.  *  Create all control object variables with their callbacks
  115.  *****************************************************************************/
  116. void input_ControlVarInit ( input_thread_t *p_input )
  117. {
  118.     vlc_value_t val, text;
  119.     /* State */
  120.     var_Create( p_input, "state", VLC_VAR_INTEGER );
  121.     val.i_int = p_input->p->i_state;
  122.     var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL );
  123.     /* Rate */
  124.     var_Create( p_input, "rate", VLC_VAR_INTEGER );
  125.     val.i_int = p_input->p->i_rate;
  126.     var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
  127.     var_Create( p_input, "rate-slower", VLC_VAR_VOID );
  128.     var_Create( p_input, "rate-faster", VLC_VAR_VOID );
  129.     var_Create( p_input, "frame-next", VLC_VAR_VOID );
  130.     /* Position */
  131.     var_Create( p_input, "position",  VLC_VAR_FLOAT );
  132.     var_Create( p_input, "position-offset",  VLC_VAR_FLOAT );
  133.     val.f_float = 0.0;
  134.     var_Change( p_input, "position", VLC_VAR_SETVALUE, &val, NULL );
  135.     /* Time */
  136.     var_Create( p_input, "time",  VLC_VAR_TIME );
  137.     var_Create( p_input, "time-offset",  VLC_VAR_TIME );    /* relative */
  138.     val.i_time = 0;
  139.     var_Change( p_input, "time", VLC_VAR_SETVALUE, &val, NULL );
  140.     /* Bookmark */
  141.     var_Create( p_input, "bookmark", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE |
  142.                 VLC_VAR_ISCOMMAND );
  143.     val.psz_string = _("Bookmark");
  144.     var_Change( p_input, "bookmark", VLC_VAR_SETTEXT, &val, NULL );
  145.     /* Program */
  146.     var_Create( p_input, "program", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE |
  147.                 VLC_VAR_DOINHERIT );
  148.     var_Get( p_input, "program", &val );
  149.     if( val.i_int <= 0 )
  150.         var_Change( p_input, "program", VLC_VAR_DELCHOICE, &val, NULL );
  151.     text.psz_string = _("Program");
  152.     var_Change( p_input, "program", VLC_VAR_SETTEXT, &text, NULL );
  153.     /* Programs */
  154.     var_Create( p_input, "programs", VLC_VAR_LIST | VLC_VAR_DOINHERIT );
  155.     text.psz_string = _("Programs");
  156.     var_Change( p_input, "programs", VLC_VAR_SETTEXT, &text, NULL );
  157.     /* Title */
  158.     var_Create( p_input, "title", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
  159.     text.psz_string = _("Title");
  160.     var_Change( p_input, "title", VLC_VAR_SETTEXT, &text, NULL );
  161.     /* Chapter */
  162.     var_Create( p_input, "chapter", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
  163.     text.psz_string = _("Chapter");
  164.     var_Change( p_input, "chapter", VLC_VAR_SETTEXT, &text, NULL );
  165.     /* Navigation The callback is added after */
  166.     var_Create( p_input, "navigation", VLC_VAR_VARIABLE | VLC_VAR_HASCHOICE );
  167.     text.psz_string = _("Navigation");
  168.     var_Change( p_input, "navigation", VLC_VAR_SETTEXT, &text, NULL );
  169.     /* Delay */
  170.     var_Create( p_input, "audio-delay", VLC_VAR_TIME );
  171.     val.i_time = INT64_C(1000) * var_GetInteger( p_input, "audio-desync" );
  172.     var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, &val, NULL );
  173.     var_Create( p_input, "spu-delay", VLC_VAR_TIME );
  174.     val.i_time = 0;
  175.     var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, &val, NULL );
  176.     /* Video ES */
  177.     var_Create( p_input, "video-es", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
  178.     text.psz_string = _("Video Track");
  179.     var_Change( p_input, "video-es", VLC_VAR_SETTEXT, &text, NULL );
  180.     /* Audio ES */
  181.     var_Create( p_input, "audio-es", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
  182.     text.psz_string = _("Audio Track");
  183.     var_Change( p_input, "audio-es", VLC_VAR_SETTEXT, &text, NULL );
  184.     /* Spu ES */
  185.     var_Create( p_input, "spu-es", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
  186.     text.psz_string = _("Subtitles Track");
  187.     var_Change( p_input, "spu-es", VLC_VAR_SETTEXT, &text, NULL );
  188.     /* Special read only objects variables for intf */
  189.     var_Create( p_input, "bookmarks", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  190.     var_Create( p_input, "length",  VLC_VAR_TIME );
  191.     val.i_time = 0;
  192.     var_Change( p_input, "length", VLC_VAR_SETVALUE, &val, NULL );
  193.     if( !p_input->b_preparsing )
  194.     {
  195.         /* Special "intf-event" variable. */
  196.         var_Create( p_input, "intf-event", VLC_VAR_INTEGER );
  197.     }
  198.     /* Add all callbacks
  199.      * XXX we put callback only in non preparsing mode. We need to create the variable
  200.      * unless someone want to check all var_Get/var_Change return value ... */
  201.     if( !p_input->b_preparsing )
  202.         InputAddCallbacks( p_input, p_input_callbacks );
  203. }
  204. /*****************************************************************************
  205.  * input_ControlVarStop:
  206.  *****************************************************************************/
  207. void input_ControlVarStop( input_thread_t *p_input )
  208. {
  209.     InputDelCallbacks( p_input, p_input_callbacks );
  210.     if( p_input->p->i_title > 0 )
  211.     {
  212.         char name[sizeof("title ") + 5 ];
  213.         int i;
  214.         InputDelCallbacks( p_input, p_input_navigation_callbacks );
  215.         InputDelCallbacks( p_input, p_input_title_callbacks );
  216.         for( i = 0; i < p_input->p->i_title; i++ )
  217.         {
  218.             snprintf( name, sizeof(name), "title %2i", i );
  219.             var_DelCallback( p_input, name, NavigationCallback, (void *)(intptr_t)i );
  220.         }
  221.     }
  222. }
  223. /*****************************************************************************
  224.  * input_ControlVarNavigation:
  225.  *  Create all remaining control object variables
  226.  *****************************************************************************/
  227. void input_ControlVarNavigation( input_thread_t *p_input )
  228. {
  229.     vlc_value_t val, text;
  230.     int  i;
  231.     /* Create more command variables */
  232.     if( p_input->p->i_title > 1 )
  233.     {
  234.         var_Create( p_input, "next-title", VLC_VAR_VOID );
  235.         text.psz_string = _("Next title");
  236.         var_Change( p_input, "next-title", VLC_VAR_SETTEXT, &text, NULL );
  237.         var_AddCallback( p_input, "next-title", TitleCallback, NULL );
  238.         var_Create( p_input, "prev-title", VLC_VAR_VOID );
  239.         text.psz_string = _("Previous title");
  240.         var_Change( p_input, "prev-title", VLC_VAR_SETTEXT, &text, NULL );
  241.         var_AddCallback( p_input, "prev-title", TitleCallback, NULL );
  242.     }
  243.     /* Create title and navigation */
  244.     val.psz_string = malloc( sizeof("title ") + 5 );
  245.     if( !val.psz_string )
  246.         return;
  247.     for( i = 0; i < p_input->p->i_title; i++ )
  248.     {
  249.         vlc_value_t val2, text2;
  250.         int j;
  251.         /* Add Navigation entries */
  252.         sprintf( val.psz_string,  "title %2i", i );
  253.         var_Destroy( p_input, val.psz_string );
  254.         var_Create( p_input, val.psz_string,
  255.                     VLC_VAR_INTEGER|VLC_VAR_HASCHOICE|VLC_VAR_ISCOMMAND );
  256.         var_AddCallback( p_input, val.psz_string,
  257.                          NavigationCallback, (void *)(intptr_t)i );
  258.         if( p_input->p->title[i]->psz_name == NULL ||
  259.             *p_input->p->title[i]->psz_name == '' )
  260.         {
  261.             if( asprintf( &text.psz_string, _("Title %i"),
  262.                       i + p_input->p->i_title_offset ) == -1 )
  263.                 continue;
  264.         }
  265.         else
  266.         {
  267.             text.psz_string = strdup( p_input->p->title[i]->psz_name );
  268.         }
  269.         var_Change( p_input, "navigation", VLC_VAR_ADDCHOICE, &val, &text );
  270.         /* Add title choice */
  271.         val2.i_int = i;
  272.         var_Change( p_input, "title", VLC_VAR_ADDCHOICE, &val2, &text );
  273.         free( text.psz_string );
  274.         for( j = 0; j < p_input->p->title[i]->i_seekpoint; j++ )
  275.         {
  276.             val2.i_int = j;
  277.             if( p_input->p->title[i]->seekpoint[j]->psz_name == NULL ||
  278.                 *p_input->p->title[i]->seekpoint[j]->psz_name == '' )
  279.             {
  280.                 /* Default value */
  281.                 if( asprintf( &text2.psz_string, _("Chapter %i"),
  282.                           j + p_input->p->i_seekpoint_offset ) == -1 )
  283.                     continue;
  284.             }
  285.             else
  286.             {
  287.                 text2.psz_string =
  288.                     strdup( p_input->p->title[i]->seekpoint[j]->psz_name );
  289.             }
  290.             var_Change( p_input, val.psz_string, VLC_VAR_ADDCHOICE,
  291.                         &val2, &text2 );
  292.             free( text2.psz_string );
  293.         }
  294.     }
  295.     free( val.psz_string );
  296. }
  297. /*****************************************************************************
  298.  * input_ControlVarTitle:
  299.  *  Create all variables for a title
  300.  *****************************************************************************/
  301. void input_ControlVarTitle( input_thread_t *p_input, int i_title )
  302. {
  303.     input_title_t *t = p_input->p->title[i_title];
  304.     vlc_value_t val, text;
  305.     int  i;
  306.     /* Create/Destroy command variables */
  307.     if( t->i_seekpoint <= 1 )
  308.     {
  309.         var_Destroy( p_input, "next-chapter" );
  310.         var_Destroy( p_input, "prev-chapter" );
  311.     }
  312.     else if( var_Get( p_input, "next-chapter", &val ) != VLC_SUCCESS )
  313.     {
  314.         var_Create( p_input, "next-chapter", VLC_VAR_VOID );
  315.         text.psz_string = _("Next chapter");
  316.         var_Change( p_input, "next-chapter", VLC_VAR_SETTEXT, &text, NULL );
  317.         var_AddCallback( p_input, "next-chapter", SeekpointCallback, NULL );
  318.         var_Create( p_input, "prev-chapter", VLC_VAR_VOID );
  319.         text.psz_string = _("Previous chapter");
  320.         var_Change( p_input, "prev-chapter", VLC_VAR_SETTEXT, &text, NULL );
  321.         var_AddCallback( p_input, "prev-chapter", SeekpointCallback, NULL );
  322.     }
  323.     /* Build chapter list */
  324.     var_Change( p_input, "chapter", VLC_VAR_CLEARCHOICES, NULL, NULL );
  325.     for( i = 0; i <  t->i_seekpoint; i++ )
  326.     {
  327.         val.i_int = i;
  328.         if( t->seekpoint[i]->psz_name == NULL ||
  329.             *t->seekpoint[i]->psz_name == '' )
  330.         {
  331.             /* Default value */
  332.             if( asprintf( &text.psz_string, _("Chapter %i"),
  333.                       i + p_input->p->i_seekpoint_offset ) == -1 )
  334.                 continue;
  335.         }
  336.         else
  337.         {
  338.             text.psz_string = strdup( t->seekpoint[i]->psz_name );
  339.         }
  340.         var_Change( p_input, "chapter", VLC_VAR_ADDCHOICE, &val, &text );
  341.         free( text.psz_string );
  342.     }
  343. }
  344. /*****************************************************************************
  345.  * input_ConfigVarInit:
  346.  *  Create all config object variables
  347.  *****************************************************************************/
  348. void input_ConfigVarInit ( input_thread_t *p_input )
  349. {
  350.     /* Create Object Variables for private use only */
  351.     if( !p_input->b_preparsing )
  352.     {
  353.         var_Create( p_input, "video", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  354.         var_Create( p_input, "audio", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  355.         var_Create( p_input, "spu", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  356.         var_Create( p_input, "audio-track", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
  357.         var_Create( p_input, "sub-track", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
  358.         var_Create( p_input, "audio-language",
  359.                     VLC_VAR_STRING|VLC_VAR_DOINHERIT );
  360.         var_Create( p_input, "sub-language",
  361.                     VLC_VAR_STRING|VLC_VAR_DOINHERIT );
  362.         var_Create( p_input, "audio-track-id",
  363.                     VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
  364.         var_Create( p_input, "sub-track-id",
  365.                     VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
  366.         var_Create( p_input, "sub-file", VLC_VAR_FILE | VLC_VAR_DOINHERIT );
  367.         var_Create( p_input, "sub-autodetect-file", VLC_VAR_BOOL |
  368.                     VLC_VAR_DOINHERIT );
  369.         var_Create( p_input, "sub-autodetect-path", VLC_VAR_STRING |
  370.                     VLC_VAR_DOINHERIT );
  371.         var_Create( p_input, "sub-autodetect-fuzzy", VLC_VAR_INTEGER |
  372.                     VLC_VAR_DOINHERIT );
  373.         var_Create( p_input, "sout", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  374.         var_Create( p_input, "sout-all",   VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  375.         var_Create( p_input, "sout-audio", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  376.         var_Create( p_input, "sout-video", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  377.         var_Create( p_input, "sout-spu", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  378.         var_Create( p_input, "sout-keep",  VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  379.         var_Create( p_input, "input-repeat",
  380.                     VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
  381.         var_Create( p_input, "start-time", VLC_VAR_FLOAT|VLC_VAR_DOINHERIT );
  382.         var_Create( p_input, "stop-time", VLC_VAR_FLOAT|VLC_VAR_DOINHERIT );
  383.         var_Create( p_input, "run-time", VLC_VAR_FLOAT|VLC_VAR_DOINHERIT );
  384.         var_Create( p_input, "input-fast-seek", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
  385.         var_Create( p_input, "input-slave",
  386.                     VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  387.         var_Create( p_input, "audio-desync",
  388.                     VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  389.         var_Create( p_input, "cr-average",
  390.                     VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  391.         var_Create( p_input, "clock-synchro",
  392.                     VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
  393.     }
  394.     var_Create( p_input, "can-seek", VLC_VAR_BOOL );
  395.     var_SetBool( p_input, "can-seek", true ); /* Fixed later*/
  396.     var_Create( p_input, "can-pause", VLC_VAR_BOOL );
  397.     var_SetBool( p_input, "can-pause", true ); /* Fixed later*/
  398.     var_Create( p_input, "can-rate", VLC_VAR_BOOL );
  399.     var_SetBool( p_input, "can-rate", false );
  400.     var_Create( p_input, "can-rewind", VLC_VAR_BOOL );
  401.     var_SetBool( p_input, "can-rewind", false );
  402.     var_Create( p_input, "can-record", VLC_VAR_BOOL );
  403.     var_SetBool( p_input, "can-record", false ); /* Fixed later*/
  404.     var_Create( p_input, "record", VLC_VAR_BOOL );
  405.     var_SetBool( p_input, "record", false );
  406.     var_Create( p_input, "teletext-es", VLC_VAR_INTEGER );
  407.     var_SetInteger( p_input, "teletext-es", -1 );
  408.     var_Create( p_input, "signal-quality", VLC_VAR_FLOAT );
  409.     var_SetFloat( p_input, "signal-quality", -1 );
  410.     var_Create( p_input, "signal-strength", VLC_VAR_FLOAT );
  411.     var_SetFloat( p_input, "signal-strength", -1 );
  412.     var_Create( p_input, "program-scrambled", VLC_VAR_BOOL );
  413.     var_SetBool( p_input, "program-scrambled", false );
  414.     var_Create( p_input, "cache", VLC_VAR_FLOAT );
  415.     var_SetFloat( p_input, "cache", 0.0 );
  416.     /* */
  417.     var_Create( p_input, "input-record-native", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  418.     /* */
  419.     var_Create( p_input, "access", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  420.     var_Create( p_input, "demux", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  421.     var_Create( p_input, "stream-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  422.     /* Meta */
  423.     var_Create( p_input, "meta-title", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  424.     var_Create( p_input, "meta-author", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  425.     var_Create( p_input, "meta-artist", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  426.     var_Create( p_input, "meta-genre", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  427.     var_Create( p_input, "meta-copyright", VLC_VAR_STRING | VLC_VAR_DOINHERIT);
  428.     var_Create( p_input, "meta-description", VLC_VAR_STRING|VLC_VAR_DOINHERIT);
  429.     var_Create( p_input, "meta-date", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  430.     var_Create( p_input, "meta-url", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
  431. }
  432. /*****************************************************************************
  433.  * Callbacks managements:
  434.  *****************************************************************************/
  435. static void InputAddCallbacks( input_thread_t *p_input,
  436.                                const vlc_input_callback_t *p_callbacks )
  437. {
  438.     int i;
  439.     for( i = 0; p_callbacks[i].psz_name != NULL; i++ )
  440.         var_AddCallback( p_input,
  441.                          p_callbacks[i].psz_name,
  442.                          p_callbacks[i].callback, NULL );
  443. }
  444. static void InputDelCallbacks( input_thread_t *p_input,
  445.                                const vlc_input_callback_t *p_callbacks )
  446. {
  447.     int i;
  448.     for( i = 0; p_callbacks[i].psz_name != NULL; i++ )
  449.         var_DelCallback( p_input,
  450.                          p_callbacks[i].psz_name,
  451.                          p_callbacks[i].callback, NULL );
  452. }
  453. /*****************************************************************************
  454.  * All Callbacks:
  455.  *****************************************************************************/
  456. static int StateCallback( vlc_object_t *p_this, char const *psz_cmd,
  457.                           vlc_value_t oldval, vlc_value_t newval,
  458.                           void *p_data )
  459. {
  460.     input_thread_t *p_input = (input_thread_t*)p_this;
  461.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  462.     if( newval.i_int == PLAYING_S || newval.i_int == PAUSE_S )
  463.     {
  464.         input_ControlPush( p_input, INPUT_CONTROL_SET_STATE, &newval );
  465.         return VLC_SUCCESS;
  466.     }
  467.     return VLC_EGENERIC;
  468. }
  469. static int RateCallback( vlc_object_t *p_this, char const *psz_cmd,
  470.                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
  471. {
  472.     input_thread_t *p_input = (input_thread_t*)p_this;
  473.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  474.     /* Problem with this way: the "rate" variable is update after the input thread do the change */
  475.     if( !strcmp( psz_cmd, "rate-slower" ) )
  476.     {
  477.         input_ControlPush( p_input, INPUT_CONTROL_SET_RATE_SLOWER, NULL );
  478.     }
  479.     else if( !strcmp( psz_cmd, "rate-faster" ) )
  480.     {
  481.         input_ControlPush( p_input, INPUT_CONTROL_SET_RATE_FASTER, NULL );
  482.     }
  483.     else
  484.     {
  485.         input_ControlPush( p_input, INPUT_CONTROL_SET_RATE, &newval );
  486.     }
  487.     return VLC_SUCCESS;
  488. }
  489. static int PositionCallback( vlc_object_t *p_this, char const *psz_cmd,
  490.                              vlc_value_t oldval, vlc_value_t newval,
  491.                              void *p_data )
  492. {
  493.     input_thread_t *p_input = (input_thread_t*)p_this;
  494.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  495.     if( !strcmp( psz_cmd, "position-offset" ) )
  496.     {
  497.         float f_position = var_GetFloat( p_input, "position" ) + newval.f_float;
  498.         if( f_position < 0.0 )
  499.             f_position = 0.0;
  500.         else if( f_position > 1.0 )
  501.             f_position = 1.0;
  502.         var_SetFloat( p_this, "position", f_position );
  503.     }
  504.     else
  505.     {
  506.         /* Update "length" for better intf behavour */
  507.         const mtime_t i_length = var_GetTime( p_input, "length" );
  508.         if( i_length > 0 && newval.f_float >= 0.0 && newval.f_float <= 1.0 )
  509.         {
  510.             vlc_value_t val;
  511.             val.i_time = i_length * newval.f_float;
  512.             var_Change( p_input, "time", VLC_VAR_SETVALUE, &val, NULL );
  513.         }
  514.         /* */
  515.         input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &newval );
  516.     }
  517.     return VLC_SUCCESS;
  518. }
  519. static int TimeCallback( vlc_object_t *p_this, char const *psz_cmd,
  520.                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
  521. {
  522.     input_thread_t *p_input = (input_thread_t*)p_this;
  523.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  524.     if( !strcmp( psz_cmd, "time-offset" ) )
  525.     {
  526.         mtime_t i_time = var_GetTime( p_input, "time" ) + newval.i_time;
  527.         if( i_time < 0 )
  528.             i_time = 0;
  529.         var_SetTime( p_this, "time", i_time );
  530.     }
  531.     else
  532.     {
  533.         /* Update "position" for better intf behavour */
  534.         const mtime_t i_length = var_GetTime( p_input, "length" );
  535.         if( i_length > 0 && newval.i_time >= 0 && newval.i_time <= i_length )
  536.         {
  537.             vlc_value_t val;
  538.             val.f_float = (double)newval.i_time/(double)i_length;
  539.             var_Change( p_input, "position", VLC_VAR_SETVALUE, &val, NULL );
  540.         }
  541.         /* */
  542.         input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &newval );
  543.     }
  544.     return VLC_SUCCESS;
  545. }
  546. static int ProgramCallback( vlc_object_t *p_this, char const *psz_cmd,
  547.                             vlc_value_t oldval, vlc_value_t newval,
  548.                             void *p_data )
  549. {
  550.     input_thread_t *p_input = (input_thread_t*)p_this;
  551.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  552.     input_ControlPush( p_input, INPUT_CONTROL_SET_PROGRAM, &newval );
  553.     return VLC_SUCCESS;
  554. }
  555. static int TitleCallback( vlc_object_t *p_this, char const *psz_cmd,
  556.                           vlc_value_t oldval, vlc_value_t newval,
  557.                           void *p_data )
  558. {
  559.     input_thread_t *p_input = (input_thread_t*)p_this;
  560.     vlc_value_t val, count;
  561.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  562.     if( !strcmp( psz_cmd, "next-title" ) )
  563.     {
  564.         input_ControlPush( p_input, INPUT_CONTROL_SET_TITLE_NEXT, NULL );
  565.         val.i_int = var_GetInteger( p_input, "title" ) + 1;
  566.         var_Change( p_input, "title", VLC_VAR_CHOICESCOUNT, &count, NULL );
  567.         if( val.i_int < count.i_int )
  568.             var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );
  569.     }
  570.     else if( !strcmp( psz_cmd, "prev-title" ) )
  571.     {
  572.         input_ControlPush( p_input, INPUT_CONTROL_SET_TITLE_PREV, NULL );
  573.         val.i_int = var_GetInteger( p_input, "title" ) - 1;
  574.         if( val.i_int >= 0 )
  575.             var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );
  576.     }
  577.     else
  578.     {
  579.         input_ControlPush( p_input, INPUT_CONTROL_SET_TITLE, &newval );
  580.     }
  581.     return VLC_SUCCESS;
  582. }
  583. static int SeekpointCallback( vlc_object_t *p_this, char const *psz_cmd,
  584.                               vlc_value_t oldval, vlc_value_t newval,
  585.                               void *p_data )
  586. {
  587.     input_thread_t *p_input = (input_thread_t*)p_this;
  588.     vlc_value_t val, count;
  589.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  590.     if( !strcmp( psz_cmd, "next-chapter" ) )
  591.     {
  592.         input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT_NEXT, NULL );
  593.         val.i_int = var_GetInteger( p_input, "chapter" ) + 1;
  594.         var_Change( p_input, "chapter", VLC_VAR_CHOICESCOUNT, &count, NULL );
  595.         if( val.i_int < count.i_int )
  596.             var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );
  597.     }
  598.     else if( !strcmp( psz_cmd, "prev-chapter" ) )
  599.     {
  600.         input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT_PREV, NULL );
  601.         val.i_int = var_GetInteger( p_input, "chapter" ) - 1;
  602.         if( val.i_int >= 0 )
  603.             var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );
  604.     }
  605.     else
  606.     {
  607.         input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT, &newval );
  608.         val.i_int = newval.i_int;
  609.     }
  610.     /* Actualize "title %2i" variable */
  611.     if( val.i_int >= 0 && val.i_int < count.i_int )
  612.     {
  613.         int i_title = var_GetInteger( p_input, "title" );
  614.         char psz_titlevar[10] = {0};
  615.         snprintf( psz_titlevar, 10, "title %2i", i_title );
  616.         var_Change( p_input, psz_titlevar, VLC_VAR_SETVALUE, &val, NULL );
  617.     }
  618.     return VLC_SUCCESS;
  619. }
  620. static int NavigationCallback( vlc_object_t *p_this, char const *psz_cmd,
  621.                                vlc_value_t oldval, vlc_value_t newval,
  622.                                void *p_data )
  623. {
  624.     input_thread_t *p_input = (input_thread_t*)p_this;
  625.     vlc_value_t     val;
  626.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
  627.     /* Issue a title change */
  628.     val.i_int = (intptr_t)p_data;
  629.     input_ControlPush( p_input, INPUT_CONTROL_SET_TITLE, &val );
  630.     var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );
  631.     /* And a chapter change */
  632.     input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT, &newval );
  633.     var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &newval, NULL );
  634.     return VLC_SUCCESS;
  635. }
  636. static int ESCallback( vlc_object_t *p_this, char const *psz_cmd,
  637.                        vlc_value_t oldval, vlc_value_t newval, void *p_data )
  638. {
  639.     input_thread_t *p_input = (input_thread_t*)p_this;
  640.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  641.     if( newval.i_int < 0 )
  642.     {
  643.         vlc_value_t v;
  644.         /* Hack */
  645.         if( !strcmp( psz_cmd, "audio-es" ) )
  646.             v.i_int = -AUDIO_ES;
  647.         else if( !strcmp( psz_cmd, "video-es" ) )
  648.             v.i_int = -VIDEO_ES;
  649.         else if( !strcmp( psz_cmd, "spu-es" ) )
  650.             v.i_int = -SPU_ES;
  651.         else
  652.             v.i_int = 0;
  653.         if( v.i_int != 0 )
  654.             input_ControlPush( p_input, INPUT_CONTROL_SET_ES, &v );
  655.     }
  656.     else
  657.     {
  658.         input_ControlPush( p_input, INPUT_CONTROL_SET_ES, &newval );
  659.     }
  660.     return VLC_SUCCESS;
  661. }
  662. static int EsDelayCallback ( vlc_object_t *p_this, char const *psz_cmd,
  663.                              vlc_value_t oldval, vlc_value_t newval, void *p_data )
  664. {
  665.     input_thread_t *p_input = (input_thread_t*)p_this;
  666.     VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  667.     if( !strcmp( psz_cmd, "audio-delay" ) )
  668.     {
  669.         input_ControlPush( p_input, INPUT_CONTROL_SET_AUDIO_DELAY, &newval );
  670.     }
  671.     else if( !strcmp( psz_cmd, "spu-delay" ) )
  672.     {
  673.         input_ControlPush( p_input, INPUT_CONTROL_SET_SPU_DELAY, &newval );
  674.     }
  675.     return VLC_SUCCESS;
  676. }
  677. static int BookmarkCallback( vlc_object_t *p_this, char const *psz_cmd,
  678.                              vlc_value_t oldval, vlc_value_t newval,
  679.                              void *p_data )
  680. {
  681.     input_thread_t *p_input = (input_thread_t*)p_this;
  682.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  683.     input_ControlPush( p_input, INPUT_CONTROL_SET_BOOKMARK, &newval );
  684.     return VLC_SUCCESS;
  685. }
  686. static int RecordCallback( vlc_object_t *p_this, char const *psz_cmd,
  687.                            vlc_value_t oldval, vlc_value_t newval,
  688.                            void *p_data )
  689. {
  690.     input_thread_t *p_input = (input_thread_t*)p_this;
  691.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  692.     input_ControlPush( p_input, INPUT_CONTROL_SET_RECORD_STATE, &newval );
  693.     return VLC_SUCCESS;
  694. }
  695. static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd,
  696.                               vlc_value_t oldval, vlc_value_t newval,
  697.                               void *p_data )
  698. {
  699.     input_thread_t *p_input = (input_thread_t*)p_this;
  700.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
  701.     VLC_UNUSED(newval);
  702.     input_ControlPush( p_input, INPUT_CONTROL_SET_FRAME_NEXT, NULL );
  703.     return VLC_SUCCESS;
  704. }