From: Pierre d'Herbemont Date: Wed, 27 Feb 2008 23:45:10 +0000 (+0000) Subject: control/media_instance.c: Avoid multiple libvlc_MediaInstanceReachedEnd, by providing... X-Git-Tag: 0.9.0-test0~2448 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=292040d665436ab386d01cd6f7e33c02d29fcd14;p=vlc control/media_instance.c: Avoid multiple libvlc_MediaInstanceReachedEnd, by providing different events for pausable and seekable state changes. (Thanks to Jacques Boileau). --- diff --git a/include/vlc/libvlc_structures.h b/include/vlc/libvlc_structures.h index 36ee04b5e1..067f1b8077 100644 --- a/include/vlc/libvlc_structures.h +++ b/include/vlc/libvlc_structures.h @@ -321,6 +321,8 @@ typedef enum libvlc_event_type_t { libvlc_MediaInstanceEncounteredError, libvlc_MediaInstanceTimeChanged, libvlc_MediaInstancePositionChanged, + libvlc_MediaInstanceSeekableChanged, + libvlc_MediaInstancePausableChanged, libvlc_MediaListItemAdded, libvlc_MediaListWillAddItem, @@ -389,6 +391,14 @@ typedef struct libvlc_event_t { libvlc_time_t new_time; } media_instance_time_changed; + struct + { + libvlc_time_t new_seekable; + } media_instance_seekable_changed; + struct + { + libvlc_time_t new_pausable; + } media_instance_pausable_changed; /* media list */ struct diff --git a/src/control/media_instance.c b/src/control/media_instance.c index 02549f0ea5..d0f43196cb 100644 --- a/src/control/media_instance.c +++ b/src/control/media_instance.c @@ -148,9 +148,6 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd, libvlc_event_t event; libvlc_event_type_t type = newval.i_int; - if( strcmp( psz_cmd, "state" ) ) - type = var_GetInteger( p_this, "state" ); - switch ( type ) { case END_S: @@ -177,6 +174,40 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd, return VLC_SUCCESS; } +static int +input_seakable_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_instance_t * p_mi = p_userdata; + libvlc_event_t event; + + libvlc_media_descriptor_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL); + event.type = libvlc_MediaInstanceSeekableChanged; + event.u.media_instance_seekable_changed.new_seekable = newval.b_bool; + + libvlc_event_send( p_mi->p_event_manager, &event ); + return VLC_SUCCESS; +} + +static int +input_pausable_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_instance_t * p_mi = p_userdata; + libvlc_event_t event; + + libvlc_media_descriptor_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL); + event.type = libvlc_MediaInstancePausableChanged; + event.u.media_instance_pausable_changed.new_pausable = newval.b_bool; + + libvlc_event_send( p_mi->p_event_manager, &event ); + return VLC_SUCCESS; +} + /* * input_position_changed (Private) (input var "intf-change" Callback) */ @@ -295,6 +326,10 @@ libvlc_media_instance_new( libvlc_instance_t * p_libvlc_instance, libvlc_MediaInstancePositionChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaInstanceTimeChanged, p_e ); + libvlc_event_manager_register_event_type( p_mi->p_event_manager, + libvlc_MediaInstanceSeekableChanged, p_e ); + libvlc_event_manager_register_event_type( p_mi->p_event_manager, + libvlc_MediaInstancePausableChanged, p_e ); return p_mi; } @@ -552,8 +587,8 @@ void libvlc_media_instance_play( libvlc_media_instance_t *p_mi, var_Set( p_input_thread, "drawable", val ); } var_AddCallback( p_input_thread, "state", input_state_changed, p_mi ); - var_AddCallback( p_input_thread, "seekable", input_state_changed, p_mi ); - var_AddCallback( p_input_thread, "pausable", input_state_changed, p_mi ); + 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 );