2001-02-08 05:43:28 +01:00
|
|
|
/*****************************************************************************
|
* ALL: the first libvlc commit.
As for video output 4, this breaks almost everything, but I'll slowly
do what remains to be fixed during the weekend.
Changes in vlc:
===============
* vlc is now a very small program (20 lines) which uses the libvlc API;
it is quite simple for the moment but can be extended in the future.
* interfaces, decoders, video outputs, etc. are now almost the same
objects (yes, I know, this is C++ redone in C) and are structured in
a tree. More about this later, but basically it allows the following
nice features:
- several interfaces
- several playlists with several outputs
- input plugins spawning helper interfaces (will be used for DVD menus)
- anything spawning anything; I swear there are useful uses for this!
* libvlc can be used in other programs; I'm currently writing a Mozilla
plugin for my employer.
Things currently broken:
========================
* most interfaces, most ports
* the playlist handling (almost finished rewriting this though). This means
no file can be played from the GUI, you need to use the commandline. This
also means it segfaults at EOF, when exiting the program, and it sometimes
refuses to open a file when asked to.
2002-06-01 14:32:02 +02:00
|
|
|
* vlc_playlist.h : Playlist functions
|
2001-02-08 05:43:28 +01:00
|
|
|
*****************************************************************************
|
2005-07-09 08:17:09 +02:00
|
|
|
* Copyright (C) 1999-2004 the VideoLAN team
|
2004-03-31 22:52:31 +02:00
|
|
|
* $Id$
|
2001-02-08 05:43:28 +01:00
|
|
|
*
|
2001-02-08 08:24:25 +01:00
|
|
|
* Authors: Samuel Hocevar <sam@zoy.org>
|
2001-02-08 05:43:28 +01:00
|
|
|
*
|
|
|
|
* 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.
|
2003-10-06 18:23:30 +02:00
|
|
|
*
|
2001-02-08 05:43:28 +01:00
|
|
|
* 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
|
2006-01-13 00:10:04 +01:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
2001-02-08 05:43:28 +01:00
|
|
|
*****************************************************************************/
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
#ifndef _VLC_PLAYLIST_H_
|
|
|
|
#define _VLC_PLAYLIST_H_
|
|
|
|
|
2003-08-14 15:02:55 +02:00
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
* This file contain structures and function prototypes related
|
|
|
|
* to the playlist in vlc
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \defgroup vlc_playlist Playlist
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
2004-01-11 01:45:06 +01:00
|
|
|
/**
|
|
|
|
* playlist export helper structure
|
|
|
|
*/
|
|
|
|
struct playlist_export_t
|
|
|
|
{
|
|
|
|
char *psz_filename;
|
|
|
|
FILE *p_file;
|
2006-05-14 20:29:00 +02:00
|
|
|
playlist_item_t *p_root;
|
2004-11-06 12:17:46 +01:00
|
|
|
};
|
|
|
|
|
2003-08-14 15:02:55 +02:00
|
|
|
/**
|
2004-11-06 12:17:46 +01:00
|
|
|
* playlist item / node
|
2003-08-14 15:02:55 +02:00
|
|
|
* \see playlist_t
|
|
|
|
*/
|
2002-07-20 20:01:43 +02:00
|
|
|
struct playlist_item_t
|
2001-02-08 05:43:28 +01:00
|
|
|
{
|
2006-05-14 20:29:00 +02:00
|
|
|
input_item_t *p_input; /**< input item descriptor */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
|
|
|
/* Tree specific fields */
|
|
|
|
int i_children; /**< Number of children
|
|
|
|
-1 if not a node */
|
|
|
|
playlist_item_t **pp_children; /**< Children nodes/items */
|
2006-05-14 20:29:00 +02:00
|
|
|
playlist_item_t *p_parent; /**< Item parent */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
int i_id; /**< Playlist item specific id */
|
2004-11-17 22:38:23 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
uint8_t i_flags; /**< Flags */
|
* ALL: the first libvlc commit.
As for video output 4, this breaks almost everything, but I'll slowly
do what remains to be fixed during the weekend.
Changes in vlc:
===============
* vlc is now a very small program (20 lines) which uses the libvlc API;
it is quite simple for the moment but can be extended in the future.
* interfaces, decoders, video outputs, etc. are now almost the same
objects (yes, I know, this is C++ redone in C) and are structured in
a tree. More about this later, but basically it allows the following
nice features:
- several interfaces
- several playlists with several outputs
- input plugins spawning helper interfaces (will be used for DVD menus)
- anything spawning anything; I swear there are useful uses for this!
* libvlc can be used in other programs; I'm currently writing a Mozilla
plugin for my employer.
Things currently broken:
========================
* most interfaces, most ports
* the playlist handling (almost finished rewriting this though). This means
no file can be played from the GUI, you need to use the commandline. This
also means it segfaults at EOF, when exiting the program, and it sometimes
refuses to open a file when asked to.
2002-06-01 14:32:02 +02:00
|
|
|
};
|
2001-02-08 05:43:28 +01:00
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
#define PLAYLIST_SAVE_FLAG 0x0001 /**< Must it be saved */
|
|
|
|
#define PLAYLIST_SKIP_FLAG 0x0002 /**< Must playlist skip after it ? */
|
|
|
|
#define PLAYLIST_DBL_FLAG 0x0004 /**< Is it disabled ? */
|
|
|
|
#define PLAYLIST_RO_FLAG 0x0008 /**< Write-enabled ? */
|
|
|
|
#define PLAYLIST_REMOVE_FLAG 0x0010 /**< Remove this item at the end */
|
|
|
|
#define PLAYLIST_EXPANDED_FLAG 0x0020 /**< Expanded node */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2003-08-14 15:02:55 +02:00
|
|
|
/**
|
|
|
|
* Playlist status
|
|
|
|
*/
|
2006-05-14 20:29:00 +02:00
|
|
|
typedef enum
|
|
|
|
{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t;
|
2003-08-14 15:02:55 +02:00
|
|
|
|
2004-11-08 19:19:51 +01:00
|
|
|
|
|
|
|
struct services_discovery_t
|
|
|
|
{
|
|
|
|
VLC_COMMON_MEMBERS
|
2005-07-10 10:55:16 +02:00
|
|
|
char *psz_module;
|
2004-11-08 19:19:51 +01:00
|
|
|
|
|
|
|
module_t *p_module;
|
|
|
|
|
|
|
|
services_discovery_sys_t *p_sys;
|
|
|
|
void (*pf_run) ( services_discovery_t *);
|
|
|
|
};
|
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
/** Structure containing information about the playlist */
|
2002-07-20 20:01:43 +02:00
|
|
|
struct playlist_t
|
2001-02-08 05:43:28 +01:00
|
|
|
{
|
* ALL: the first libvlc commit.
As for video output 4, this breaks almost everything, but I'll slowly
do what remains to be fixed during the weekend.
Changes in vlc:
===============
* vlc is now a very small program (20 lines) which uses the libvlc API;
it is quite simple for the moment but can be extended in the future.
* interfaces, decoders, video outputs, etc. are now almost the same
objects (yes, I know, this is C++ redone in C) and are structured in
a tree. More about this later, but basically it allows the following
nice features:
- several interfaces
- several playlists with several outputs
- input plugins spawning helper interfaces (will be used for DVD menus)
- anything spawning anything; I swear there are useful uses for this!
* libvlc can be used in other programs; I'm currently writing a Mozilla
plugin for my employer.
Things currently broken:
========================
* most interfaces, most ports
* the playlist handling (almost finished rewriting this though). This means
no file can be played from the GUI, you need to use the commandline. This
also means it segfaults at EOF, when exiting the program, and it sometimes
refuses to open a file when asked to.
2002-06-01 14:32:02 +02:00
|
|
|
VLC_COMMON_MEMBERS
|
2003-08-14 15:02:55 +02:00
|
|
|
/**
|
|
|
|
\name playlist_t
|
|
|
|
These members are uniq to playlist_t
|
|
|
|
*/
|
|
|
|
/*@{*/
|
2003-10-06 18:23:30 +02:00
|
|
|
int i_enabled; /**< How many items are enabled ? */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
/* Arrays of items */
|
2004-11-06 12:17:46 +01:00
|
|
|
int i_size; /**< total size of the list */
|
2003-08-14 15:02:55 +02:00
|
|
|
playlist_item_t ** pp_items; /**< array of pointers to the
|
|
|
|
* playlist items */
|
2005-04-09 16:53:38 +02:00
|
|
|
int i_all_size; /**< size of list of items and nodes */
|
|
|
|
playlist_item_t ** pp_all_items; /**< array of pointers to the
|
|
|
|
* playlist items and nodes */
|
2006-05-14 20:29:00 +02:00
|
|
|
int i_input_items;
|
2006-06-14 22:09:51 +02:00
|
|
|
input_item_t ** pp_input_items;
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-09-02 18:59:50 +02:00
|
|
|
int i_random; /**< Number of candidates for random */
|
|
|
|
playlist_item_t ** pp_random; /**< Random candidate items */
|
|
|
|
int i_random_index; /**< Current random item */
|
|
|
|
vlc_bool_t b_reset_random; /**< Recreate random array ?*/
|
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
int i_last_playlist_id; /**< Last id to an item */
|
|
|
|
int i_last_input_id ; /**< Last id on an input */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
services_discovery_t **pp_sds;
|
|
|
|
int i_sds;
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
/* Predefined items */
|
2006-05-14 20:29:00 +02:00
|
|
|
playlist_item_t * p_root_category;
|
|
|
|
playlist_item_t * p_root_onelevel;
|
|
|
|
playlist_item_t * p_local_category; /** < "Playlist" in CATEGORY view */
|
|
|
|
playlist_item_t * p_ml_category; /** < "Library" in CATEGORY view */
|
|
|
|
playlist_item_t * p_local_onelevel; /** < "Playlist" in ONELEVEL view */
|
|
|
|
playlist_item_t * p_ml_onelevel; /** < "Library" in ONELEVEL iew */
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-08-26 18:51:55 +02:00
|
|
|
vlc_bool_t b_always_tree;/**< Always display as tree */
|
|
|
|
vlc_bool_t b_never_tree;/**< Never display as tree */
|
|
|
|
|
2006-09-03 19:31:02 +02:00
|
|
|
vlc_bool_t b_doing_ml; /**< Doing media library stuff, */
|
|
|
|
/*get quicker */
|
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
/* Runtime */
|
|
|
|
input_thread_t * p_input; /**< the input thread associated
|
|
|
|
* with the current item */
|
|
|
|
int i_sort; /**< Last sorting applied to the playlist */
|
|
|
|
int i_order; /**< Last ordering applied to the playlist */
|
|
|
|
mtime_t i_vout_destroyed_date;
|
|
|
|
mtime_t i_sout_destroyed_date;
|
|
|
|
playlist_preparse_t *p_preparse; /**< Preparser object */
|
2004-11-08 19:19:51 +01:00
|
|
|
|
2006-06-14 22:09:51 +02:00
|
|
|
vlc_mutex_t gc_lock; /**< Lock to protect the garbage collection */
|
2006-06-08 20:59:14 +02:00
|
|
|
|
2004-11-06 12:17:46 +01:00
|
|
|
struct {
|
2006-05-14 20:29:00 +02:00
|
|
|
/* Current status. These fields are readonly, only the playlist
|
|
|
|
* main loop can touch it*/
|
2004-11-06 12:17:46 +01:00
|
|
|
playlist_status_t i_status; /**< Current status of playlist */
|
|
|
|
playlist_item_t * p_item; /**< Currently playing/active item */
|
2006-05-14 20:29:00 +02:00
|
|
|
playlist_item_t * p_node; /**< Current node to play from */
|
2004-11-06 12:17:46 +01:00
|
|
|
} status;
|
|
|
|
|
|
|
|
struct {
|
2006-05-14 20:29:00 +02:00
|
|
|
/* Request. Use this to give orders to the playlist main loop */
|
|
|
|
int i_status; /**< requested playlist status */
|
2004-11-06 12:17:46 +01:00
|
|
|
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 */
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
vlc_bool_t 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 */
|
2004-11-06 12:17:46 +01:00
|
|
|
} request;
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
// Playlist-unrelated fields
|
2006-06-14 22:09:51 +02:00
|
|
|
interaction_t *p_interaction; /**< Interaction manager */
|
|
|
|
global_stats_t *p_stats; /**< Global statistics */
|
2003-08-14 15:02:55 +02:00
|
|
|
/*@}*/
|
* ALL: the first libvlc commit.
As for video output 4, this breaks almost everything, but I'll slowly
do what remains to be fixed during the weekend.
Changes in vlc:
===============
* vlc is now a very small program (20 lines) which uses the libvlc API;
it is quite simple for the moment but can be extended in the future.
* interfaces, decoders, video outputs, etc. are now almost the same
objects (yes, I know, this is C++ redone in C) and are structured in
a tree. More about this later, but basically it allows the following
nice features:
- several interfaces
- several playlists with several outputs
- input plugins spawning helper interfaces (will be used for DVD menus)
- anything spawning anything; I swear there are useful uses for this!
* libvlc can be used in other programs; I'm currently writing a Mozilla
plugin for my employer.
Things currently broken:
========================
* most interfaces, most ports
* the playlist handling (almost finished rewriting this though). This means
no file can be played from the GUI, you need to use the commandline. This
also means it segfaults at EOF, when exiting the program, and it sometimes
refuses to open a file when asked to.
2002-06-01 14:32:02 +02:00
|
|
|
};
|
2001-02-08 05:43:28 +01:00
|
|
|
|
2004-11-14 00:06:53 +01:00
|
|
|
/* Helper to add an item */
|
|
|
|
struct playlist_add_t
|
|
|
|
{
|
2005-04-13 19:43:12 +02:00
|
|
|
int i_node;
|
|
|
|
int i_item;
|
2004-11-14 00:06:53 +01:00
|
|
|
int i_position;
|
|
|
|
};
|
|
|
|
|
2004-01-10 15:24:33 +01:00
|
|
|
#define SORT_ID 0
|
|
|
|
#define SORT_TITLE 1
|
2004-11-21 18:45:09 +01:00
|
|
|
#define SORT_TITLE_NODES_FIRST 2
|
2006-08-07 19:26:02 +02:00
|
|
|
#define SORT_ARTIST 3
|
2005-04-10 20:40:52 +02:00
|
|
|
#define SORT_GENRE 4
|
|
|
|
#define SORT_RANDOM 5
|
|
|
|
#define SORT_DURATION 6
|
|
|
|
#define SORT_TITLE_NUMERIC 7
|
2005-09-15 19:42:24 +02:00
|
|
|
#define SORT_ALBUM 8
|
2003-11-26 11:45:21 +01:00
|
|
|
|
2004-01-10 04:36:03 +01:00
|
|
|
#define ORDER_NORMAL 0
|
|
|
|
#define ORDER_REVERSE 1
|
2003-09-08 14:02:16 +02:00
|
|
|
|
2001-02-09 00:40:26 +01:00
|
|
|
/*****************************************************************************
|
|
|
|
* Prototypes
|
|
|
|
*****************************************************************************/
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
/* Global thread */
|
|
|
|
#define playlist_ThreadCreate(a) __playlist_ThreadCreate(VLC_OBJECT(a))
|
|
|
|
playlist_t *__playlist_ThreadCreate ( vlc_object_t * );
|
|
|
|
int playlist_ThreadDestroy ( playlist_t * );
|
|
|
|
|
|
|
|
/* Helpers */
|
|
|
|
#define PL_LOCK vlc_mutex_lock( &p_playlist->object_lock );
|
|
|
|
#define PL_UNLOCK vlc_mutex_unlock( &p_playlist->object_lock );
|
|
|
|
|
2004-11-06 12:17:46 +01:00
|
|
|
/* Playlist control */
|
2005-04-09 16:53:38 +02:00
|
|
|
#define playlist_Play(p) playlist_LockControl(p,PLAYLIST_PLAY )
|
|
|
|
#define playlist_Pause(p) playlist_LockControl(p,PLAYLIST_PAUSE )
|
|
|
|
#define playlist_Stop(p) playlist_LockControl(p,PLAYLIST_STOP )
|
|
|
|
#define playlist_Next(p) playlist_LockControl(p,PLAYLIST_SKIP, 1)
|
|
|
|
#define playlist_Prev(p) playlist_LockControl(p,PLAYLIST_SKIP, -1)
|
|
|
|
#define playlist_Skip(p,i) playlist_LockControl(p,PLAYLIST_SKIP, i)
|
2004-01-05 13:59:43 +01:00
|
|
|
|
2004-11-06 12:17:46 +01:00
|
|
|
VLC_EXPORT( int, playlist_Control, ( playlist_t *, int, ... ) );
|
2005-04-09 16:53:38 +02:00
|
|
|
VLC_EXPORT( int, playlist_LockControl, ( playlist_t *, int, ... ) );
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
VLC_EXPORT( void, playlist_Clear, ( playlist_t * ) );
|
|
|
|
VLC_EXPORT( void, playlist_LockClear, ( playlist_t * ) );
|
* ALL: the first libvlc commit.
As for video output 4, this breaks almost everything, but I'll slowly
do what remains to be fixed during the weekend.
Changes in vlc:
===============
* vlc is now a very small program (20 lines) which uses the libvlc API;
it is quite simple for the moment but can be extended in the future.
* interfaces, decoders, video outputs, etc. are now almost the same
objects (yes, I know, this is C++ redone in C) and are structured in
a tree. More about this later, but basically it allows the following
nice features:
- several interfaces
- several playlists with several outputs
- input plugins spawning helper interfaces (will be used for DVD menus)
- anything spawning anything; I swear there are useful uses for this!
* libvlc can be used in other programs; I'm currently writing a Mozilla
plugin for my employer.
Things currently broken:
========================
* most interfaces, most ports
* the playlist handling (almost finished rewriting this though). This means
no file can be played from the GUI, you need to use the commandline. This
also means it segfaults at EOF, when exiting the program, and it sometimes
refuses to open a file when asked to.
2002-06-01 14:32:02 +02:00
|
|
|
|
2004-12-10 19:58:22 +01:00
|
|
|
VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) );
|
2005-08-20 12:17:20 +02:00
|
|
|
VLC_EXPORT( int, playlist_PreparseEnqueueItem, (playlist_t *, playlist_item_t *) );
|
2004-01-05 13:59:43 +01:00
|
|
|
|
2004-11-08 19:19:51 +01:00
|
|
|
/* Services discovery */
|
|
|
|
|
|
|
|
VLC_EXPORT( int, playlist_ServicesDiscoveryAdd, (playlist_t *, const char *));
|
2004-11-17 22:38:23 +01:00
|
|
|
VLC_EXPORT( int, playlist_ServicesDiscoveryRemove, (playlist_t *, const char *));
|
2004-11-08 19:19:51 +01:00
|
|
|
VLC_EXPORT( int, playlist_AddSDModules, (playlist_t *, char *));
|
2004-11-09 00:47:32 +01:00
|
|
|
VLC_EXPORT( vlc_bool_t, playlist_IsServicesDiscoveryLoaded, ( playlist_t *,const char *));
|
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/* Playlist sorting */
|
|
|
|
VLC_EXPORT( int, playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
|
|
|
|
VLC_EXPORT( int, playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
|
|
|
|
|
|
|
|
/* Load/Save */
|
|
|
|
VLC_EXPORT( int, playlist_Import, ( playlist_t *, const char *, playlist_item_t *, vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( int, playlist_Export, ( playlist_t *, const char *, playlist_item_t *, const char * ) );
|
|
|
|
|
|
|
|
/********************************************************
|
|
|
|
* Item management
|
|
|
|
********************************************************/
|
|
|
|
|
|
|
|
/*************************** Item creation **************************/
|
2004-11-08 19:19:51 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
VLC_EXPORT( playlist_item_t* , playlist_ItemNewWithType, ( vlc_object_t *,const char *,const char *, int , const char **, int, int) );
|
2006-08-11 15:32:42 +02:00
|
|
|
|
|
|
|
#define playlist_ItemNew( a , b, c ) __playlist_ItemNew(VLC_OBJECT(a) , b , c )
|
|
|
|
/** Create a new item, without adding it to the playlist
|
|
|
|
* \param p_obj a vlc object (anyone will do)
|
|
|
|
* \param psz_uri the mrl of the item
|
|
|
|
* \param psz_name a text giving a name or description of the item
|
|
|
|
* \return the new item or NULL on failure
|
|
|
|
*/
|
|
|
|
static inline playlist_item_t * __playlist_ItemNew( vlc_object_t *p_obj,
|
|
|
|
const char *psz_uri, const char *psz_name )
|
|
|
|
{
|
|
|
|
/* 0 = ITEM_TYPE_UNKNOWN */
|
|
|
|
return playlist_ItemNewWithType( p_obj, psz_uri, psz_name, 0, NULL, -1,0);
|
|
|
|
}
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
#define playlist_ItemNewFromInput(a,b) __playlist_ItemNewFromInput(VLC_OBJECT(a),b)
|
|
|
|
VLC_EXPORT( playlist_item_t *, __playlist_ItemNewFromInput, ( vlc_object_t *p_obj,input_item_t *p_input ) );
|
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/*************************** Item deletion **************************/
|
2004-11-17 22:38:23 +01:00
|
|
|
VLC_EXPORT( int, playlist_ItemDelete, ( playlist_item_t * ) );
|
2006-08-11 15:32:42 +02:00
|
|
|
VLC_EXPORT( int, playlist_DeleteAllFromInput, ( playlist_t *, int ) );
|
|
|
|
VLC_EXPORT( int, playlist_DeleteFromInput, ( playlist_t *, int, playlist_item_t *, vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( int, playlist_DeleteFromItemId, ( playlist_t *, int ) );
|
|
|
|
VLC_EXPORT( int, playlist_LockDelete, ( playlist_t *, int ) );
|
|
|
|
VLC_EXPORT( int, playlist_LockDeleteAllFromInput, ( playlist_t *, int ) );
|
2006-05-14 20:29:00 +02:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/*************************** Item fields accessors **************************/
|
2004-11-06 12:17:46 +01:00
|
|
|
VLC_EXPORT( int, playlist_ItemSetName, (playlist_item_t *, char * ) );
|
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/******************** Item addition ********************/
|
|
|
|
VLC_EXPORT( int, playlist_Add, ( playlist_t *, const char *, const char *, int, int, vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( int, playlist_AddExt, ( playlist_t *, const char *, const char *, int, int, mtime_t, const char **,int, vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( int, playlist_AddInput, ( playlist_t *, input_item_t *,int , int, vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_NodeAddInput, ( playlist_t *, input_item_t *,playlist_item_t *,int , int ) );
|
|
|
|
VLC_EXPORT( void, playlist_NodeAddItem, ( playlist_t *, playlist_item_t *, playlist_item_t *,int , int ) );
|
|
|
|
VLC_EXPORT( int, playlist_BothAddInput, ( playlist_t *, input_item_t *,playlist_item_t *,int , int ) );
|
|
|
|
VLC_EXPORT( void, playlist_AddWhereverNeeded, (playlist_t* , input_item_t*, playlist_item_t*,playlist_item_t*,vlc_bool_t, int ) );
|
Options as infos were bad in several ways: it broke PLAYLIST_GO, used
much memory, and was inconsistent, especially with input_CreateThread
taking an array of options
* Revert to using array of options
* To add an item with options:
- either use playlist_ItemNew, ItemAddOption, and then AddItem
(useful if you don't have all your options in an array)
- either use playlist_AddExt (use this if all your options are
already in an array)
* To add an item without options: use playlist_Add
You can still add options after an item has been added by using either
playlist_AddOption or playlist_ItemAddOption
* Attempt to improve API and solve thread safety issues.
- playlist_Item* functions allow to touch items only.
p_item->lock must be used when needed
(playlist_ItemNew, playlist_ItemDelete, playlist_Item*Info,
playlist_ItemSet* )
- playlist_ItemGetById and ItemGetByPos give you playlist_items
for GetByPos, you should have the playlist lock
At the moment, the playlist_Set* and playlist_*Info functions are kept (they work with position) but should be avoided.
2004-01-29 18:51:08 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/** Add a MRL into the playlist.
|
|
|
|
* \see playlist_Add
|
|
|
|
*/
|
|
|
|
static inline int playlist_PlaylistAdd( playlist_t *p_playlist,
|
|
|
|
const char *psz_uri, const char *psz_name,
|
|
|
|
int i_mode, int i_pos )
|
|
|
|
{
|
|
|
|
return playlist_Add( p_playlist, psz_uri, psz_name, i_mode, i_pos,
|
|
|
|
VLC_TRUE);
|
|
|
|
}
|
2006-05-14 20:29:00 +02:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/** Add a MRL to the media library
|
|
|
|
* \see playlist_Add
|
|
|
|
*/
|
|
|
|
static inline int playlist_MLAdd( playlist_t *p_playlist, const char *psz_uri,
|
|
|
|
const char *psz_name, int i_mode, int i_pos )
|
|
|
|
{
|
|
|
|
return playlist_Add( p_playlist, psz_uri, psz_name, i_mode, i_pos,
|
|
|
|
VLC_FALSE );
|
|
|
|
}
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/** Add a MRL to the playlist, with duration and options given
|
|
|
|
* \see playlist_AddExt
|
|
|
|
*/
|
|
|
|
static inline int playlist_PlaylistAddExt( playlist_t *p_playlist,
|
|
|
|
const char * psz_uri, const char *psz_name, int i_mode, int i_pos,
|
|
|
|
mtime_t i_duration, const char **ppsz_options, int i_options )
|
|
|
|
{
|
|
|
|
return playlist_AddExt( p_playlist, psz_uri, psz_name, i_mode, i_pos,
|
|
|
|
i_duration, ppsz_options, i_options, VLC_TRUE );
|
|
|
|
}
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/** Add a MRL to the media library, with duration and options given
|
|
|
|
* \see playlist_AddExt
|
|
|
|
*/
|
|
|
|
static inline int playlist_MLAddExt( playlist_t *p_playlist,
|
|
|
|
const char * psz_uri, const char *psz_name, int i_mode, int i_pos,
|
|
|
|
mtime_t i_duration, const char **ppsz_options, int i_options )
|
|
|
|
{
|
|
|
|
return playlist_AddExt( p_playlist, psz_uri, psz_name, i_mode, i_pos,
|
|
|
|
i_duration, ppsz_options, i_options, VLC_FALSE );
|
|
|
|
}
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/** Add an input item to the playlist node
|
|
|
|
* \see playlist_AddInput
|
|
|
|
*/
|
|
|
|
static inline int playlist_PlaylistAddInput( playlist_t* p_playlist,
|
|
|
|
input_item_t *p_input, int i_mode, int i_pos )
|
|
|
|
{
|
|
|
|
return playlist_AddInput( p_playlist, p_input, i_mode, i_pos, VLC_TRUE );
|
|
|
|
}
|
2004-11-06 12:17:46 +01:00
|
|
|
|
2006-09-05 08:09:42 +02:00
|
|
|
/** Add an input item to the media library
|
2006-08-11 15:32:42 +02:00
|
|
|
* \see playlist_AddInput
|
|
|
|
*/
|
|
|
|
static inline int playlist_MLAddInput( playlist_t* p_playlist,
|
|
|
|
input_item_t *p_input, int i_mode, int i_pos )
|
|
|
|
{
|
|
|
|
return playlist_AddInput( p_playlist, p_input, i_mode, i_pos, VLC_FALSE );
|
|
|
|
}
|
2006-05-14 20:29:00 +02:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/********************** Misc item operations **********************/
|
2006-05-14 20:29:00 +02:00
|
|
|
VLC_EXPORT( playlist_item_t*, playlist_ItemToNode, (playlist_t *,playlist_item_t *) );
|
|
|
|
VLC_EXPORT( playlist_item_t*, playlist_LockItemToNode, (playlist_t *,playlist_item_t *) );
|
Options as infos were bad in several ways: it broke PLAYLIST_GO, used
much memory, and was inconsistent, especially with input_CreateThread
taking an array of options
* Revert to using array of options
* To add an item with options:
- either use playlist_ItemNew, ItemAddOption, and then AddItem
(useful if you don't have all your options in an array)
- either use playlist_AddExt (use this if all your options are
already in an array)
* To add an item without options: use playlist_Add
You can still add options after an item has been added by using either
playlist_AddOption or playlist_ItemAddOption
* Attempt to improve API and solve thread safety issues.
- playlist_Item* functions allow to touch items only.
p_item->lock must be used when needed
(playlist_ItemNew, playlist_ItemDelete, playlist_Item*Info,
playlist_ItemSet* )
- playlist_ItemGetById and ItemGetByPos give you playlist_items
for GetByPos, you should have the playlist lock
At the moment, the playlist_Set* and playlist_*Info functions are kept (they work with position) but should be avoided.
2004-01-29 18:51:08 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
playlist_item_t *playlist_ItemFindFromInputAndRoot( playlist_t *p_playlist,
|
|
|
|
int i_input_id, playlist_item_t *p_root );
|
2004-01-05 13:59:43 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/********************************** Item search *************************/
|
Options as infos were bad in several ways: it broke PLAYLIST_GO, used
much memory, and was inconsistent, especially with input_CreateThread
taking an array of options
* Revert to using array of options
* To add an item with options:
- either use playlist_ItemNew, ItemAddOption, and then AddItem
(useful if you don't have all your options in an array)
- either use playlist_AddExt (use this if all your options are
already in an array)
* To add an item without options: use playlist_Add
You can still add options after an item has been added by using either
playlist_AddOption or playlist_ItemAddOption
* Attempt to improve API and solve thread safety issues.
- playlist_Item* functions allow to touch items only.
p_item->lock must be used when needed
(playlist_ItemNew, playlist_ItemDelete, playlist_Item*Info,
playlist_ItemSet* )
- playlist_ItemGetById and ItemGetByPos give you playlist_items
for GetByPos, you should have the playlist lock
At the moment, the playlist_Set* and playlist_*Info functions are kept (they work with position) but should be avoided.
2004-01-29 18:51:08 +01:00
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_ItemGetById, (playlist_t *, int) );
|
2004-11-14 00:06:53 +01:00
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInput, (playlist_t *,input_item_t * ) );
|
* src/playlist/* && Makefile.am
- splitted the enormous playlist.c file
- implemented a better item group system: groups have a name
and must be created before use by
playlist_CreateGroup( p_playlist, "newgroupname")
* modules/misc/sap.c
- Create our own playlist group ("SAP") and use it
* modules/access/slp.c
- Create our own playlist group ("SLP") and use it
* modules/demux/util/id3tag.c
- Trigger playlist update when we have parsed our tag
* modules/gui/wxwindows/interface.cpp
- Fixed the about box by using vlc_wraptext
- Added the simple open and the streaming wizard icons
*** Icons need to be changed ! ***
- Added the visualization to the extended gui
* modules/gui/wxwindows/preferences.cpp && include/vlc_help.h
- Enlarged the window to fit the wrapped text
- Added help for audio encoders
* modules/gui/wxwindows/stream.cpp & open.cpp & include/vlc_interface.h
- Created a "streaming wizard" window (3-step streaming)
* modules/gui/wxwindows/iteminfo.cpp:
- Group change is now based on the name
* modules/gui/wxwindows/playlist.cpp
- Added author and group columns to the listview
- Redesigned the window
- Added the Sort menu with several criteria (title, author, group)
- Added up/down buttons to move an item in the playlist
- Added the group menu to enable/disable a group in an understandable way
TODO:
-----
* playlist core :
- Implement advanced sort capabilities (multi-criteria)
- File format to save the new features
- export playlist (to M3U, eg)
- more robust group creation (duplicates check, ...)
* wxWindows playlist:
The idea of a treeview seems impossible, because of wxWindow's treeview,
that don't allow multi-selection, and, as far as I know, multi-columns.
- Provide a frontend to advanced sort (when it's done :-) )
- Allow moving items by drag & drop (well, if possible, haven't checked yet)
- Allow moving several items at once
- Customizable listview (ability to remove/move columns)
- Find a solution to the focus problem
(when you change track, the selected one scrolls at the
bottom of the visible screen)
* wxWindows interface:
- New icons, our icons begin to get old and not so pretty
- Find a solution for the volume bar (nobody understands what it is)
2003-10-29 18:32:55 +01:00
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
static inline playlist_item_t *playlist_LockItemGetById( playlist_t *p_playlist,
|
|
|
|
int i_id)
|
|
|
|
{
|
|
|
|
playlist_item_t *p_ret;
|
|
|
|
vlc_mutex_lock( &p_playlist->object_lock );
|
|
|
|
p_ret = playlist_ItemGetById( p_playlist, i_id );
|
|
|
|
vlc_mutex_unlock( &p_playlist->object_lock );
|
|
|
|
return p_ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline playlist_item_t *playlist_LockItemGetByInput(
|
|
|
|
playlist_t *p_playlist, input_item_t *p_item )
|
|
|
|
{
|
|
|
|
playlist_item_t *p_ret;
|
|
|
|
vlc_mutex_lock( &p_playlist->object_lock );
|
|
|
|
p_ret = playlist_ItemGetByInput( p_playlist, p_item );
|
|
|
|
vlc_mutex_unlock( &p_playlist->object_lock );
|
|
|
|
return p_ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
VLC_EXPORT( int, playlist_LiveSearchUpdate, (playlist_t *, playlist_item_t *, const char *) );
|
2004-01-05 13:59:43 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/********************************************************
|
|
|
|
* Tree management
|
|
|
|
********************************************************/
|
|
|
|
VLC_EXPORT(void, playlist_NodeDump, ( playlist_t *p_playlist, playlist_item_t *p_item, int i_level ) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeChildrenCount, (playlist_t *,playlist_item_t* ) );
|
2004-01-05 13:59:43 +01:00
|
|
|
|
2006-08-11 15:32:42 +02:00
|
|
|
/* Node management */
|
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_NodeCreate, ( playlist_t *, char *, playlist_item_t * p_parent ) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeAppend, (playlist_t *,playlist_item_t*,playlist_item_t *) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeInsert, (playlist_t *,playlist_item_t*,playlist_item_t *, int) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeRemoveItem, (playlist_t *,playlist_item_t*,playlist_item_t *) );
|
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_ChildSearchName, (playlist_item_t*, const char* ) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeDelete, ( playlist_t *, playlist_item_t *, vlc_bool_t , vlc_bool_t ) );
|
|
|
|
VLC_EXPORT( int, playlist_NodeEmpty, ( playlist_t *, playlist_item_t *, vlc_bool_t ) );
|
2006-09-15 13:43:22 +02:00
|
|
|
VLC_EXPORT( void, playlist_NodesPairCreate, (playlist_t *, char *, playlist_item_t **, playlist_item_t **, vlc_bool_t ) );
|
2006-08-26 18:51:55 +02:00
|
|
|
VLC_EXPORT( playlist_item_t *, playlist_GetPreferredNode, ( playlist_t *p_playlist, playlist_item_t *p_node ) );
|
2006-08-11 15:32:42 +02:00
|
|
|
|
2004-11-06 12:17:46 +01:00
|
|
|
/***********************************************************************
|
|
|
|
* Inline functions
|
|
|
|
***********************************************************************/
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
/** Tell if the playlist is currently running */
|
2003-01-29 12:34:11 +01:00
|
|
|
static inline vlc_bool_t playlist_IsPlaying( playlist_t * p_playlist )
|
|
|
|
{
|
|
|
|
vlc_bool_t b_playing;
|
|
|
|
vlc_mutex_lock( &p_playlist->object_lock );
|
2004-11-06 12:17:46 +01:00
|
|
|
b_playing = p_playlist->status.i_status == PLAYLIST_RUNNING;
|
2003-01-29 12:34:11 +01:00
|
|
|
vlc_mutex_unlock( &p_playlist->object_lock );
|
|
|
|
return( b_playing );
|
|
|
|
}
|
|
|
|
|
2006-05-14 20:29:00 +02:00
|
|
|
/** Tell if the playlist is empty */
|
2003-01-29 12:34:11 +01:00
|
|
|
static inline vlc_bool_t playlist_IsEmpty( playlist_t * p_playlist )
|
|
|
|
{
|
|
|
|
vlc_bool_t b_empty;
|
|
|
|
vlc_mutex_lock( &p_playlist->object_lock );
|
|
|
|
b_empty = p_playlist->i_size == 0;
|
|
|
|
vlc_mutex_unlock( &p_playlist->object_lock );
|
|
|
|
return( b_empty );
|
|
|
|
}
|
2003-08-14 15:02:55 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
2006-05-14 20:29:00 +02:00
|
|
|
|
|
|
|
#endif
|