/************************************************************************** * add_file_content (Public) **************************************************************************/ int libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist, const char * psz_uri ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_NewExt( psz_uri, _("Media Library"), 0, NULL, 0, -1 ); if( !p_input_item ) { libvlc_printerr( "Not enough memory" ); return -1; } p_md = libvlc_media_new_from_input_item( p_mlist->p_libvlc_instance, p_input_item ); if( !p_md ) { vlc_gc_decref( p_input_item ); return -1; } if( libvlc_media_list_add_media( p_mlist, p_md ) ) { #warning Missing error handling! /* printerr and leaks */ return -1; } input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item ); return 0; }
/************************************************************************** * input_item_subitem_added (Private) (vlc event Callback) **************************************************************************/ static void input_item_subitem_added( const vlc_event_t *p_event, void * user_data ) { libvlc_media_t * p_md = user_data; libvlc_media_t * p_md_child; libvlc_event_t event; p_md_child = libvlc_media_new_from_input_item( p_md->p_libvlc_instance, p_event->u.input_item_subitem_added.p_new_child ); /* Add this to our media list */ if( !p_md->p_subitems ) { p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance ); libvlc_media_list_set_media( p_md->p_subitems, p_md ); } if( p_md->p_subitems ) { libvlc_media_list_add_media( p_md->p_subitems, p_md_child ); } /* Construct the event */ event.type = libvlc_MediaSubItemAdded; event.u.media_subitem_added.new_child = p_md_child; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event ); libvlc_media_release( p_md_child ); }
/************************************************************************** * Create a new media descriptor object **************************************************************************/ libvlc_media_t * libvlc_media_new_as_node( libvlc_instance_t *p_instance, const char * psz_name ) { input_item_t * p_input_item; libvlc_media_t * p_md; libvlc_media_list_t * p_subitems; p_input_item = input_item_New( "vlc://nop", psz_name ); if (!p_input_item) { libvlc_printerr( "Not enough memory" ); return NULL; } p_md = libvlc_media_new_from_input_item( p_instance, p_input_item ); p_subitems = media_get_subitems( p_md, true ); if( p_subitems == NULL) { libvlc_media_release( p_md ); return NULL; } return p_md; }
static void services_discovery_item_added( services_discovery_t *sd, input_item_t *parent, input_item_t *p_item, const char *psz_cat ) { libvlc_media_t * p_md; libvlc_media_discoverer_t *p_mdis = sd->owner.sys; libvlc_media_list_t * p_mlist = p_mdis->p_mlist; p_md = libvlc_media_new_from_input_item( p_mdis->p_libvlc_instance, p_item ); if( parent != NULL ) { /* Flatten items list for now. TODO: tree support. */ } else /* If we have a category, that mean we have to group the items having * that category in a media_list. */ if( psz_cat ) { p_mlist = vlc_dictionary_value_for_key( &p_mdis->catname_to_submedialist, psz_cat ); if( p_mlist == kVLCDictionaryNotFound ) { libvlc_media_t * p_catmd; p_catmd = libvlc_media_new_as_node( p_mdis->p_libvlc_instance, psz_cat ); p_mlist = libvlc_media_subitems( p_catmd ); p_mlist->b_read_only = true; /* Insert the newly created mlist in our dictionary */ vlc_dictionary_insert( &p_mdis->catname_to_submedialist, psz_cat, p_mlist ); /* Insert the md into the root list */ libvlc_media_list_lock( p_mdis->p_mlist ); libvlc_media_list_internal_add_media( p_mdis->p_mlist, p_catmd ); libvlc_media_list_unlock( p_mdis->p_mlist ); /* We don't release the mlist cause the dictionary * doesn't retain the object. But we release the md. */ libvlc_media_release( p_catmd ); } } libvlc_media_list_lock( p_mlist ); libvlc_media_list_internal_add_media( p_mlist, p_md ); libvlc_media_list_unlock( p_mlist ); libvlc_media_release( p_md ); }
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; const char * psz_cat = p_event->u.services_discovery_item_added.psz_category; libvlc_media_t * p_md; libvlc_media_discoverer_t * p_mdis = user_data; libvlc_media_list_t * p_mlist = p_mdis->p_mlist; p_md = libvlc_media_new_from_input_item( p_mdis->p_libvlc_instance, p_item, NULL ); /* If we have a category, that mean we have to group the items having * that category in a media_list. */ if( psz_cat ) { p_mlist = vlc_dictionary_value_for_key( &p_mdis->catname_to_submedialist, psz_cat ); if( p_mlist == kVLCDictionaryNotFound ) { libvlc_media_t * p_catmd; p_catmd = libvlc_media_new_as_node( p_mdis->p_libvlc_instance, psz_cat, NULL ); p_mlist = libvlc_media_subitems( p_catmd, NULL ); p_mlist->b_read_only = true; /* Insert the newly created mlist in our dictionary */ vlc_dictionary_insert( &p_mdis->catname_to_submedialist, psz_cat, p_mlist ); /* Insert the md into the root list */ libvlc_media_list_lock( p_mdis->p_mlist ); _libvlc_media_list_add_media( p_mdis->p_mlist, p_catmd, NULL ); libvlc_media_list_unlock( p_mdis->p_mlist ); /* We don't release the mlist cause the dictionary * doesn't retain the object. But we release the md. */ libvlc_media_release( p_catmd ); } } else { libvlc_media_list_lock( p_mlist ); _libvlc_media_list_add_media( p_mlist, p_md, NULL ); libvlc_media_list_unlock( p_mlist ); } }
/************************************************************************** * Create a new media descriptor object **************************************************************************/ libvlc_media_t * libvlc_media_new_as_node( libvlc_instance_t *p_instance, const char * psz_name ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_New( "vlc://nop", psz_name ); if (!p_input_item) { libvlc_printerr( "Not enough memory" ); return NULL; } p_md = libvlc_media_new_from_input_item( p_instance, p_input_item ); p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance ); return p_md; }
/************************************************************************** * Create a new media descriptor object **************************************************************************/ libvlc_media_t *libvlc_media_new_location( libvlc_instance_t *p_instance, const char * psz_mrl ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_New( psz_mrl, NULL ); if (!p_input_item) { libvlc_printerr( "Not enough memory" ); return NULL; } p_md = libvlc_media_new_from_input_item( p_instance, p_input_item ); /* The p_input_item is retained in libvlc_media_new_from_input_item */ vlc_gc_decref( p_input_item ); return p_md; }
/************************************************************************** * add_file_content (Public) **************************************************************************/ void libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist, const char * psz_uri, libvlc_exception_t * p_e ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_NewExt( p_mlist->p_libvlc_instance->p_libvlc_int, psz_uri, _("Media Library"), 0, NULL, 0, -1 ); if( !p_input_item ) { libvlc_exception_raise( p_e ); libvlc_printerr( "Not enough memory" ); return; } p_md = libvlc_media_new_from_input_item( p_mlist->p_libvlc_instance, p_input_item, p_e ); if( !p_md ) { vlc_gc_decref( p_input_item ); return; } libvlc_media_list_add_media( p_mlist, p_md, p_e ); if( libvlc_exception_raised( p_e ) ) return; input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item ); return; }
/************************************************************************** * Duplicate a media descriptor object **************************************************************************/ libvlc_media_t * libvlc_media_duplicate( libvlc_media_t *p_md_orig ) { return libvlc_media_new_from_input_item( p_md_orig->p_libvlc_instance, p_md_orig->p_input_item ); }