vlc | branch: master | Felix Abecassis <[email protected]> | Mon Aug 4 12:07:25 2014 +0200| [710ad7ed786e36a77accec9d2296bd192233c506] | committer: Felix Abecassis
libvlc: add 3 libvlc events: MediaPlayerESAdded, MediaPlayerESDeleted, MediaPlayerESSelected > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=710ad7ed786e36a77accec9d2296bd192233c506 --- include/vlc/libvlc_events.h | 9 ++++ lib/event.c | 3 ++ lib/media_player.c | 121 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) diff --git a/include/vlc/libvlc_events.h b/include/vlc/libvlc_events.h index f268fb5..963163a 100644 --- a/include/vlc/libvlc_events.h +++ b/include/vlc/libvlc_events.h @@ -74,6 +74,9 @@ enum libvlc_event_e { libvlc_MediaPlayerLengthChanged, libvlc_MediaPlayerVout, libvlc_MediaPlayerScrambledChanged, + libvlc_MediaPlayerESAdded, + libvlc_MediaPlayerESDeleted, + libvlc_MediaPlayerESSelected, libvlc_MediaListItemAdded=0x200, libvlc_MediaListWillAddItem, @@ -230,6 +233,12 @@ typedef struct libvlc_event_t { libvlc_media_t * new_media; } media_player_media_changed; + + struct + { + libvlc_track_type_t i_type; + int i_id; + } media_player_es_changed; } u; /**< Type-dependent event description */ } libvlc_event_t; diff --git a/lib/event.c b/lib/event.c index aa285f9..7cc17bf 100644 --- a/lib/event.c +++ b/lib/event.c @@ -281,6 +281,9 @@ static const event_name_t event_list[] = { DEF(MediaPlayerLengthChanged) DEF(MediaPlayerVout) DEF(MediaPlayerScrambledChanged) + DEF(MediaPlayerESAdded) + DEF(MediaPlayerESDeleted) + DEF(MediaPlayerESSelected) DEF(MediaListItemAdded) DEF(MediaListWillAddItem) diff --git a/lib/media_player.c b/lib/media_player.c index b31a832..7201a78 100644 --- a/lib/media_player.c +++ b/lib/media_player.c @@ -58,6 +58,22 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd, void * p_userdata ); static int +input_es_changed( vlc_object_t * p_this, char const * psz_cmd, + int action, vlc_value_t *p_val, + void *p_userdata); + +static int +input_es_selected( vlc_object_t * p_this, char const * psz_cmd, + vlc_value_t oldval, vlc_value_t newval, + void * p_userdata ); + +static void +add_es_callbacks( input_thread_t *p_input_thread, libvlc_media_player_t *p_mi ); + +static void +del_es_callbacks( input_thread_t *p_input_thread, libvlc_media_player_t *p_mi ); + +static int snapshot_was_taken( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ); @@ -125,6 +141,7 @@ static void release_input_thread( libvlc_media_player_t *p_mi, bool b_input_abor input_scrambled_changed, p_mi ); var_DelCallback( p_input_thread, "intf-event", input_event_changed, p_mi ); + del_es_callbacks( p_input_thread, p_mi ); /* We owned this one */ input_Stop( p_input_thread, b_input_abort ); @@ -347,6 +364,85 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd, return VLC_SUCCESS; } +static int track_type_from_name(const char *psz_name) +{ + if( !strcmp( psz_name, "video-es" ) ) + return libvlc_track_video; + else if( !strcmp( psz_name, "audio-es" ) ) + return libvlc_track_audio; + else if( !strcmp( psz_name, "spu-es" ) ) + return libvlc_track_text; + else + return libvlc_track_unknown; +} + +static int input_es_changed( vlc_object_t *p_this, + char const *psz_cmd, + int action, + vlc_value_t *p_val, + void *p_userdata ) +{ + VLC_UNUSED(p_this); + libvlc_media_player_t *mp = p_userdata; + libvlc_event_t event; + + /* Ignore the "Disable" element */ + if (p_val && p_val->i_int < 0) + return VLC_EGENERIC; + + switch (action) + { + case VLC_VAR_ADDCHOICE: + event.type = libvlc_MediaPlayerESAdded; + break; + case VLC_VAR_DELCHOICE: + case VLC_VAR_CLEARCHOICES: + event.type = libvlc_MediaPlayerESDeleted; + break; + default: + return VLC_EGENERIC; + } + + event.u.media_player_es_changed.i_type = track_type_from_name(psz_cmd); + + int i_id; + if (action != VLC_VAR_CLEARCHOICES) + { + if (!p_val) + return VLC_EGENERIC; + i_id = p_val->i_int; + } + else + { + /* -1 means all ES tracks of this type were deleted. */ + i_id = -1; + } + event.u.media_player_es_changed.i_id = i_id; + + libvlc_event_send(mp->p_event_manager, &event); + + return VLC_SUCCESS; +} + +static int +input_es_selected( vlc_object_t * p_this, char const * psz_cmd, + vlc_value_t oldval, vlc_value_t newval, + void * p_userdata ) +{ + VLC_UNUSED(p_this); + VLC_UNUSED(oldval); + libvlc_media_player_t *mp = p_userdata; + libvlc_event_t event; + + event.type = libvlc_MediaPlayerESSelected; + event.u.media_player_es_changed.i_type = track_type_from_name(psz_cmd); + event.u.media_player_es_changed.i_id = newval.i_int; + + libvlc_event_send(mp->p_event_manager, &event); + + return VLC_SUCCESS; +} + /************************************************************************** * Snapshot Taken Event. * @@ -538,6 +634,9 @@ libvlc_media_player_new( libvlc_instance_t *instance ) register_event(mp, Vout); register_event(mp, ScrambledChanged); + register_event(mp, ESAdded); + register_event(mp, ESDeleted); + register_event(mp, ESSelected); /* Snapshot initialization */ register_event(mp, SnapshotTaken); @@ -710,6 +809,26 @@ libvlc_media_player_event_manager( libvlc_media_player_t *p_mi ) return p_mi->p_event_manager; } +static void add_es_callbacks( input_thread_t *p_input_thread, libvlc_media_player_t *p_mi ) +{ + var_AddListCallback( p_input_thread, "video-es", input_es_changed, p_mi ); + var_AddListCallback( p_input_thread, "audio-es", input_es_changed, p_mi ); + var_AddListCallback( p_input_thread, "spu-es", input_es_changed, p_mi ); + var_AddCallback( p_input_thread, "video-es", input_es_selected, p_mi ); + var_AddCallback( p_input_thread, "audio-es", input_es_selected, p_mi ); + var_AddCallback( p_input_thread, "spu-es", input_es_selected, p_mi ); +} + +static void del_es_callbacks( input_thread_t *p_input_thread, libvlc_media_player_t *p_mi ) +{ + var_DelListCallback( p_input_thread, "video-es", input_es_changed, p_mi ); + var_DelListCallback( p_input_thread, "audio-es", input_es_changed, p_mi ); + var_DelListCallback( p_input_thread, "spu-es", input_es_changed, p_mi ); + var_DelCallback( p_input_thread, "video-es", input_es_selected, p_mi ); + var_DelCallback( p_input_thread, "audio-es", input_es_selected, p_mi ); + var_DelCallback( p_input_thread, "spu-es", input_es_selected, p_mi ); +} + /************************************************************************** * Tell media player to start playing. **************************************************************************/ @@ -751,10 +870,12 @@ int libvlc_media_player_play( libvlc_media_player_t *p_mi ) var_AddCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi ); var_AddCallback( p_input_thread, "program-scrambled", input_scrambled_changed, p_mi ); var_AddCallback( p_input_thread, "intf-event", input_event_changed, p_mi ); + add_es_callbacks( p_input_thread, p_mi ); if( input_Start( p_input_thread ) ) { unlock_input(p_mi); + del_es_callbacks( p_input_thread, p_mi ); var_DelCallback( p_input_thread, "intf-event", input_event_changed, p_mi ); var_DelCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi ); var_DelCallback( p_input_thread, "program-scrambled", input_scrambled_changed, p_mi ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
