/***************************************************************************** * Run: *****************************************************************************/ static void *Run( void *data ) { services_discovery_t *p_sd = data; services_discovery_sys_t *p_sys = p_sd->p_sys; int canc = vlc_savecancel(); int num_dir = sizeof( p_sys->psz_dir ) / sizeof( p_sys->psz_dir[0] ); for( int i = 0; i < num_dir; i++ ) { char* psz_dir = p_sys->psz_dir[i]; /* make sure the directory exists */ struct stat st; if( psz_dir == NULL || vlc_stat( psz_dir, &st ) || !S_ISDIR( st.st_mode ) ) continue; char* psz_uri = make_URI( psz_dir, "file" ); input_item_t* p_root = input_item_New( psz_uri, NULL ); if( p_sys->i_type == Picture ) input_item_AddOption( p_root, "ignore-filetypes=ini,db,lnk,txt", VLC_INPUT_OPTION_TRUSTED ); input_item_AddOption( p_root, "recursive=collapse", VLC_INPUT_OPTION_TRUSTED ); vlc_event_manager_t *p_em = &p_root->event_manager; vlc_event_attach( p_em, vlc_InputItemSubItemAdded, input_item_subitem_added, p_sd ); input_Read( p_sd, p_root ); vlc_event_detach( p_em, vlc_InputItemSubItemAdded, input_item_subitem_added, p_sd ); vlc_gc_decref( p_root ); free( psz_uri ); } vlc_restorecancel(canc); return NULL; }
/***************************************************************************** * AddSubitemsOfShoutItemURL: *****************************************************************************/ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, const struct shout_item_t * p_item, const char * psz_category ) { struct shout_category_t category = { p_sd, psz_category }; /* Create the item */ input_item_t *p_input = CreateInputItemFromShoutItem( p_sd, p_item ); /* Read every subitems, and add them in ItemAdded */ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); input_Read( p_sd, p_input, true ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); vlc_gc_decref( p_input ); }
static void uninstall_input_item_observer( playlist_item_t * p_item ) { vlc_event_manager_t * p_em = &p_item->p_input->event_manager; vlc_event_detach( p_em, vlc_InputItemSubItemTreeAdded, input_item_add_subitem_tree, p_item ); vlc_event_detach( p_em, vlc_InputItemMetaChanged, input_item_changed, p_item ); vlc_event_detach( p_em, vlc_InputItemDurationChanged, input_item_changed, p_item ); vlc_event_detach( p_em, vlc_InputItemNameChanged, input_item_changed, p_item ); vlc_event_detach( p_em, vlc_InputItemInfoChanged, input_item_changed, p_item ); vlc_event_detach( p_em, vlc_InputItemErrorWhenReadingChanged, input_item_changed, p_item ); }
int playlist_MLLoad( playlist_t *p_playlist ) { input_item_t *p_input; char *psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } char *psz_file; if( asprintf( &psz_file, "%s" DIR_SEP "ml.xspf", psz_datadir ) == -1 ) psz_file = NULL; free( psz_datadir ); if( psz_file == NULL ) return VLC_ENOMEM; /* loosy check for media library file */ struct stat st; if( vlc_stat( psz_file, &st ) ) { free( psz_file ); return VLC_EGENERIC; } char *psz_uri = make_URI( psz_file, "file/xspf-open" ); free( psz_file ); if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_tree_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_media_library->p_input ) vlc_gc_decref( p_playlist->p_media_library->p_input ); p_playlist->p_media_library->p_input = p_input; vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); return VLC_SUCCESS; }
int playlist_MLLoad( playlist_t *p_playlist ) { char *psz_datadir; char *psz_uri = NULL; input_item_t *p_input; if( !config_GetInt( p_playlist, "media-library") ) return VLC_SUCCESS; psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } if( asprintf( &psz_uri, "%s" DIR_SEP "ml.xspf", psz_datadir ) != -1 ) { /* loosy check for media library file */ struct stat st; int ret = utf8_stat( psz_uri , &st ); free( psz_uri ); if( ret ) { free( psz_datadir ); return VLC_EGENERIC; } } psz_uri = make_URI( psz_datadir ); free( psz_datadir ); psz_datadir = psz_uri; if( psz_datadir == NULL ) return VLC_EGENERIC; /* Force XSPF demux (psz_datadir was a path, now it is a file URI) */ if( asprintf( &psz_uri, "file/xspf-open%s/ml.xspf", psz_datadir+4 ) == -1 ) psz_uri = NULL; free( psz_datadir ); psz_datadir = NULL; if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( p_playlist, psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_ml_onelevel->p_input ) vlc_gc_decref( p_playlist->p_ml_onelevel->p_input ); if( p_playlist->p_ml_category->p_input ) vlc_gc_decref( p_playlist->p_ml_category->p_input ); p_playlist->p_ml_onelevel->p_input = p_playlist->p_ml_category->p_input = p_input; /* We save the input at two different place, incref */ vlc_gc_incref( p_input ); vlc_gc_incref( p_input ); vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); vlc_gc_decref( p_input ); return VLC_SUCCESS; }
int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist, const char *psz_module ) { struct playlist_services_discovery_support_t * p_sds = NULL; int i; PL_LOCK; for( i = 0 ; i< p_playlist->i_sds ; i ++ ) { if( !strcmp( psz_module, p_playlist->pp_sds[i]->p_sd->psz_module ) ) { p_sds = p_playlist->pp_sds[i]; REMOVE_ELEM( p_playlist->pp_sds, p_playlist->i_sds, i ); break; } } PL_UNLOCK; if( !p_sds || !p_sds->p_sd ) { msg_Warn( p_playlist, "module %s is not loaded", psz_module ); return VLC_EGENERIC; } services_discovery_Stop( p_sds->p_sd ); vlc_event_detach( services_discovery_EventManager( p_sds->p_sd ), vlc_ServicesDiscoveryItemAdded, playlist_sd_item_added, p_sds->p_one ); vlc_event_detach( services_discovery_EventManager( p_sds->p_sd ), vlc_ServicesDiscoveryItemAdded, playlist_sd_item_added, p_sds->p_cat ); vlc_event_detach( services_discovery_EventManager( p_sds->p_sd ), vlc_ServicesDiscoveryItemRemoved, playlist_sd_item_removed, p_sds->p_one ); vlc_event_detach( services_discovery_EventManager( p_sds->p_sd ), vlc_ServicesDiscoveryItemRemoved, playlist_sd_item_removed, p_sds->p_cat ); /* Remove the sd playlist node if it exists */ PL_LOCK; if( p_sds->p_cat != p_playlist->p_root_category && p_sds->p_one != p_playlist->p_root_onelevel ) { playlist_NodeDelete( p_playlist, p_sds->p_cat, true, false ); playlist_NodeDelete( p_playlist, p_sds->p_one, true, false ); } PL_UNLOCK; services_discovery_Destroy( p_sds->p_sd ); free( p_sds ); return VLC_SUCCESS; }
void RendererDialog::setVisible(bool visible) { QVLCDialog::setVisible(visible); if (visible) { /* SD subnodes */ char **ppsz_longnames; char **ppsz_names; if( vlc_rd_get_names( THEPL, &ppsz_names, &ppsz_longnames ) != VLC_SUCCESS ) return; char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames; for( ; *ppsz_name; ppsz_name++, ppsz_longname++ ) { /* TODO launch all discovery services for renderers */ msg_Dbg( p_intf, "starting renderer discovery service %s", *ppsz_longname ); if ( p_rd == NULL ) { p_rd = vlc_rd_new( VLC_OBJECT(p_intf), *ppsz_name ); if( !p_rd ) msg_Err( p_intf, "Could not start renderer discovery services" ); } break; } free( ppsz_names ); free( ppsz_longnames ); if ( p_rd != NULL ) { int row = -1; char *psz_renderer = var_InheritString( THEPL, "sout" ); if ( psz_renderer != NULL ) { for ( row = 0 ; row < ui.receiversListWidget->count(); row++ ) { RendererItem *rowItem = reinterpret_cast<RendererItem*>( ui.receiversListWidget->item( row ) ); if ( rowItem->isItemSout( psz_renderer, false ) ) break; } if ( row == ui.receiversListWidget->count() ) row = -1; free( psz_renderer ); } ui.receiversListWidget->setCurrentRow( row ); if ( !b_rd_started ) { vlc_event_manager_t *em = vlc_rd_event_manager( p_rd ); vlc_event_attach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this ); vlc_event_attach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this ); b_rd_started = vlc_rd_start( p_rd ) == VLC_SUCCESS; if ( !b_rd_started ) { vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this); vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this); } } } } else { if ( p_rd != NULL ) { if ( b_rd_started ) { vlc_event_manager_t *em = vlc_rd_event_manager( p_rd ); vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this); vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this); vlc_rd_stop( p_rd ); b_rd_started = false; } } ui.receiversListWidget->clear(); } }