From e7e8927bd342060b6d95ef0622a308f3b93718d4 Mon Sep 17 00:00:00 2001 From: Lukas Durfina Date: Sat, 4 Oct 2008 22:00:52 +0200 Subject: [PATCH] libvlc: better title/chapter handling Signed-off-by: Pierre d'Herbemont --- include/vlc/libvlc.h | 72 ++++++++++++++++++--- include/vlc/libvlc_events.h | 8 ++- src/control/event.c | 1 + src/control/media_player.c | 126 +++++++++++++++++++++++++++++++++++- src/libvlc.sym | 6 ++ 5 files changed, 201 insertions(+), 12 deletions(-) diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index 7f2f384d44..c348a092e9 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -268,7 +268,7 @@ VLC_PUBLIC_API void libvlc_media_add_option( /** * Retain a reference to a media descriptor object (libvlc_media_t). Use - * libvlc_media_release() to decrement the reference count of a + * libvlc_media_release() to decrement the reference count of a * media descriptor object. * * \param p_meta_desc a media descriptor object. @@ -381,8 +381,8 @@ VLC_PUBLIC_API int libvlc_exception_t * p_e ); /** - * Sets media descriptor's user_data. user_data is specialized data - * accessed by the host application, VLC.framework uses it as a pointer to + * Sets media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to * an native object that references a libvlc_media_t pointer * * \param p_md media descriptor object @@ -395,8 +395,8 @@ VLC_PUBLIC_API void libvlc_exception_t * p_e); /** - * Get media descriptor's user_data. user_data is specialized data - * accessed by the host application, VLC.framework uses it as a pointer to + * Get media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to * an native object that references a libvlc_media_t pointer * * \param p_md media descriptor object @@ -439,8 +439,8 @@ VLC_PUBLIC_API libvlc_media_player_t * libvlc_media_player_new_from_media( libvl /** * Release a media_player after use * Decrement the reference count of a media player object. If the - * reference count is 0, then libvlc_media_player_release() will - * release the media player object. If the media player object + * reference count is 0, then libvlc_media_player_release() will + * release the media player object. If the media player object * has been released, then it should not be used again. * * \param p_mi the Media Player to free @@ -455,7 +455,7 @@ VLC_PUBLIC_API void libvlc_media_player_release( libvlc_media_player_t * ); */ VLC_PUBLIC_API void libvlc_media_player_retain( libvlc_media_player_t * ); -/** +/** * Set the media that will be used by the media_player. If any, * previous md will be released. * @@ -605,6 +605,60 @@ VLC_PUBLIC_API int libvlc_media_player_get_chapter( libvlc_media_player_t *, lib VLC_PUBLIC_API int libvlc_media_player_get_chapter_count( libvlc_media_player_t *, libvlc_exception_t *); VLC_PUBLIC_API int libvlc_media_player_will_play ( libvlc_media_player_t *, libvlc_exception_t *); +/** + * Get title chapter count + * + * \param p_mi the Media Player + * \param i_title title + * \param p_e an initialized exception pointer + * \return number of chapters in title + */ +VLC_PUBLIC_API int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *, int, libvlc_exception_t *); + +/** + * Set movie title + * + * \param p_mi the Media Player + * \param i_title title number to play + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API void libvlc_media_player_set_title( libvlc_media_player_t *, int, libvlc_exception_t *); + +/** + * Get movie title + * + * \param p_mi the Media Player + * \param p_e an initialized exception pointer + * \return title number currently playing + */ +VLC_PUBLIC_API int libvlc_media_player_get_title( libvlc_media_player_t *, libvlc_exception_t *); + +/** + * Get movie title count + * + * \param p_mi the Media Player + * \param p_e an initialized exception pointer + * \return title number count + */ +VLC_PUBLIC_API int libvlc_media_player_get_title_count( libvlc_media_player_t *, libvlc_exception_t *); + +/** + * Set previous chapter + * + * \param p_mi the Media Player + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API void libvlc_media_player_previous_chapter( libvlc_media_player_t *, libvlc_exception_t *); + +/** + * Set next chapter + * + * \param p_mi the Media Player + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API void libvlc_media_player_next_chapter( libvlc_media_player_t *, libvlc_exception_t *); + /** * Get movie play rate * @@ -1052,7 +1106,7 @@ VLC_PUBLIC_API void /** * Retain a reference to a media library object. This function will - * increment the reference counting for this object. Use + * increment the reference counting for this object. Use * libvlc_media_library_release() to decrement the reference count. * * \param p_mlib media library object diff --git a/include/vlc/libvlc_events.h b/include/vlc/libvlc_events.h index 1aa0f2f5fd..f72ee6cab5 100644 --- a/include/vlc/libvlc_events.h +++ b/include/vlc/libvlc_events.h @@ -82,7 +82,9 @@ typedef enum libvlc_event_type_t { libvlc_MediaListPlayerStopped, libvlc_MediaDiscovererStarted, - libvlc_MediaDiscovererEnded + libvlc_MediaDiscovererEnded, + + libvlc_MediaPlayerTitleChanged } libvlc_event_type_t; @@ -135,6 +137,10 @@ typedef struct libvlc_event_t libvlc_time_t new_time; } media_player_time_changed; struct + { + int new_title; + } media_player_title_changed; + struct { libvlc_time_t new_seekable; } media_player_seekable_changed; diff --git a/src/control/event.c b/src/control/event.c index ad3ee7edf1..940cc2b794 100644 --- a/src/control/event.c +++ b/src/control/event.c @@ -249,6 +249,7 @@ static const char event_type_to_name[][35] = EVENT(libvlc_MediaPlayerBackward), EVENT(libvlc_MediaPlayerEndReached), EVENT(libvlc_MediaPlayerTimeChanged), + EVENT(libvlc_MediaPlayerTitleChanged), EVENT(libvlc_MediaPlayerPositionChanged), EVENT(libvlc_MediaPlayerSeekableChanged), EVENT(libvlc_MediaPlayerPausableChanged), diff --git a/src/control/media_player.c b/src/control/media_player.c index 237ce6019d..1248e1fa30 100644 --- a/src/control/media_player.c +++ b/src/control/media_player.c @@ -370,6 +370,8 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance, libvlc_MediaPlayerPositionChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerTimeChanged, p_e ); + libvlc_event_manager_register_event_type( p_mi->p_event_manager, + libvlc_MediaPlayerTitleChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerSeekableChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, @@ -857,7 +859,7 @@ int libvlc_media_player_get_chapter( p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); if( !p_input_thread ) - return -1.0; + return -1; var_Get( p_input_thread, "chapter", &val ); vlc_object_release( p_input_thread ); @@ -874,7 +876,7 @@ int libvlc_media_player_get_chapter_count( p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); if( !p_input_thread ) - return -1.0; + return -1; var_Change( p_input_thread, "chapter", VLC_VAR_CHOICESCOUNT, &val, NULL ); vlc_object_release( p_input_thread ); @@ -882,6 +884,126 @@ int libvlc_media_player_get_chapter_count( return val.i_int; } +int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *p_mi, + int i_title, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + vlc_value_t val; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); + if( !p_input_thread ) + return -1; + + char *psz_name = NULL; + if( asprintf( psz_name, "title %2i", i_title ) == -1 ) + { + vlc_object_release( p_input_thread ); + return -1; + } + var_Change( p_input_thread, psz_name, VLC_VAR_CHOICESCOUNT, &val, NULL ); + vlc_object_release( p_input_thread ); + free( psz_name ); + + return val.i_int; +} + +void libvlc_media_player_set_title( + libvlc_media_player_t *p_mi, + int i_title, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + vlc_value_t val; + val.i_int = i_title; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e); + if( !p_input_thread ) + return; + + var_Set( p_input_thread, "title", val ); + vlc_object_release( p_input_thread ); + + //send event + libvlc_event_t event; + event.type = libvlc_MediaPlayerTitleChanged; + event.u.media_player_title_changed.new_title = i_title; + libvlc_event_send( p_mi->p_event_manager, &event ); +} + +int libvlc_media_player_get_title( + libvlc_media_player_t *p_mi, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + vlc_value_t val; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); + if( !p_input_thread ) + return -1; + + var_Get( p_input_thread, "title", &val ); + vlc_object_release( p_input_thread ); + + return val.i_int; +} + +int libvlc_media_player_get_title_count( + libvlc_media_player_t *p_mi, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + vlc_value_t val; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); + if( !p_input_thread ) + return -1; + + var_Change( p_input_thread, "title", VLC_VAR_CHOICESCOUNT, &val, NULL ); + vlc_object_release( p_input_thread ); + + return val.i_int; +} + +void libvlc_media_player_next_chapter( + libvlc_media_player_t *p_mi, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e); + if( !p_input_thread ) + return; + + int i_type = var_Type( p_input_thread, "next-chapter" ); + vlc_value_t val; + val.b_bool = true; + var_Set( p_input_thread, (i_type & VLC_VAR_TYPE) != 0 ? + "next-chapter":"next-title", val ); + + vlc_object_release( p_input_thread ); +} + +void libvlc_media_player_previous_chapter( + libvlc_media_player_t *p_mi, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread; + + p_input_thread = libvlc_get_input_thread ( p_mi, p_e); + if( !p_input_thread ) + return; + + int i_type = var_Type( p_input_thread, "next-chapter" ); + vlc_value_t val; + val.b_bool = true; + var_Set( p_input_thread, (i_type & VLC_VAR_TYPE) != 0 ? + "prev-chapter":"prev-title", val ); + + vlc_object_release( p_input_thread ); +} + float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e) diff --git a/src/libvlc.sym b/src/libvlc.sym index ce03edd0c0..d45147adc7 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -110,6 +110,7 @@ libvlc_media_player_destroy libvlc_media_player_event_manager libvlc_media_player_get_chapter libvlc_media_player_get_chapter_count +libvlc_media_player_get_chapter_count_for_title libvlc_media_player_get_drawable libvlc_media_player_get_fps libvlc_media_player_get_length @@ -118,13 +119,17 @@ libvlc_media_player_get_position libvlc_media_player_get_rate libvlc_media_player_get_state libvlc_media_player_get_time +libvlc_media_player_get_title +libvlc_media_player_get_title_count libvlc_media_player_has_vout libvlc_media_player_is_seekable libvlc_media_player_new libvlc_media_player_new_from_input_thread libvlc_media_player_new_from_media +libvlc_media_player_next_chapter libvlc_media_player_pause libvlc_media_player_play +libvlc_media_player_previous_chapter libvlc_media_player_release libvlc_media_player_retain libvlc_media_player_set_chapter @@ -133,6 +138,7 @@ libvlc_media_player_set_media libvlc_media_player_set_position libvlc_media_player_set_rate libvlc_media_player_set_time +libvlc_media_player_set_title libvlc_media_player_stop libvlc_media_player_will_play libvlc_media_release -- 2.39.2