VLC  2.1.0-git
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
playlist_internal.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * playlist_internal.h : Playlist internals
3  *****************************************************************************
4  * Copyright (C) 1999-2008 VLC authors and VideoLAN
5  * $Id: 9b6c000b31c6f41bcaa57e6dc49d4ebd88ca830f $
6  *
7  * Authors: Samuel Hocevar <sam@zoy.org>
8  * ClĂ©ment Stenac <zorglub@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24 
25 #ifndef __LIBVLC_PLAYLIST_INTERNAL_H
26 # define __LIBVLC_PLAYLIST_INTERNAL_H 1
27 
28 /**
29  * \file
30  * This file contain internal structures and function prototypes related
31  * to the playlist in vlc
32  *
33  * \defgroup vlc_playlist Playlist
34  * @{
35  */
36 
37 #include "input/input_interface.h"
38 #include <assert.h>
39 
40 #include "art.h"
41 #include "fetcher.h"
42 #include "preparser.h"
43 
45 
46 typedef struct playlist_private_t
47 {
49  playlist_preparser_t *p_preparser; /**< Preparser data */
50  playlist_fetcher_t *p_fetcher; /**< Meta and art fetcher data */
51 
52  playlist_item_array_t items_to_delete; /**< Array of items and nodes to
53  delete... At the very end. This sucks. */
54 
56  int i_sds; /**< Number of service discovery modules */
57  input_thread_t * p_input; /**< the input thread associated
58  * with the current item */
59  input_resource_t * p_input_resource; /**< input resources */
60  struct {
61  /* Current status. These fields are readonly, only the playlist
62  * main loop can touch it*/
63  playlist_status_t i_status; /**< Current status of playlist */
64  playlist_item_t * p_item; /**< Currently playing/active item */
65  playlist_item_t * p_node; /**< Current node to play from */
66  } status;
67 
68  struct {
69  /* Request. Use this to give orders to the playlist main loop */
70  playlist_status_t i_status; /**< requested playlist status */
71  playlist_item_t * p_node; /**< requested node to play from */
72  playlist_item_t * p_item; /**< requested item to play in the node */
73 
74  int i_skip; /**< Number of items to skip */
75 
76  bool b_request;/**< Set to true by the requester
77  The playlist sets it back to false
78  when processing the request */
79  vlc_mutex_t lock; /**< Lock to protect request */
80  } request;
81 
82  vlc_thread_t thread; /**< engine thread */
83  vlc_mutex_t lock; /**< dah big playlist global lock */
84  vlc_cond_t signal; /**< wakes up the playlist engine thread */
85  bool killed; /**< playlist is shutting down */
86 
87  int i_last_playlist_id; /**< Last id to an item */
88  bool b_reset_currently_playing; /** Reset current item array */
89 
90  bool b_tree; /**< Display as a tree */
91  bool b_doing_ml; /**< Doing media library stuff get quicker */
94 
95 #define pl_priv( pl ) ((playlist_private_t *)(pl))
96 
97 /*****************************************************************************
98  * Prototypes
99  *****************************************************************************/
100 
101 /* Creation/Deletion */
102 void playlist_Destroy( playlist_t * );
103 void playlist_Activate( playlist_t * );
104 
105 /* */
107  input_item_t *p_input );
108 
109 /* Engine */
114 
115 /* Load/Save */
116 int playlist_MLLoad( playlist_t *p_playlist );
117 int playlist_MLDump( playlist_t *p_playlist );
118 
119 /**********************************************************************
120  * Item management
121  **********************************************************************/
122 
123 void playlist_SendAddNotify( playlist_t *p_playlist, int i_item_id,
124  int i_node_id, bool b_signal );
125 
127  playlist_item_t *,int , int, bool );
128 
130  playlist_item_t *, input_item_node_t *, int, bool );
131 
132 /* Tree walking */
134  input_item_t *p_input, playlist_item_t *p_root,
135  bool );
136 
138  playlist_item_t *, bool );
141 
143 int playlist_DeleteItem( playlist_t * p_playlist, playlist_item_t *, bool);
144 
145 void ResetCurrentlyPlaying( playlist_t *p_playlist, playlist_item_t *p_cur );
146 void ResyncCurrentIndex( playlist_t *p_playlist, playlist_item_t *p_cur );
147 
148 /**
149  * @}
150  */
151 
152 #define PLAYLIST_DEBUG 1
153 //#undef PLAYLIST_DEBUG2
154 
155 #ifdef PLAYLIST_DEBUG
156  #define PL_DEBUG( ... ) msg_Dbg( p_playlist, __VA_ARGS__ )
157  #ifdef PLAYLIST_DEBUG2
158  #define PL_DEBUG2( msg, ... ) msg_Dbg( p_playlist, __VA_ARGS__ )
159  #else
160  #define PL_DEBUG2( msg, ... ) {}
161  #endif
162 #else
163  #define PL_DEBUG( msg, ... ) {}
164  #define PL_DEBUG2( msg, ... ) {}
165 #endif
166 
167 #define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null"
168 
169 #define PL_LOCK_IF( cond ) pl_lock_if( p_playlist, cond )
170 static inline void pl_lock_if( playlist_t * p_playlist, bool cond )
171 {
172  if( cond ) PL_LOCK; else PL_ASSERT_LOCKED;
173 }
174 
175 #define PL_UNLOCK_IF( cond ) pl_unlock_if( p_playlist, cond )
176 static inline void pl_unlock_if( playlist_t * p_playlist, bool cond )
177 {
178  if( cond ) PL_UNLOCK;
179 }
180 
181 #endif /* !__LIBVLC_PLAYLIST_INTERNAL_H */