X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fservices_discovery.c;h=a14c85381793d8942c13ba891b599c6cfb971121;hb=420d5f170e9ff667e2a218ebb86eb9d7e4d9aa61;hp=f55699b5881adf40a044d36914b7b7a1eb167ab2;hpb=315069b3b158b8d71668b5295e4fd0ea8957a3f2;p=vlc diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index f55699b588..a14c853817 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -25,52 +25,62 @@ #include "vlc_playlist.h" #include "playlist_internal.h" -/***************************************************************************** - * Local prototypes - *****************************************************************************/ - static void RunSD( services_discovery_t *p_sd ); - -/*************************************************************************** -***************************************************************************/ - -int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, - const char *psz_module ) +int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, const char *psz_modules ) { - services_discovery_t *p_sd; - - p_sd = vlc_object_create( p_playlist, VLC_OBJECT_SD ); - p_sd->pf_run = NULL; - - p_sd->p_module = module_Need( p_sd, "services_discovery", psz_module, 0 ); - - if( p_sd->p_module == NULL ) + if( psz_modules && *psz_modules ) { - msg_Err( p_playlist, "no suitable services discovery module" ); - vlc_object_destroy( p_sd ); - return VLC_EGENERIC; - } - - p_sd->psz_module = strdup( psz_module ); - p_sd->b_die = VLC_FALSE; - - vlc_mutex_lock( &p_playlist->object_lock ); + char *psz_parser = psz_modules; + char *psz_next; - INSERT_ELEM( p_playlist->pp_sds, p_playlist->i_sds, p_playlist->i_sds, - p_sd ); + while( psz_parser && *psz_parser ) + { + while( *psz_parser == ' ' || *psz_parser == ':' || *psz_parser == ',' ) + psz_parser++; - vlc_mutex_unlock( &p_playlist->object_lock ); + if( (psz_next = strchr( psz_parser, ':' ) ) ) + *psz_next++ = '\0'; - if( vlc_thread_create( p_sd, "services_discovery", RunSD, - VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) ) - { - msg_Err( p_sd, "cannot create services discovery thread" ); - vlc_object_destroy( p_sd ); - return VLC_EGENERIC; + if( *psz_parser == '\0' ) + break; + fprintf(stderr,"Add %s\n", psz_parser); + /* Perform the addition */ + { + services_discovery_t *p_sd = vlc_object_create( p_playlist, + VLC_OBJECT_SD ); + p_sd->pf_run = NULL; + p_sd->p_module = module_Need( p_sd, "services_discovery", psz_parser, 0 ); + + if( p_sd->p_module == NULL ) + { + msg_Err( p_playlist, "no suitable services discovery module" ); + vlc_object_destroy( p_sd ); + return VLC_EGENERIC; + } + p_sd->psz_module = strdup( psz_parser ); + p_sd->b_die = VLC_FALSE; + + PL_LOCK; + TAB_APPEND( p_playlist->i_sds, p_playlist->pp_sds, p_sd ); + PL_UNLOCK; + + if( !p_sd->pf_run ) { + psz_parser = psz_next; + continue; + } + + if( vlc_thread_create( p_sd, "services_discovery", RunSD, + VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) ) + { + msg_Err( p_sd, "cannot create services discovery thread" ); + vlc_object_destroy( p_sd ); + return VLC_EGENERIC; + } + } + psz_parser = psz_next; + } } - - return VLC_SUCCESS; } @@ -79,8 +89,8 @@ int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist, { int i; services_discovery_t *p_sd = NULL; - vlc_mutex_lock( &p_playlist->object_lock ); + PL_LOCK; for( i = 0 ; i< p_playlist->i_sds ; i ++ ) { if( !strcmp( psz_module, p_playlist->pp_sds[i]->psz_module ) ) @@ -93,22 +103,22 @@ int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist, if( p_sd ) { - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; p_sd->b_die = VLC_TRUE; - vlc_thread_join( p_sd ); + if( p_sd->pf_run ) vlc_thread_join( p_sd ); + free( p_sd->psz_module ); module_Unneed( p_sd, p_sd->p_module ); - vlc_mutex_lock( &p_playlist->object_lock ); + PL_LOCK; vlc_object_destroy( p_sd ); } else { msg_Warn( p_playlist, "module %s is not loaded", psz_module ); - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; return VLC_EGENERIC; } - - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; return VLC_SUCCESS; } @@ -116,59 +126,20 @@ vlc_bool_t playlist_IsServicesDiscoveryLoaded( playlist_t * p_playlist, const char *psz_module ) { int i; - vlc_mutex_lock( &p_playlist->object_lock ); + PL_LOCK; for( i = 0 ; i< p_playlist->i_sds ; i ++ ) { if( !strcmp( psz_module, p_playlist->pp_sds[i]->psz_module ) ) { - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; return VLC_TRUE; } } - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; return VLC_FALSE; } - -/** - * Load all service discovery modules in a string - * - * \param p_playlist the playlist - * \param psz_modules a list of modules separated by commads - * return VLC_SUCCESS or an error - */ -int playlist_AddSDModules( playlist_t *p_playlist, char *psz_modules ) -{ - if( psz_modules && *psz_modules ) - { - char *psz_parser = psz_modules; - char *psz_next; - - while( psz_parser && *psz_parser ) - { - while( *psz_parser == ' ' || *psz_parser == ':' ) - { - psz_parser++; - } - - if( (psz_next = strchr( psz_parser, ':' ) ) ) - { - *psz_next++ = '\0'; - } - if( *psz_parser == '\0' ) - { - break; - } - - playlist_ServicesDiscoveryAdd( p_playlist, psz_parser ); - - psz_parser = psz_next; - } - } - return VLC_SUCCESS; -} - static void RunSD( services_discovery_t *p_sd ) { p_sd->pf_run( p_sd );