X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fpodcast.c;h=83c92c12bfd7e306fba5d1e9776e7f3f680e495f;hb=8e56136350e4abe198df83028c008c6d5682b6c7;hp=f4dc5a297d2e51cf8a782f2e7cc4f81d4a4c2f59;hpb=36edd71568f3b577bbb8ef59d5e2749388ac9009;p=vlc diff --git a/modules/services_discovery/podcast.c b/modules/services_discovery/podcast.c index f4dc5a297d..83c92c12bf 100644 --- a/modules/services_discovery/podcast.c +++ b/modules/services_discovery/podcast.c @@ -1,7 +1,7 @@ /***************************************************************************** * podcast.c: Podcast services discovery module ***************************************************************************** - * Copyright (C) 2005 the VideoLAN team + * Copyright (C) 2005-2009 the VideoLAN team * $Id$ * * Authors: Antoine Cellerier @@ -69,7 +69,7 @@ vlc_module_begin () set_subcategory( SUBCAT_PLAYLIST_SD ) add_string( "podcast-urls", NULL, NULL, - URLS_TEXT, URLS_LONGTEXT, false ); + URLS_TEXT, URLS_LONGTEXT, false ) change_autosave () set_capability( "services_discovery", 0 ) @@ -132,6 +132,9 @@ static int Open( vlc_object_t *p_this ) if (vlc_clone (&p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW)) { + var_DelCallback( p_sd, "podcast-urls", UrlsChange, p_sys ); + vlc_cond_destroy( &p_sys->wait ); + vlc_mutex_destroy( &p_sys->lock ); free (p_sys); return VLC_EGENERIC; } @@ -156,12 +159,15 @@ static void Close( vlc_object_t *p_this ) for( i = 0; i < p_sys->i_input; i++ ) { - if( p_sd->p_sys->pp_input[i] ) - { - input_StopThread( p_sd->p_sys->pp_input[i] ); - vlc_object_release( p_sd->p_sys->pp_input[i] ); - p_sd->p_sys->pp_input[i] = NULL; - } + input_thread_t *p_input = p_sd->p_sys->pp_input[i]; + if( !p_input ) + continue; + + input_Stop( p_input, true ); + vlc_thread_join( p_input ); + vlc_object_release( p_input ); + + p_sd->p_sys->pp_input[i] = NULL; } free( p_sd->p_sys->pp_input ); for( i = 0; i < p_sys->i_urls; i++ ) free( p_sys->ppsz_urls[i] ); @@ -194,11 +200,14 @@ static void *Run( void *data ) for( int i = 0; i < p_sd->p_sys->i_input; i++ ) { - if( p_sd->p_sys->pp_input[i]->b_eof - || p_sd->p_sys->pp_input[i]->b_error ) + input_thread_t *p_input = p_sd->p_sys->pp_input[i]; + + if( p_input->b_eof || p_input->b_error ) { - input_StopThread( p_sd->p_sys->pp_input[i] ); - vlc_object_release( p_sd->p_sys->pp_input[i] ); + input_Stop( p_input, false ); + vlc_thread_join( p_input ); + vlc_object_release( p_input ); + p_sd->p_sys->pp_input[i] = NULL; REMOVE_ELEM( p_sys->pp_input, p_sys->i_input, i ); i--; @@ -245,13 +254,12 @@ static void ParseUrls( services_discovery_t *p_sd, char *psz_urls ) input_item_t *p_input; INSERT_ELEM( p_sys->ppsz_urls, p_sys->i_urls, p_sys->i_urls, strdup( psz_urls ) ); - p_input = input_item_NewExt( p_sd, psz_urls, - psz_urls, 0, NULL, -1 ); + p_input = input_item_New( p_sd, psz_urls, psz_urls ); input_item_AddOption( p_input, "demux=podcast", VLC_INPUT_OPTION_TRUSTED ); services_discovery_AddItem( p_sd, p_input, NULL /* no cat */ ); vlc_gc_decref( p_input ); INSERT_ELEM( p_sys->pp_input, p_sys->i_input, p_sys->i_input, - input_CreateThread( p_sd, p_input ) ); + input_CreateAndStart( p_sd, p_input, NULL ) ); } if( psz_tok ) psz_urls = psz_tok+1; else return;