+ case INPUT_GET_POSITION:
+ pf = (double*)va_arg( args, double * );
+ *pf = var_GetFloat( p_input, "position" );
+ return VLC_SUCCESS;
+
+ case INPUT_SET_POSITION:
+ f = (double)va_arg( args, double );
+ return var_SetFloat( p_input, "position", f );
+
+ case INPUT_GET_LENGTH:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = var_GetTime( p_input, "length" );
+ return VLC_SUCCESS;
+
+ case INPUT_GET_TIME:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = var_GetTime( p_input, "time" );
+ return VLC_SUCCESS;
+
+ case INPUT_SET_TIME:
+ i_64 = (int64_t)va_arg( args, int64_t );
+ return var_SetTime( p_input, "time", i_64 );
+
+ case INPUT_GET_RATE:
+ pi_int = (int*)va_arg( args, int * );
+ *pi_int = INPUT_RATE_DEFAULT / var_GetFloat( p_input, "rate" );
+ return VLC_SUCCESS;
+
+ case INPUT_SET_RATE:
+ i_int = (int)va_arg( args, int );
+ return var_SetFloat( p_input, "rate",
+ (float)INPUT_RATE_DEFAULT / (float)i_int );
+
+ case INPUT_GET_STATE:
+ pi_int = (int*)va_arg( args, int * );
+ *pi_int = var_GetInteger( p_input, "state" );
+ return VLC_SUCCESS;
+
+ case INPUT_SET_STATE:
+ i_int = (int)va_arg( args, int );
+ return var_SetInteger( p_input, "state", i_int );
+
+ case INPUT_GET_AUDIO_DELAY:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = var_GetTime( p_input, "audio-delay" );
+ return VLC_SUCCESS;
+
+ case INPUT_GET_SPU_DELAY:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = var_GetTime( p_input, "spu-delay" );
+ return VLC_SUCCESS;
+
+ case INPUT_SET_AUDIO_DELAY:
+ i_64 = (int64_t)va_arg( args, int64_t );
+ return var_SetTime( p_input, "audio-delay", i_64 );
+
+ case INPUT_SET_SPU_DELAY:
+ i_64 = (int64_t)va_arg( args, int64_t );
+ return var_SetTime( p_input, "spu-delay", i_64 );
+
+ case INPUT_ADD_INFO:
+ {
+ char *psz_cat = (char *)va_arg( args, char * );
+ char *psz_name = (char *)va_arg( args, char * );
+ char *psz_format = (char *)va_arg( args, char * );
+
+ char *psz_value;
+
+ if( vasprintf( &psz_value, psz_format, args ) == -1 )
+ return VLC_EGENERIC;
+
+ int i_ret = input_item_AddInfo( p_input->p->p_item,
+ psz_cat, psz_name, "%s", psz_value );
+ free( psz_value );
+
+ if( !p_input->b_preparsing && !i_ret )
+ input_SendEventMetaInfo( p_input );
+ return i_ret;
+ }
+ case INPUT_REPLACE_INFOS:
+ case INPUT_MERGE_INFOS:
+ {
+ info_category_t *p_cat = va_arg( args, info_category_t * );
+
+ if( i_query == INPUT_REPLACE_INFOS )
+ input_item_ReplaceInfos( p_input->p->p_item, p_cat );
+ else
+ input_item_MergeInfos( p_input->p->p_item, p_cat );
+
+ if( !p_input->b_preparsing )
+ input_SendEventMetaInfo( p_input );
+ return VLC_SUCCESS;
+ }
+ case INPUT_DEL_INFO:
+ {
+ char *psz_cat = (char *)va_arg( args, char * );
+ char *psz_name = (char *)va_arg( args, char * );
+
+ int i_ret = input_item_DelInfo( p_input->p->p_item,
+ psz_cat, psz_name );
+
+ if( !p_input->b_preparsing && !i_ret )
+ input_SendEventMetaInfo( p_input );
+ return i_ret;
+ }
+ case INPUT_GET_INFO:
+ {
+ char *psz_cat = (char *)va_arg( args, char * );
+ char *psz_name = (char *)va_arg( args, char * );
+ char **ppsz_value = (char **)va_arg( args, char ** );
+ int i_ret = VLC_EGENERIC;
+ *ppsz_value = NULL;
+
+ *ppsz_value = input_item_GetInfo( p_input->p->p_item,
+ psz_cat, psz_name );
+ return i_ret;
+ }
+
+ case INPUT_SET_NAME:
+ {
+ char *psz_name = (char *)va_arg( args, char * );
+
+ if( !psz_name ) return VLC_EGENERIC;
+
+ input_item_SetName( p_input->p->p_item, psz_name );
+
+ if( !p_input->b_preparsing )
+ input_SendEventMetaName( p_input, psz_name );
+ return VLC_SUCCESS;
+ }
+