+typedef struct playlist_private_t
+{
+ playlist_t public_data;
+ playlist_preparser_t *p_preparser; /**< Preparser data */
+ playlist_fetcher_t *p_fetcher; /**< Meta and art fetcher data */
+
+ playlist_item_array_t items_to_delete; /**< Array of items and nodes to
+ delete... At the very end. This sucks. */
+
+ vlc_sd_internal_t **pp_sds;
+ int i_sds; /**< Number of service discovery modules */
+ input_thread_t * p_input; /**< the input thread associated
+ * with the current item */
+ input_resource_t * p_input_resource; /**< input resources */
+ struct {
+ /* Current status. These fields are readonly, only the playlist
+ * main loop can touch it*/
+ playlist_status_t i_status; /**< Current status of playlist */
+ playlist_item_t * p_item; /**< Currently playing/active item */
+ playlist_item_t * p_node; /**< Current node to play from */
+ } status;
+
+ struct {
+ /* Request. Use this to give orders to the playlist main loop */
+ playlist_status_t i_status; /**< requested playlist status */
+ playlist_item_t * p_node; /**< requested node to play from */
+ playlist_item_t * p_item; /**< requested item to play in the node */
+
+ int i_skip; /**< Number of items to skip */
+
+ bool b_request;/**< Set to true by the requester
+ The playlist sets it back to false
+ when processing the request */
+ vlc_mutex_t lock; /**< Lock to protect request */
+ } request;
+
+ vlc_thread_t thread; /**< engine thread */
+ vlc_mutex_t lock; /**< dah big playlist global lock */
+ vlc_cond_t signal; /**< wakes up the playlist engine thread */
+
+ int i_last_playlist_id; /**< Last id to an item */
+ bool b_reset_currently_playing; /** Reset current item array */
+
+ bool b_tree; /**< Display as a tree */
+ bool b_doing_ml; /**< Doing media library stuff get quicker */
+ bool b_auto_preparse;
+ mtime_t last_rebuild_date;
+
+} playlist_private_t;
+
+#define pl_priv( pl ) ((playlist_private_t *)(pl))