From bda1fc3c38d7ba0834a671f436aa69e68368da5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Escudier?= Date: Mon, 18 May 2009 14:17:53 +0200 Subject: [PATCH] Handle VLM events in libvlc MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Denis-Courmont --- include/vlc/libvlc_events.h | 13 ++++++++ include/vlc/libvlc_vlm.h | 13 ++++++++ src/control/core.c | 3 ++ src/control/libvlc_internal.h | 1 + src/control/vlm.c | 60 ++++++++++++++++++++++++++++++++++- src/libvlc.sym | 1 + 6 files changed, 90 insertions(+), 1 deletion(-) diff --git a/include/vlc/libvlc_events.h b/include/vlc/libvlc_events.h index bf0e3a2ea2..9373896861 100644 --- a/include/vlc/libvlc_events.h +++ b/include/vlc/libvlc_events.h @@ -93,6 +93,12 @@ enum libvlc_event_type_t { libvlc_MediaPlayerTitleChanged, libvlc_MediaPlayerSnapshotTaken, libvlc_MediaPlayerLengthChanged, + + libvlc_VlmMediaAdded, + libvlc_VlmMediaRemoved, + libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted, + libvlc_VlmMediaInstanceStopped, /* New event types HERE */ }; @@ -212,6 +218,13 @@ struct libvlc_event_t { libvlc_time_t new_length; } media_player_length_changed; + + /* VLM media */ + struct + { + const char * psz_media_name; + } vlm_media_event; + } u; }; diff --git a/include/vlc/libvlc_vlm.h b/include/vlc/libvlc_vlm.h index c3305badee..56a0a4698d 100644 --- a/include/vlc/libvlc_vlm.h +++ b/include/vlc/libvlc_vlm.h @@ -333,6 +333,19 @@ VLC_PUBLIC_API int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *, const char *, int, libvlc_exception_t * ); +/** + * Get libvlc_event_manager from a vlm media. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param p_exception an initialized exception pointer + * \return libvlc_event_manager + */ +VLC_PUBLIC_API libvlc_event_manager_t * + libvlc_vlm_get_event_manager( libvlc_instance_t *, + libvlc_exception_t * ); + /** @} */ # ifdef __cplusplus diff --git a/src/control/core.c b/src/control/core.c index 0ac8a3c838..eaf2b1b520 100644 --- a/src/control/core.c +++ b/src/control/core.c @@ -138,6 +138,7 @@ libvlc_instance_t * libvlc_new( int argc, const char *const *argv, p_new->p_libvlc_int = p_libvlc_int; p_new->p_vlm = NULL; + p_new->p_event_manager = NULL; p_new->b_playlist_locked = 0; p_new->ref_count = 1; p_new->verbosity = 1; @@ -173,6 +174,8 @@ void libvlc_release( libvlc_instance_t *p_instance ) { vlc_mutex_destroy( lock ); vlc_mutex_destroy( &p_instance->event_callback_lock ); + if( p_instance->p_event_manager ) + libvlc_event_manager_release( p_instance->p_event_manager ); libvlc_InternalCleanup( p_instance->p_libvlc_int ); libvlc_InternalDestroy( p_instance->p_libvlc_int ); free( p_instance ); diff --git a/src/control/libvlc_internal.h b/src/control/libvlc_internal.h index 392bcce89b..e37e3db8c8 100644 --- a/src/control/libvlc_internal.h +++ b/src/control/libvlc_internal.h @@ -61,6 +61,7 @@ struct libvlc_instance_t { libvlc_int_t *p_libvlc_int; vlm_t *p_vlm; + libvlc_event_manager_t *p_event_manager; int b_playlist_locked; unsigned ref_count; int verbosity; diff --git a/src/control/vlm.c b/src/control/vlm.c index 30c598c208..2942d8018f 100644 --- a/src/control/vlm.c +++ b/src/control/vlm.c @@ -105,13 +105,63 @@ char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, } #endif /* 0 */ +/* VLM events callback. Transmit to libvlc */ +static int VlmEvent( vlc_object_t *p_this, const char * name, + vlc_value_t old_val, vlc_value_t newval, void *param ) +{ + vlm_event_t *event = (vlm_event_t*)newval.p_address; + libvlc_event_manager_t *p_event_manager = (libvlc_event_manager_t *) param; + libvlc_event_t libvlc_event; + + libvlc_event.u.vlm_media_event.psz_media_name = event->psz_name; + + switch( event->i_type ) + { + case VLM_EVENT_MEDIA_ADDED: + libvlc_event.type = libvlc_VlmMediaAdded; + break; + case VLM_EVENT_MEDIA_REMOVED: + libvlc_event.type = libvlc_VlmMediaRemoved; + break; + case VLM_EVENT_MEDIA_CHANGED: + libvlc_event.type = libvlc_VlmMediaChanged; + break; + case VLM_EVENT_MEDIA_INSTANCE_STARTED: + libvlc_event.type = libvlc_VlmMediaInstanceStarted; + break; + case VLM_EVENT_MEDIA_INSTANCE_STOPPED: + libvlc_event.type = libvlc_VlmMediaInstanceStopped; + break; + } + libvlc_event_send( p_event_manager, &libvlc_event ); + return 0; +} static int libvlc_vlm_init( libvlc_instance_t *p_instance, libvlc_exception_t *p_exception ) { + if( !p_instance->p_event_manager ) + { + p_instance->p_event_manager = libvlc_event_manager_new( p_instance->p_vlm, + p_instance, p_exception ); + libvlc_event_manager_register_event_type( p_instance->p_event_manager, + libvlc_VlmMediaAdded, NULL ); + libvlc_event_manager_register_event_type( p_instance->p_event_manager, + libvlc_VlmMediaRemoved, NULL ); + libvlc_event_manager_register_event_type( p_instance->p_event_manager, + libvlc_VlmMediaChanged, NULL ); + libvlc_event_manager_register_event_type( p_instance->p_event_manager, + libvlc_VlmMediaInstanceStarted, NULL ); + libvlc_event_manager_register_event_type( p_instance->p_event_manager, + libvlc_VlmMediaInstanceStopped, NULL ); + } + if( !p_instance->p_vlm ) + { p_instance->p_vlm = vlm_New( p_instance->p_libvlc_int ); - + var_AddCallback( (vlc_object_t *)p_instance->p_vlm, "intf-event", VlmEvent, + p_instance->p_event_manager ); + } if( !p_instance->p_vlm ) { libvlc_exception_raise( p_exception, @@ -530,3 +580,11 @@ int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, vlm_media_instance_Delete( p_mi ); return p_mi ? 0 : -1; } + +libvlc_event_manager_t * libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance, + libvlc_exception_t *p_exception ) +{ + vlm_t *p_vlm; + VLM_RET( p_vlm, NULL); + return p_instance->p_event_manager; +} diff --git a/src/libvlc.sym b/src/libvlc.sym index c8c489b4c0..e65211622f 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -202,6 +202,7 @@ libvlc_vlm_add_vod libvlc_vlm_add_input libvlc_vlm_change_media libvlc_vlm_del_media +libvlc_vlm_get_event_manager libvlc_vlm_get_media_instance_chapter libvlc_vlm_get_media_instance_length libvlc_vlm_get_media_instance_position -- 2.39.2