/************************************************************************** * 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); }
/************************************************************************** * 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); }
/************************************************************************** * release (Public) **************************************************************************/ void libvlc_media_list_player_release(libvlc_media_list_player_t * p_mlp) { if (!p_mlp) return; lock(p_mlp); p_mlp->i_refcount--; if (p_mlp->i_refcount > 0) { unlock(p_mlp); return; } assert(p_mlp->i_refcount == 0); unlock(p_mlp); vlc_cancel(p_mlp->thread); vlc_join(p_mlp->thread, NULL); lock(p_mlp); /* Keep the lock(), because the uninstall functions * check for it. That's convenient. */ uninstall_media_player_observer(p_mlp); libvlc_media_player_release(p_mlp->p_mi); if (p_mlp->p_mlist) { uninstall_playlist_observer(p_mlp); libvlc_media_list_release(p_mlp->p_mlist); } unlock(p_mlp); libvlc_event_manager_destroy(&p_mlp->event_manager); 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->current_playing_item_path); free(p_mlp); }