From 4e9d2f92cdaa51783fa29fb7518d81b7d1b21980 Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Sat, 20 Sep 2008 23:02:13 +0200 Subject: [PATCH] services_discovery: Partially fix service discovery. We yet need to find a way to properly get the localized name... grr. Previously we properly initialized the localized name of the object in Open(). Now Open() also runs Run() so we are kind of stuck. Please fix. --- include/vlc_services_discovery.h | 16 ++++++- src/control/media_discoverer.c | 11 ++++- src/libvlccore.sym | 3 +- src/playlist/services_discovery.c | 79 ++++++++++++++++++++++--------- 4 files changed, 82 insertions(+), 27 deletions(-) diff --git a/include/vlc_services_discovery.h b/include/vlc_services_discovery.h index f4206472d9..e6778af30e 100644 --- a/include/vlc_services_discovery.h +++ b/include/vlc_services_discovery.h @@ -52,7 +52,6 @@ struct services_discovery_t services_discovery_sys_t *p_sys; }; - /*********************************************************************** * Service Discovery ***********************************************************************/ @@ -65,7 +64,20 @@ VLC_EXPORT( char **, __services_discovery_GetServicesNames, ( vlc_object_t * p_s /* Creation of a service_discovery object */ VLC_EXPORT( services_discovery_t *, services_discovery_Create, ( vlc_object_t * p_super, const char * psz_service_name ) ); -VLC_EXPORT( void, services_discovery_Destroy, ( services_discovery_t * p_this ) ); +VLC_EXPORT( bool, services_discovery_Start, ( services_discovery_t * p_this ) ); +VLC_EXPORT( void, services_discovery_Stop, ( services_discovery_t * p_this ) ); + +static inline void services_discovery_CreateAndStart( vlc_object_t * p_super, const char * psz_service_name ) +{ + services_discovery_t * sd = services_discovery_Create( p_super, psz_service_name ); + services_discovery_Start( sd ); +} + +static inline void services_discovery_StopAndRelease( services_discovery_t * p_this ) +{ + services_discovery_Stop( p_this ); + vlc_object_release( p_this ); +} /* Read info from discovery object */ VLC_EXPORT( char *, services_discovery_GetLocalizedName, ( services_discovery_t * p_this ) ); diff --git a/src/control/media_discoverer.c b/src/control/media_discoverer.c index 1cad2c769d..c1b811b038 100644 --- a/src/control/media_discoverer.c +++ b/src/control/media_discoverer.c @@ -179,6 +179,7 @@ libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, if( !p_mdis->p_sd ) { free( p_mdis ); + libvlc_media_list_release( p_mdis->p_mlist ); libvlc_exception_raise( p_e, "Can't find the services_discovery module named '%s'", psz_name ); return NULL; } @@ -201,6 +202,14 @@ libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, p_mdis ); /* Here we go */ + bool ret = services_discovery_Start( p_mdis->p_sd ); + if(!ret) + { + free( p_mdis ); + libvlc_media_list_release( p_mdis->p_mlist ); + libvlc_exception_raise( p_e, "Can't start the services_discovery module named '%s'", psz_name ); + return NULL; + } return p_mdis; } @@ -214,7 +223,7 @@ libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ) int i; libvlc_media_list_release( p_mdis->p_mlist ); - services_discovery_Destroy( p_mdis->p_sd ); + services_discovery_StopAndRelease( p_mdis->p_sd ); /* Free catname_to_submedialist and all the mlist */ char ** all_keys = vlc_dictionary_all_keys( &p_mdis->catname_to_submedialist ); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index dc6cc29726..804b6ff619 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -310,7 +310,8 @@ sdp_AddMedia secstotimestr services_discovery_AddItem services_discovery_Create -services_discovery_Destroy +services_discovery_Start +services_discovery_Stop services_discovery_EventManager services_discovery_GetLocalizedName __services_discovery_GetServicesNames diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index ee91583315..53d51876b3 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -31,6 +31,9 @@ #include "playlist_internal.h" #include "../libvlc.h" + +static void services_discovery_Destructor ( services_discovery_t * p_sd ); + /* * Services discovery * Basically you just listen to Service discovery event through the @@ -55,12 +58,14 @@ services_discovery_t * services_discovery_Create ( vlc_object_t * p_super, const char * psz_module_name ) { services_discovery_t *p_sd; + assert( psz_module_name ); p_sd = vlc_custom_create( p_super, sizeof( *p_sd ), VLC_OBJECT_GENERIC, "services discovery" ); if( !p_sd ) return NULL; - p_sd->psz_localized_name = NULL; + p_sd->psz_localized_name = strdup( "Unnamed service discovery" ); // FIXME: Set that back to NULL + p_sd->psz_module = strdup( psz_module_name ); vlc_event_manager_init( &p_sd->event_manager, p_sd, (vlc_object_t *)p_sd ); vlc_event_manager_register_event_type( &p_sd->event_manager, @@ -72,22 +77,10 @@ services_discovery_Create ( vlc_object_t * p_super, const char * psz_module_name vlc_event_manager_register_event_type( &p_sd->event_manager, vlc_ServicesDiscoveryEnded ); - p_sd->p_module = module_Need( p_sd, "services_discovery", psz_module_name, true ); - - if( p_sd->p_module == NULL ) - { - msg_Err( p_super, "no suitable services discovery module" ); - vlc_object_release( p_sd ); - return NULL; - } - p_sd->psz_module = strdup( psz_module_name ); + p_sd->b_die = false; /* FIXME */ vlc_object_attach( p_sd, p_super ); - vlc_event_t event = { - .type = vlc_ServicesDiscoveryStarted - }; - vlc_event_send( &p_sd->event_manager, &event ); return p_sd; } @@ -104,24 +97,56 @@ static void ObjectKillChildrens( vlc_object_t *p_obj ) } /*********************************************************************** - * Destroy + * Stop + ***********************************************************************/ +bool services_discovery_Start ( services_discovery_t * p_sd ) +{ + assert(!p_sd->p_module); + + p_sd->p_module = module_Need( p_sd, "services_discovery", p_sd->psz_module, true ); + + if( p_sd->p_module == NULL ) + { + msg_Err( p_sd, "no suitable services discovery module" ); + return false; + } + + vlc_event_t event = { + .type = vlc_ServicesDiscoveryStarted + }; + vlc_event_send( &p_sd->event_manager, &event ); + return true; +} + +/*********************************************************************** + * Stop ***********************************************************************/ -void services_discovery_Destroy ( services_discovery_t * p_sd ) +void services_discovery_Stop ( services_discovery_t * p_sd ) { vlc_event_t event = { .type = vlc_ServicesDiscoveryEnded }; - + ObjectKillChildrens( VLC_OBJECT(p_sd) ); - + vlc_event_send( &p_sd->event_manager, &event ); + module_Unneed( p_sd, p_sd->p_module ); + p_sd->p_module = NULL; +} - vlc_event_manager_fini( &p_sd->event_manager ); +/*********************************************************************** + * Destructor + ***********************************************************************/ +static void services_discovery_Destructor ( services_discovery_t * p_sd ) +{ + assert(!p_sd->p_module); /* Forgot to call Stop */ + vlc_event_manager_fini( &p_sd->event_manager ); + free( p_sd->psz_module ); free( p_sd->psz_localized_name ); - + vlc_object_release( p_sd ); } @@ -285,6 +310,7 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, const char *psz_modu if( !p_sd ) continue; + /* FIXME: Thanks to previous changeset this is broken */ char * psz = services_discovery_GetLocalizedName( p_sd ); assert( psz ); PL_LOCK; @@ -297,7 +323,7 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, const char *psz_modu vlc_ServicesDiscoveryItemAdded, playlist_sd_item_added, p_one ); - + vlc_event_attach( services_discovery_EventManager( p_sd ), vlc_ServicesDiscoveryItemAdded, playlist_sd_item_added, @@ -313,6 +339,13 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, const char *psz_modu playlist_sd_item_removed, p_cat ); + bool ret = services_discovery_Start( p_sd ); + if(!ret) + { + vlc_object_release( p_sd ); + return VLC_EGENERIC; + } + /* Free in playlist_ServicesDiscoveryRemove */ p_sds = malloc( sizeof(struct playlist_services_discovery_support_t) ); if( !p_sds ) @@ -327,6 +360,7 @@ int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, const char *psz_modu PL_LOCK; TAB_APPEND( p_playlist->i_sds, p_playlist->pp_sds, p_sds ); PL_UNLOCK; + } return retval; @@ -386,7 +420,7 @@ int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist, } PL_UNLOCK; - services_discovery_Destroy( p_sds->p_sd ); + services_discovery_StopAndRelease( p_sds->p_sd ); free( p_sds ); return VLC_SUCCESS; @@ -416,4 +450,3 @@ void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ) playlist_ServicesDiscoveryRemove( p_playlist, p_playlist->pp_sds[0]->p_sd->psz_module ); } - -- 2.39.2