X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fplaylist_internal.h;h=6afec4a26cd504a792a4a00c0d49eee9b8d3be1f;hb=af77f36724c16ac64702074d5bd9941c46f233b2;hp=cbc4bab80ef44363eba468116a9e8166d4767aa9;hpb=b28e41253458f84e5003ad62ae0feb12083d0e3e;p=vlc diff --git a/src/playlist/playlist_internal.h b/src/playlist/playlist_internal.h index cbc4bab80e..6afec4a26c 100644 --- a/src/playlist/playlist_internal.h +++ b/src/playlist/playlist_internal.h @@ -1,8 +1,8 @@ /***************************************************************************** - * playlist_internal.h : Functions for use by the playlist + * playlist_internal.h : Playlist internals ***************************************************************************** - * Copyright (C) 1999-2004 the VideoLAN team - * $Id: vlc_playlist.h 16505 2006-09-03 21:53:38Z zorglub $ + * Copyright (C) 1999-2008 the VideoLAN team + * $Id$ * * Authors: Samuel Hocevar * Clément Stenac @@ -22,6 +22,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifndef __LIBVLC_PLAYLIST_INTERNAL_H +# define __LIBVLC_PLAYLIST_INTERNAL_H 1 + /** * \file * This file contain internal structures and function prototypes related @@ -31,57 +34,94 @@ * @{ */ -#include "input/input_internal.h" +#include "input/input_interface.h" +#include -struct playlist_preparse_t -{ - VLC_COMMON_MEMBERS - vlc_mutex_t lock; - int i_waiting; - input_item_t **pp_waiting; -}; +#include "art.h" +#include "fetcher.h" +#include "preparser.h" -typedef struct preparse_item_t -{ - input_item_t *p_item; - vlc_bool_t b_fetch_art; -} preparse_item_t; +typedef struct playlist_services_discovery_support_t { + /* the playlist items for category and onelevel */ + playlist_item_t *p_cat; + playlist_item_t *p_one; + services_discovery_t *p_sd; /**< Loaded service discovery modules */ + char *psz_name; +} vlc_sd_internal_t; -struct playlist_fetcher_t -{ - VLC_COMMON_MEMBERS - vlc_mutex_t lock; - int i_art_policy; - int i_waiting; - preparse_item_t *p_waiting; - DECL_ARRAY(playlist_album_t) albums; -}; +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)) /***************************************************************************** * Prototypes *****************************************************************************/ -/* Global thread */ -#define playlist_ThreadCreate(a) __playlist_ThreadCreate(VLC_OBJECT(a)) -void __playlist_ThreadCreate ( vlc_object_t * ); -int playlist_ThreadDestroy ( playlist_t * ); - /* Creation/Deletion */ -playlist_t *playlist_Create ( vlc_object_t * ); -void playlist_Destroy ( playlist_t * ); +playlist_t *playlist_Create( vlc_object_t * ); -/* Engine */ -void playlist_MainLoop( playlist_t * ); -void playlist_LastLoop( playlist_t * ); -void playlist_PreparseLoop( playlist_preparse_t * ); -void playlist_FetcherLoop( playlist_fetcher_t * ); +/* */ +void playlist_Activate( playlist_t * ); +void playlist_Deactivate( playlist_t * ); -void ResetCurrentlyPlaying( playlist_t *, vlc_bool_t, playlist_item_t * ); +/* */ +playlist_item_t *playlist_ItemNewFromInput( playlist_t *p_playlist, + input_item_t *p_input ); -/* Control */ -playlist_item_t * playlist_NextItem ( playlist_t * ); -int playlist_PlayItem ( playlist_t *, playlist_item_t * ); +/* Engine */ +playlist_item_t * get_current_status_item( playlist_t * p_playlist); +playlist_item_t * get_current_status_node( playlist_t * p_playlist ); +void set_current_status_item( playlist_t *, playlist_item_t * ); +void set_current_status_node( playlist_t *, playlist_item_t * ); /* Load/Save */ int playlist_MLLoad( playlist_t *p_playlist ); @@ -92,25 +132,25 @@ int playlist_MLDump( playlist_t *p_playlist ); **********************************************************************/ void playlist_SendAddNotify( playlist_t *p_playlist, int i_item_id, - int i_node_id, vlc_bool_t b_signal ); + int i_node_id, bool b_signal ); + +playlist_item_t * playlist_NodeAddInput( playlist_t *, input_item_t *, + playlist_item_t *,int , int, bool ); /* 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, - playlist_item_t *, vlc_bool_t, vlc_bool_t ); -playlist_item_t *playlist_GetPrevLeaf( playlist_t *p_playlist, - playlist_item_t *p_root, - playlist_item_t *, vlc_bool_t, vlc_bool_t ); -playlist_item_t *playlist_GetLastLeaf( playlist_t *p_playlist, - playlist_item_t *p_root ); +playlist_item_t *playlist_ItemFindFromInputAndRoot( playlist_t *p_playlist, + input_item_t *p_input, playlist_item_t *p_root, + bool ); +int playlist_DeleteFromInputInParent( playlist_t *, input_item_t *, + playlist_item_t *, bool ); int playlist_DeleteFromItemId( playlist_t*, int ); -int playlist_ItemDelete ( playlist_item_t * ); +int playlist_ItemRelease( playlist_item_t * ); + + +void playlist_NodesPairCreate( playlist_t *, const char *, playlist_item_t **, playlist_item_t **, bool ); +int playlist_NodeEmpty( playlist_t *, playlist_item_t *, bool ); -playlist_item_t *playlist_ItemGetByInputId( playlist_t*, int, playlist_item_t*); /** * @} @@ -132,3 +172,17 @@ playlist_item_t *playlist_ItemGetByInputId( playlist_t*, int, playlist_item_t*); #endif #define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null" + +#define PL_LOCK_IF( cond ) pl_lock_if( p_playlist, cond ) +static inline void pl_lock_if( playlist_t * p_playlist, bool cond ) +{ + if( cond ) PL_LOCK; else PL_ASSERT_LOCKED; +} + +#define PL_UNLOCK_IF( cond ) pl_unlock_if( p_playlist, cond ) +static inline void pl_unlock_if( playlist_t * p_playlist, bool cond ) +{ + if( cond ) PL_UNLOCK; +} + +#endif /* !__LIBVLC_PLAYLIST_INTERNAL_H */