playlist_internal.h 5.18 KB
Newer Older
1 2 3 4
/*****************************************************************************
 * playlist_internal.h : Functions for use by the playlist
 *****************************************************************************
 * Copyright (C) 1999-2004 the VideoLAN team
Jean-Paul Saman's avatar
Jean-Paul Saman committed
5
 * $Id$
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * Authors: Samuel Hocevar <sam@zoy.org>
 *          Clément Stenac <zorglub@videolan.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

25 26 27
#ifndef __LIBVLC_PLAYLIST_INTERNAL_H
# define __LIBVLC_PLAYLIST_INTERNAL_H 1

28 29 30 31 32 33 34 35 36
/**
 *  \file
 *  This file contain internal structures and function prototypes related
 *  to the playlist in vlc
 *
 * \defgroup vlc_playlist Playlist
 * @{
 */

Clément Stenac's avatar
Clément Stenac committed
37
#include "input/input_internal.h"
38
#include <assert.h>
Clément Stenac's avatar
Clément Stenac committed
39

40 41 42 43 44 45 46 47
struct playlist_preparse_t
{
    VLC_COMMON_MEMBERS
    vlc_mutex_t     lock;
    int             i_waiting;
    input_item_t  **pp_waiting;
};

48
struct playlist_fetcher_t
49 50 51
{
    VLC_COMMON_MEMBERS
    vlc_mutex_t     lock;
52
    int             i_art_policy;
53
    int             i_waiting;
Rafaël Carré's avatar
Rafaël Carré committed
54
    input_item_t    **pp_waiting;
55 56

    DECL_ARRAY(playlist_album_t) albums;
57
};
58 59 60 61 62

/*****************************************************************************
 * Prototypes
 *****************************************************************************/

63 64 65 66
/* Global thread */
#define playlist_ThreadCreate(a) __playlist_ThreadCreate(VLC_OBJECT(a))
void        __playlist_ThreadCreate   ( vlc_object_t * );

67 68 69 70 71 72 73
/* Creation/Deletion */
playlist_t *playlist_Create   ( vlc_object_t * );

/* Engine */
void playlist_MainLoop( playlist_t * );
void playlist_LastLoop( playlist_t * );
void playlist_PreparseLoop( playlist_preparse_t * );
74
void playlist_FetcherLoop( playlist_fetcher_t * );
75

76
void ResetCurrentlyPlaying( playlist_t *, bool, playlist_item_t * );
77

78 79 80 81 82 83 84 85 86 87 88 89
/* Control */
playlist_item_t * playlist_NextItem  ( playlist_t * );
int playlist_PlayItem  ( playlist_t *, playlist_item_t * );

/* Load/Save */
int playlist_MLLoad( playlist_t *p_playlist );
int playlist_MLDump( playlist_t *p_playlist );

/**********************************************************************
 * Item management
 **********************************************************************/

90
void playlist_SendAddNotify( playlist_t *p_playlist, int i_item_id,
91
                             int i_node_id, bool b_signal );
92 93 94 95 96 97 98

/* Tree walking */
int playlist_GetAllEnabledChildren( playlist_t *p_playlist,
                                    playlist_item_t *p_node,
                                    playlist_item_t ***ppp_items );
playlist_item_t *playlist_GetNextLeaf( playlist_t *p_playlist,
                                    playlist_item_t *p_root,
99
                                    playlist_item_t *, bool, bool );
100 101
playlist_item_t *playlist_GetPrevLeaf( playlist_t *p_playlist,
                                    playlist_item_t *p_root,
102
                                    playlist_item_t *, bool, bool );
103 104 105
playlist_item_t *playlist_GetLastLeaf( playlist_t *p_playlist,
                                    playlist_item_t *p_root );

106 107 108 109
playlist_item_t *playlist_ItemFindFromInputAndRoot( playlist_t *p_playlist,
                                   int i_input_id, playlist_item_t *p_root,
                                   bool );

110
int playlist_DeleteFromItemId( playlist_t*, int );
111
int playlist_ItemDelete ( playlist_item_t * );
112

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
static inline void playlist_release_current_input( playlist_t * p_playlist )
{
    vlc_assert_locked( &p_playlist->object_lock );

    if( !p_playlist->p_input ) return;

    input_thread_t * p_input = p_playlist->p_input;
    p_playlist->p_input = NULL;

    /* Release the playlist lock, because we may get stuck
     * in vlc_object_release() for some time. */
    PL_UNLOCK;
    vlc_object_release( p_input );
    PL_LOCK;
}

static inline void playlist_set_current_input(
    playlist_t * p_playlist, input_thread_t * p_input )
{
    vlc_assert_locked( &p_playlist->object_lock );

    playlist_release_current_input( p_playlist );

    if( p_input )
    {
        vlc_object_yield( p_input );
        p_playlist->p_input = p_input;
    }
}


144 145 146 147
/**
 * @}
 */

148
#define PLAYLIST_DEBUG 1
149
//#undef PLAYLIST_DEBUG2
150 151

#ifdef PLAYLIST_DEBUG
152 153 154 155 156 157
 #define PL_DEBUG( msg, args... ) msg_Dbg( p_playlist, msg, ## args )
 #ifdef PLAYLIST_DEBUG2
  #define PL_DEBUG2( msg, args... ) msg_Dbg( p_playlist, msg, ## args )
 #else
  #define PL_DEBUG2( msg, args... ) {}
 #endif
158
#else
159 160
 #define PL_DEBUG( msg, args ... ) {}
 #define PL_DEBUG2( msg, args... ) {}
161 162
#endif

163
#define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null"
164
#endif /* !__LIBVLC_PLAYLIST_INTERNAL_H */