コード例 #1
0
ファイル: media_list_player.c プロジェクト: FLYKingdom/vlc
/**************************************************************************
 *       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 */
}
コード例 #2
0
ファイル: media_list_player.c プロジェクト: FLYKingdom/vlc
/**************************************************************************
 *       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;
}
コード例 #3
0
ファイル: media_list_player.c プロジェクト: mstorsjo/vlc
/**************************************************************************
 *        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);
}
コード例 #4
0
ファイル: media_list_player.c プロジェクト: Flameeyes/vlc
/**************************************************************************
 *        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);
}
コード例 #5
0
ファイル: media_list_player.c プロジェクト: mstorsjo/vlc
/**************************************************************************
 *       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);
}
コード例 #6
0
ファイル: media_list_player.c プロジェクト: FLYKingdom/vlc
/**************************************************************************
 *        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);
}
コード例 #7
0
ファイル: media_list_player.c プロジェクト: mstorsjo/vlc
/**************************************************************************
 *         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);
}