From 66f38edb847aa8868a766475b3c1967356c09773 Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Fri, 17 Aug 2007 08:10:42 +0000 Subject: [PATCH] control/media_discoverer.c: Implementation of a media_discoverer libvlc object based on top of services_discovery. --- include/vlc/libvlc.h | 36 ++++++-- include/vlc/libvlc_structures.h | 13 +++ include/vlc_playlist.h | 2 +- src/Makefile.am | 1 + src/control/libvlc_internal.h | 8 +- src/control/media_discoverer.c | 141 ++++++++++++++++++++++++++++++ src/playlist/services_discovery.c | 2 +- 7 files changed, 192 insertions(+), 11 deletions(-) create mode 100644 src/control/media_discoverer.c diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index 67273021f1..b24098a410 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -692,13 +692,6 @@ VLC_PUBLIC_API void libvlc_video_set_viewport( libvlc_instance_t *, const libvlc /** @} */ -/** - * defgroup libvlc_vlm VLM - * \ingroup libvlc - * LibVLC VLM handling - * @{ - */ - /** defgroup libvlc_audio Audio * \ingroup libvlc * LibVLC Audio handling @@ -780,6 +773,34 @@ VLC_PUBLIC_API void libvlc_audio_set_channel( libvlc_instance_t *, int, libvlc_e /** @} */ +/***************************************************************************** + * Services/Media Discovery + *****************************************************************************/ +/** defgroup libvlc_media_discoverer Media Discoverer + * \ingroup libvlc + * LibVLC Media Discoverer + * @{ + */ + +VLC_PUBLIC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name, + libvlc_exception_t * p_e ); +VLC_PUBLIC_API void libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ); +VLC_PUBLIC_API char * libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ); + +VLC_PUBLIC_API libvlc_media_list_t * libvlc_media_discoverer_media_list( ); + +/**@} */ + +/***************************************************************************** + * VLM + *****************************************************************************/ +/** defgroup libvlc_vlm VLM + * \ingroup libvlc + * LibVLC VLM + * @{ + */ /** * Add a broadcast, with one input @@ -926,7 +947,6 @@ VLC_PUBLIC_API LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0); #undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE -/** @} */ /** @} */ /***************************************************************************** diff --git a/include/vlc/libvlc_structures.h b/include/vlc/libvlc_structures.h index ad2b6a3374..5c207affc2 100644 --- a/include/vlc/libvlc_structures.h +++ b/include/vlc/libvlc_structures.h @@ -197,6 +197,19 @@ libvlc_rectangle_t; /**@} */ +/***************************************************************************** + * Services/Media Discovery + *****************************************************************************/ +/** defgroup libvlc_media_discoverer Media Discoverer + * \ingroup libvlc + * LibVLC Media Discoverer + * @{ + */ + +typedef struct libvlc_media_discoverer_t libvlc_media_discoverer_t; + +/**@} */ + /***************************************************************************** * Message log handling *****************************************************************************/ diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index 6ecce99988..4d47c52a40 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -425,7 +425,7 @@ VLC_EXPORT( void, services_discovery_Destroy, ( services_disco VLC_EXPORT( int, services_discovery_Start, ( services_discovery_t * p_this ) ); /* Read info from discovery object */ -VLC_EXPORT( const char *, services_discovery_GetLocalizedName, ( services_discovery_t * p_this ) ); +VLC_EXPORT( char *, services_discovery_GetLocalizedName, ( services_discovery_t * p_this ) ); /* Receive event notification (prefered way to get new items) */ VLC_EXPORT( vlc_event_manager_t *, services_discovery_EventManager, ( services_discovery_t * p_this ) ); diff --git a/src/Makefile.am b/src/Makefile.am index da6f8412e2..20d05c9986 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -322,6 +322,7 @@ SOURCES_libvlc_control = \ control/mediacontrol_core.c \ control/mediacontrol_util.c \ control/mediacontrol_audio_video.c \ + control/media_discoverer.c \ control/tag_query.c ############################################################################### diff --git a/src/control/libvlc_internal.h b/src/control/libvlc_internal.h index 85a94bfcab..5984c9a16f 100644 --- a/src/control/libvlc_internal.h +++ b/src/control/libvlc_internal.h @@ -114,7 +114,13 @@ struct libvlc_media_list_player_t libvlc_media_instance_t * p_mi; }; - +struct libvlc_media_discoverer_t +{ + libvlc_event_manager_t * p_event_manager; + libvlc_instance_t * p_libvlc_instance; + services_discovery_t * p_sd; + libvlc_media_list_t * p_mlist; +}; /* * Event Handling diff --git a/src/control/media_discoverer.c b/src/control/media_discoverer.c new file mode 100644 index 0000000000..19ddb062d4 --- /dev/null +++ b/src/control/media_discoverer.c @@ -0,0 +1,141 @@ +/***************************************************************************** + * media_discoverer.c: libvlc new API media discoverer functions + ***************************************************************************** + * Copyright (C) 2007 the VideoLAN team + * $Id$ + * + * Authors: Pierre d'Herbemont + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#include "libvlc_internal.h" +#include +#include +#include "vlc_playlist.h" + +/* + * Private functions + */ + +/************************************************************************** + * services_discovery_item_added (Private) (VLC event callback) + **************************************************************************/ + +static void services_discovery_item_added( const vlc_event_t * p_event, + void * user_data ) +{ + input_item_t * p_item = p_event->u.services_discovery_item_added.p_new_item; + libvlc_media_descriptor_t * p_md; + libvlc_media_discoverer_t * p_mdis = user_data; + + p_md = libvlc_media_descriptor_new_from_input_item( + p_mdis->p_libvlc_instance, + p_item, NULL ); + + libvlc_media_list_lock( p_mdis->p_mlist ); + libvlc_media_list_add_media_descriptor( p_mdis->p_mlist, p_md, NULL ); + libvlc_media_list_unlock( p_mdis->p_mlist ); +} + +/************************************************************************** + * services_discovery_item_removed (Private) (VLC event callback) + **************************************************************************/ + +static void services_discovery_item_removed( const vlc_event_t * p_event, + void * user_data ) +{ + /* Not handled */ +} + +/* + * Public libvlc functions + */ + +/************************************************************************** + * new (Public) + * + * Init an object. + **************************************************************************/ +libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name, + libvlc_exception_t * p_e ) +{ + libvlc_media_discoverer_t * p_mdis; + + p_mdis = malloc(sizeof(libvlc_media_discoverer_t)); + if( !p_mdis ) + { + libvlc_exception_raise( p_e, "Not enough memory" ); + return NULL; + } + + p_mdis->p_libvlc_instance = p_inst; + p_mdis->p_mlist = libvlc_media_list_new( p_inst, NULL ); + p_mdis->p_sd = services_discovery_Create( (vlc_object_t*)p_inst->p_libvlc_int, psz_name ); + + if( !p_mdis->p_sd ) + { + free( p_mdis ); + return NULL; + } + + vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), + vlc_ServicesDiscoveryItemAdded, + services_discovery_item_added, + p_mdis ); + vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), + vlc_ServicesDiscoveryItemRemoved, + services_discovery_item_removed, + p_mdis ); + + services_discovery_Start( p_mdis->p_sd ); + + /* Here we go */ + + return p_mdis; +} + +/************************************************************************** + * release (Public) + **************************************************************************/ +void +libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ) +{ + libvlc_media_list_release( p_mdis->p_mlist ); + services_discovery_Destroy( p_mdis->p_sd ); + free( p_mdis ); +} + +/************************************************************************** + * localized_name (Public) + **************************************************************************/ +char * +libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ) +{ + return services_discovery_GetLocalizedName( p_mdis->p_sd ); +} + +/************************************************************************** + * media_list (Public) + **************************************************************************/ +libvlc_media_list_t * +libvlc_media_discoverer_media_list( libvlc_media_discoverer_t * p_mdis ) +{ + libvlc_media_list_retain( p_mdis->p_sd ); + return p_mdis->p_sd; +} + diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index 5d9ee36204..51c7965231 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -103,7 +103,7 @@ int services_discovery_Start ( services_discovery_t * p_sd ) /*********************************************************************** * GetLocalizedName ***********************************************************************/ -const char * +char * services_discovery_GetLocalizedName ( services_discovery_t * p_sd ) { return p_sd->psz_localized_name ? strdup( p_sd->psz_localized_name ) : NULL; -- 2.39.5