/************************************************************************** * 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; }
/************************************************************************** * 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_media_list_t *p_subitems; 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 */ p_subitems = media_get_subitems( p_md, true ); if( p_subitems != NULL ) { libvlc_media_list_lock( p_subitems ); libvlc_media_list_internal_add_media( p_subitems, p_md_child ); libvlc_media_list_unlock( p_subitems ); } /* 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 ); }
/************************************************************************** * subitems **************************************************************************/ libvlc_media_list_t * libvlc_media_subitems( libvlc_media_t * p_md ) { libvlc_media_list_t *p_subitems = media_get_subitems( p_md, true ); if( p_subitems ) libvlc_media_list_retain( p_subitems ); return p_subitems; }
/************************************************************************** * input_item_preparse_ended (Private) (vlc event Callback) **************************************************************************/ static void input_item_preparse_ended( const vlc_event_t * p_event, void * user_data ) { VLC_UNUSED( p_event ); libvlc_media_t * p_md = user_data; libvlc_media_list_t *p_subitems = media_get_subitems( p_md, false ); if( p_subitems != NULL ) { /* notify the media list */ libvlc_media_list_lock( p_subitems ); libvlc_media_list_internal_end_reached( p_subitems ); libvlc_media_list_unlock( p_subitems ); } }
static void send_parsed_changed( libvlc_media_t *p_md, libvlc_media_parsed_status_t new_status ) { libvlc_event_t event; vlc_mutex_lock( &p_md->parsed_lock ); if( p_md->parsed_status == new_status ) { vlc_mutex_unlock( &p_md->parsed_lock ); return; } /* Legacy: notify libvlc_media_parse */ if( !p_md->is_parsed ) { p_md->is_parsed = true; vlc_cond_broadcast( &p_md->parsed_cond ); } p_md->parsed_status = new_status; if( p_md->parsed_status == libvlc_media_parsed_status_skipped ) p_md->has_asked_preparse = false; vlc_mutex_unlock( &p_md->parsed_lock ); if( new_status == libvlc_media_parsed_status_done ) { libvlc_media_list_t *p_subitems = media_get_subitems( p_md, false ); if( p_subitems != NULL ) { /* notify the media list */ libvlc_media_list_lock( p_subitems ); libvlc_media_list_internal_end_reached( p_subitems ); libvlc_media_list_unlock( p_subitems ); } } /* Construct the event */ event.type = libvlc_MediaParsedChanged; event.u.media_parsed_changed.new_status = new_status; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event ); }
/************************************************************************** * input_item_preparse_ended (Private) (vlc event Callback) **************************************************************************/ static void input_item_preparse_ended( const vlc_event_t * p_event, void * user_data ) { VLC_UNUSED( p_event ); libvlc_media_t * p_md = user_data; libvlc_media_list_t *p_subitems = media_get_subitems( p_md, false ); libvlc_event_t event; event.type = libvlc_MediaParsedStatus; vlc_mutex_lock(&p_md->parsed_lock); switch (p_event->u.input_item_preparse_ended.new_status) { case ITEM_PREPARSE_SKIPPED: p_md->parsed_status = libvlc_media_parse_skipped; p_md->has_asked_preparse = false; break; case ITEM_PREPARSE_FAILED: p_md->parsed_status = libvlc_media_parse_failed; break; case ITEM_PREPARSE_DONE: p_md->parsed_status = libvlc_media_parse_done; break; } event.u.media_parsed_status.new_status = p_md->parsed_status; vlc_mutex_unlock(&p_md->parsed_lock); if( p_subitems != NULL ) { /* notify the media list */ libvlc_media_list_lock( p_subitems ); libvlc_media_list_internal_end_reached( p_subitems ); libvlc_media_list_unlock( p_subitems ); } /* XXX: libVLC 2.2.0 compat: even if case of preparse failure, * libvlc_MediaParsedChanged was sent with a true status. Therefore, send * this event if it was not previously sent */ send_preparsed_event(p_md); libvlc_event_send(p_md->p_event_manager, &event); }