vlc_value_t oldval, vlc_value_t newval,
void * p_userdata );
static int
-input_position_changed( vlc_object_t * p_this, char const * psz_cmd,
- vlc_value_t oldval, vlc_value_t newval,
- void * p_userdata );
-static int
-input_time_changed( vlc_object_t * p_this, char const * psz_cmd,
+input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata );
[PLAYING_S] = libvlc_Playing,
[PAUSE_S] = libvlc_Paused,
[STOP_S] = libvlc_Stopped,
- [FORWARD_S] = libvlc_Forward,
- [BACKWARD_S] = libvlc_Backward,
[END_S] = libvlc_Ended,
[ERROR_S] = libvlc_Error,
};
vlc_event_detach( p_em, vlc_InputStateChanged, input_state_changed, p_mi );
var_DelCallback( p_input_thread, "seekable", input_seekable_changed, p_mi );
var_DelCallback( p_input_thread, "pausable", input_pausable_changed, p_mi );
- var_DelCallback( p_input_thread, "intf-change", input_position_changed, p_mi );
- var_DelCallback( p_input_thread, "intf-change", input_time_changed, p_mi );
+ var_DelCallback( p_input_thread, "intf-event", input_event_changed, p_mi );
/* We owned this one */
input_StopThread( p_input_thread );
libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, NULL);
forwarded_event.type = libvlc_MediaPlayerStopped;
break;
- case FORWARD_S:
- libvlc_media_set_state( p_mi->p_md, libvlc_Forward, NULL);
- forwarded_event.type = libvlc_MediaPlayerForward;
- break;
- case BACKWARD_S:
- libvlc_media_set_state( p_mi->p_md, libvlc_Backward, NULL);
- forwarded_event.type = libvlc_MediaPlayerBackward;
- break;
case END_S:
libvlc_media_set_state( p_mi->p_md, libvlc_Ended, NULL);
forwarded_event.type = libvlc_MediaPlayerEndReached;
return VLC_SUCCESS;
}
-/*
- * input_position_changed (Private) (input var "intf-change" Callback)
- */
static int
-input_position_changed( vlc_object_t * p_this, char const * psz_cmd,
+input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata )
{
VLC_UNUSED(oldval);
+ input_thread_t * p_input = (input_thread_t *)p_this;
libvlc_media_player_t * p_mi = p_userdata;
- vlc_value_t val;
+ libvlc_event_t event;
- if (!strncmp(psz_cmd, "intf", 4 /* "-change" no need to go further */))
- {
- input_thread_t * p_input = (input_thread_t *)p_this;
+ if( newval.i_int != INPUT_EVENT_TIMES )
+ return VLC_EGENERIC;
- var_Get( p_input, "state", &val );
- if( val.i_int != PLAYING_S )
- return VLC_SUCCESS; /* Don't send the position while stopped */
+ assert( !strcmp(psz_cmd, "intf-event" ) );
- var_Get( p_input, "position", &val );
- }
- else
- val.i_time = newval.i_time;
+ if( var_GetInteger( p_input, "state" ) != PLAYING_S )
+ return VLC_SUCCESS; /* Don't send the position while stopped */
- libvlc_event_t event;
+ /* */
event.type = libvlc_MediaPlayerPositionChanged;
- event.u.media_player_position_changed.new_position = val.f_float;
-
+ event.u.media_player_position_changed.new_position = var_GetFloat( p_input, "position" );;
libvlc_event_send( p_mi->p_event_manager, &event );
- return VLC_SUCCESS;
-}
-
-/*
- * input_time_changed (Private) (input var "intf-change" Callback)
- */
-static int
-input_time_changed( vlc_object_t * p_this, char const * psz_cmd,
- vlc_value_t oldval, vlc_value_t newval,
- void * p_userdata )
-{
- VLC_UNUSED(oldval);
- libvlc_media_player_t * p_mi = p_userdata;
- vlc_value_t val;
-
- if (!strncmp(psz_cmd, "intf", 4 /* "-change" no need to go further */))
- {
- input_thread_t * p_input = (input_thread_t *)p_this;
-
- var_Get( p_input, "state", &val );
- if( val.i_int != PLAYING_S )
- return VLC_SUCCESS; /* Don't send the position while stopped */
- var_Get( p_input, "time", &val );
- }
- else
- val.i_time = newval.i_time;
-
- libvlc_event_t event;
+ /* */
event.type = libvlc_MediaPlayerTimeChanged;
- event.u.media_player_time_changed.new_time = val.i_time;
+ event.u.media_player_time_changed.new_time = var_GetTime( p_input, "time" );
libvlc_event_send( p_mi->p_event_manager, &event );
+
return VLC_SUCCESS;
+
}
+
/**************************************************************************
* Create a Media Instance object
**************************************************************************/
var_AddCallback( p_input_thread, "seekable", input_seekable_changed, p_mi );
var_AddCallback( p_input_thread, "pausable", input_pausable_changed, p_mi );
- var_AddCallback( p_input_thread, "intf-change", input_position_changed, p_mi );
- var_AddCallback( p_input_thread, "intf-change", input_time_changed, p_mi );
+ var_AddCallback( p_input_thread, "intf-event", input_event_changed, p_mi );
vlc_mutex_unlock( &p_mi->object_lock );
}
{
input_thread_t *p_input_thread;
vlc_value_t val;
+ bool b_can_rewind;
- if( rate <= 0 )
+ if( rate != 0 )
RAISEVOID( "Rate value is invalid" );
- val.i_int = 1000.0f/rate;
-
p_input_thread = libvlc_get_input_thread ( p_mi, p_e);
- if ( !p_input_thread )
+ if( !p_input_thread )
+ return;
+
+ b_can_rewind = var_GetBool( p_input_thread, "can-rewind" );
+ if( (rate < 0) && !b_can_rewind )
+ {
+ vlc_object_release( p_input_thread );
+ libvlc_exception_raise( p_e, "Rate value is invalid" );
return;
+ }
+ val.i_int = 1000.0f/rate;
var_Set( p_input_thread, "rate", val );
vlc_object_release( p_input_thread );
}
{
input_thread_t *p_input_thread;
vlc_value_t val;
+ bool b_can_rewind;
- p_input_thread = libvlc_get_input_thread ( p_mi, p_e);
- if ( !p_input_thread )
- return -1.0;
+ p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
+ if( !p_input_thread )
+ return 0.0; /* rate < 0 indicates rewind */
var_Get( p_input_thread, "rate", &val );
+ b_can_rewind = var_GetBool( p_input_thread, "can-rewind" );
+ if( (val.i_int < 0) && !b_can_rewind )
+ {
+ libvlc_exception_raise( p_e, "invalid rate" );
+ return 0.0;
+ }
vlc_object_release( p_input_thread );
return (float)1000.0f/val.i_int;
return val.b_bool;
}
+/* internal function, used by audio, video */
+libvlc_track_description_t *
+ libvlc_get_track_description( libvlc_media_player_t *p_mi,
+ const char *psz_variable,
+ libvlc_exception_t *p_e )
+{
+ input_thread_t *p_input = libvlc_get_input_thread( p_mi, p_e );
+
+ if( !p_input )
+ return NULL;
+
+ vlc_value_t val_list, text_list;
+ var_Change( p_input, psz_variable, VLC_VAR_GETLIST, &val_list, &text_list);
+
+ if( val_list.p_list->i_count <= 0 ) /* no tracks */
+ return NULL;
+
+ libvlc_track_description_t *p_track_description, *p_actual, *p_previous;
+ p_track_description = ( libvlc_track_description_t * )
+ malloc( sizeof( libvlc_track_description_t ) );
+ if ( !p_track_description )
+ {
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+ libvlc_exception_raise( p_e, "no enough memory" );
+ return NULL;
+ }
+ p_actual = p_track_description;
+ p_previous = NULL;
+ for( int i = 0; i < val_list.p_list->i_count; i++ )
+ {
+ if( !p_actual )
+ {
+ p_actual = ( libvlc_track_description_t * )
+ malloc( sizeof( libvlc_track_description_t ) );
+ if ( !p_actual )
+ {
+ libvlc_track_description_release( p_track_description );
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+ libvlc_exception_raise( p_e, "no enough memory" );
+ return NULL;
+ }
+ }
+ p_actual->i_id = val_list.p_list->p_values[i].i_int;
+ p_actual->psz_name = strdup( text_list.p_list->p_values[i].psz_string );
+ p_actual->p_next = NULL;
+ if( p_previous )
+ p_previous->p_next = p_actual;
+ p_previous = p_actual;
+ p_actual = NULL;
+ }
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+
+ return p_track_description;
+}
+
+void libvlc_track_description_release( libvlc_track_description_t *p_track_description )
+{
+ libvlc_track_description_t *p_actual, *p_before;
+ p_actual = p_track_description;
+
+ while ( p_actual )
+ {
+ free( p_actual->psz_name );
+ p_before = p_actual;
+ p_actual = p_before->p_next;
+ free( p_before );
+ }
+}
+
int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{