/************************************************************************** * set_current_playing_item (private) * * Playlist lock should be held **************************************************************************/ static void set_current_playing_item(libvlc_media_list_player_t * p_mlp, libvlc_media_list_path_t path) { assert_locked(p_mlp); /* First, save the new path that we are going to play */ if (p_mlp->current_playing_item_path != path) { free(p_mlp->current_playing_item_path); p_mlp->current_playing_item_path = path; } if (!path) return; libvlc_media_t * p_md; p_md = libvlc_media_list_item_at_path(p_mlp->p_mlist, path); if (!p_md) return; /* Make sure media_player_reached_end() won't get called */ uninstall_media_player_observer(p_mlp); /* Create a new media_player if there is none */ if (!p_mlp->p_mi) p_mlp->p_mi = libvlc_media_player_new_from_media(p_md, NULL); libvlc_media_player_set_media(p_mlp->p_mi, p_md, NULL); install_media_player_observer(p_mlp); libvlc_media_release(p_md); /* for libvlc_media_list_item_at_index */ }
/************************************************************************** * Stop (Private) * * Lock must be held. **************************************************************************/ static void stop(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) { assert_locked(p_mlp); if (p_mlp->p_mi && p_mlp->current_playing_item_path) { /* We are not interested in getting media stop event now */ uninstall_media_player_observer(p_mlp); libvlc_media_player_stop(p_mlp->p_mi, p_e); install_media_player_observer(p_mlp); } free(p_mlp->current_playing_item_path); p_mlp->current_playing_item_path = NULL; }
/************************************************************************** * set_media_player (Public) **************************************************************************/ void libvlc_media_list_player_set_media_player(libvlc_media_list_player_t * p_mlp, libvlc_media_player_t * p_mi) { libvlc_media_player_t *p_oldmi; assert(p_mi != NULL); libvlc_media_player_retain(p_mi); lock(p_mlp); uninstall_media_player_observer(p_mlp); p_oldmi = p_mlp->p_mi; p_mlp->p_mi = p_mi; install_media_player_observer(p_mlp); unlock(p_mlp); libvlc_media_player_release(p_oldmi); }
/************************************************************************** * set_media_player (Public) **************************************************************************/ void libvlc_media_list_player_set_media_player(libvlc_media_list_player_t * p_mlp, libvlc_media_player_t * p_mi) { lock(p_mlp); if (p_mlp->p_mi) { uninstall_media_player_observer(p_mlp); libvlc_media_player_release(p_mlp->p_mi); } libvlc_media_player_retain(p_mi); p_mlp->p_mi = p_mi; install_media_player_observer(p_mlp); unlock(p_mlp); }
/************************************************************************** * Stop (Private) * * Lock must be held. **************************************************************************/ static void stop(libvlc_media_list_player_t * p_mlp) { assert_locked(p_mlp); /* We are not interested in getting media stop event now */ uninstall_media_player_observer(p_mlp); libvlc_media_player_stop(p_mlp->p_mi); install_media_player_observer(p_mlp); free(p_mlp->current_playing_item_path); p_mlp->current_playing_item_path = NULL; /* Send the event */ libvlc_event_t event; event.type = libvlc_MediaListPlayerStopped; libvlc_event_send(&p_mlp->event_manager, &event); }
/************************************************************************** * new (Public) **************************************************************************/ libvlc_media_list_player_t * libvlc_media_list_player_new(libvlc_instance_t * p_instance) { libvlc_media_list_player_t * p_mlp; p_mlp = calloc( 1, sizeof(libvlc_media_list_player_t) ); if (unlikely(p_mlp == NULL)) { libvlc_printerr("Not enough memory"); return NULL; } p_mlp->i_refcount = 1; p_mlp->seek_offset = 0; vlc_mutex_init(&p_mlp->object_lock); vlc_mutex_init(&p_mlp->mp_callback_lock); vlc_cond_init(&p_mlp->seek_pending); p_mlp->p_event_manager = libvlc_event_manager_new(p_mlp); if (unlikely(p_mlp->p_event_manager == NULL)) goto error; /* Create the underlying media_player */ p_mlp->p_mi = libvlc_media_player_new(p_instance); if( p_mlp->p_mi == NULL ) { libvlc_event_manager_release(p_mlp->p_event_manager); goto error; } install_media_player_observer(p_mlp); if (vlc_clone(&p_mlp->thread, playlist_thread, p_mlp, VLC_THREAD_PRIORITY_LOW)) { libvlc_media_player_release(p_mlp->p_mi); libvlc_event_manager_release(p_mlp->p_event_manager); goto error; } return p_mlp; error: vlc_cond_destroy(&p_mlp->seek_pending); vlc_mutex_destroy(&p_mlp->mp_callback_lock); vlc_mutex_destroy(&p_mlp->object_lock); free(p_mlp); return NULL; }
/************************************************************************** * set_media_player (Public) **************************************************************************/ void libvlc_media_list_player_set_media_player(libvlc_media_list_player_t * p_mlp, libvlc_media_player_t * p_mi, libvlc_exception_t * p_e) { VLC_UNUSED(p_e); lock(p_mlp); if (p_mlp->p_mi) { uninstall_media_player_observer(p_mlp); libvlc_media_player_release(p_mlp->p_mi); } libvlc_media_player_retain(p_mi); p_mlp->p_mi = p_mi; install_media_player_observer(p_mlp); unlock(p_mlp); }