~ubuntu-branches/ubuntu/maverick/vlc/maverick

« back to all changes in this revision

Viewing changes to include/vlc_playlist.h

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2008-09-17 21:56:14 UTC
  • mfrom: (1.1.17 upstream)
  • Revision ID: james.westby@ubuntu.com-20080917215614-tj0vx8xzd57e52t8
Tags: 0.9.2-1ubuntu1
* New Upstream Release, exception granted by
    - dktrkranz, norsetto, Hobbsee (via irc). LP: #270404

Changes done in ubuntu:

* add libxul-dev to build-depends
* make sure that vlc is build against libxul in configure. This doesn't
  change anything in the package, but makes it more robust if building
  in an 'unclean' chroot or when modifying the package.
* debian/control: make Vcs-* fields point to the motumedia branch
* add libx264-dev and libass-dev to build-depends
  LP: #210354, #199870
* actually enable libass support by passing --enable-libass to configure
* enable libdca: add libdca-dev to build depends and --enable-libdca
* install the x264 plugin.

Changes already in the pkg-multimedia branch in debian:

* don't install usr/share/vlc/mozilla in debian/mozilla-plugin-vlc.install  
* new upstream .desktop file now registers flash video mimetype LP: #261567
* add Xb-Npp-Applications to mozilla-plugin-vlc
* remove duplicate entries in debian/vlc-nox.install

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 * vlc_playlist.h : Playlist functions
3
3
 *****************************************************************************
4
4
 * Copyright (C) 1999-2004 the VideoLAN team
5
 
 * $Id: bb458706aaeb15ba657c5d11c39ca4ff1541e744 $
 
5
 * $Id: 54e457c40377caa32b1efd1ed5bab0f5c7195804 $
6
6
 *
7
7
 * Authors: Samuel Hocevar <sam@zoy.org>
8
8
 *
21
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22
22
 *****************************************************************************/
23
23
 
24
 
/**
25
 
 *  \file
26
 
 *  This file contain structures and function prototypes related
27
 
 *  to the playlist in vlc
28
 
 */
29
 
 
30
 
/**
 
24
#ifndef VLC_PLAYLIST_H_
 
25
#define VLC_PLAYLIST_H_
 
26
 
 
27
# ifdef __cplusplus
 
28
extern "C" {
 
29
# endif
 
30
 
 
31
#include <vlc_input.h>
 
32
#include <vlc_events.h>
 
33
#include <vlc_services_discovery.h>
 
34
#include <stdio.h>
 
35
#include <stdlib.h>
 
36
 
 
37
TYPEDEF_ARRAY(playlist_item_t*, playlist_item_array_t);
 
38
 
 
39
/**
 
40
 * \file
 
41
 * This file contain structures and function prototypes related
 
42
 * to the playlist in vlc
 
43
 *
31
44
 * \defgroup vlc_playlist Playlist
32
 
 * Brief description. Longer description
 
45
 *
 
46
 * The VLC playlist system has a tree structure. This allows advanced
 
47
 * categorization, like for SAP streams (which are grouped by "sap groups").
 
48
 *
 
49
 * The base structure for all playlist operations is the input_item_t. This
 
50
 * contains all information needed to play a stream and get info, ie, mostly,
 
51
 * mrl and metadata. This structure contains a unique i_id field. ids are
 
52
 * not recycled when an item is destroyed.
 
53
 *
 
54
 * Input items are not used directly, but through playlist items.
 
55
 * The playlist items are themselves in a tree structure. They only contain
 
56
 * a link to the input item, a unique id and a few flags. the playlist
 
57
 * item id is NOT the same as the input item id.
 
58
 * Several playlist items can be attached to a single input item. The input
 
59
 * item is refcounted and is automatically destroyed when it is not used
 
60
 * anymore.
 
61
 *
 
62
 * In the playlist itself, there are two trees, that should always be kept
 
63
 * in sync. The "category" tree contains the whole tree structure with
 
64
 * several levels, while the onelevel tree contains only one level :), ie
 
65
 * it only contains "real" items, not nodes
 
66
 * For example, if you open a directory, you will have
 
67
 *\verbatim
 
68
 * Category tree:               Onelevel tree:
 
69
 * Playlist                     Playlist
 
70
 *  - Dir                         - item1
 
71
 *    - Subdir                    - item2
 
72
 *      - item1
 
73
 *      - item2
 
74
 *\endverbatim
 
75
 * The top-level items of both tree are the same, and they are reproduced
 
76
 * in the left-part of the playlist GUIs, they are the "sources" from the
 
77
 * source selectors. Top-level items include: playlist, media library, SAP,
 
78
 * Shoutcast, devices, ...
 
79
 *
 
80
 * It is envisioned that a third tree will appear: VLM, but it's not done yet
 
81
 *
 
82
 * The playlist also stores, for utility purposes, an array of all input
 
83
 * items, an array of all playlist items and an array of all playlist items
 
84
 * and nodes (both are represented by the same structure).
 
85
 *
 
86
 * So, here is an example:
 
87
 * \verbatim
 
88
 * Inputs array
 
89
 *  - input 1 -> name = foo 1 uri = ...
 
90
 *  - input 2 -> name = foo 2 uri = ...
 
91
 *
 
92
 * Category tree                        Onelevel tree
 
93
 * - playlist (id 1)                    - playlist (id 3)
 
94
 *    - category 1 (id 2)                - foo 2 (id 8 - input 2)
 
95
 *      - foo 2 (id 6 - input 2)       - media library (id 4)
 
96
 * - media library (id 2)                - foo 1 (id6 - input 1)
 
97
 *    - foo 1 (id 5 - input 1)
 
98
 * \endverbatim
 
99
 * Sometimes, an item must be transformed to a node. This happens for the
 
100
 * directory access for example. In that case, the item is removed from
 
101
 * the onelevel tree, as it is not a real item anymore.
 
102
 *
 
103
 * For "standard" item addition, you can use playlist_Add, playlist_AddExt
 
104
 * (more options) or playlist_AddInput if you already created your input
 
105
 * item. This will add the item at the root of "Playlist" or of "Media library"
 
106
 * in each of the two trees.
 
107
 *
 
108
 * If you want more control (like, adding the item as the child of a given
 
109
 * node in the category tree, use playlist_BothAddInput. You'll have to provide
 
110
 * the node in the category tree. The item will be added as a child of
 
111
 * this node in the category tree, and as a child of the matching top-level
 
112
 * node in the onelevel tree. (Nodes are created with playlist_NodeCreate)
 
113
 *
 
114
 * Generally speaking, playlist_NodeAddInput should not be used in newer code, it
 
115
 * will maybe become useful again when we merge VLM;
 
116
 *
 
117
 * To delete an item, use playlist_DeleteFromInput( input_id ) which will
 
118
 * remove all occurrences of the input in both trees
 
119
 *
33
120
 * @{
34
121
 */
35
122
 
36
 
/**
37
 
 * playlist export helper structure
38
 
 */
 
123
/** Helper structure to export to file part of the playlist */
39
124
struct playlist_export_t
40
125
{
41
126
    char *psz_filename;
42
127
    FILE *p_file;
43
 
};
44
 
 
45
 
struct item_parent_t
46
 
{
47
 
    int i_view;
48
 
    playlist_item_t *p_parent;
49
 
};
50
 
 
51
 
/**
52
 
 * playlist item / node
53
 
 * \see playlist_t
54
 
 */
 
128
    playlist_item_t *p_root;
 
129
};
 
130
 
 
131
/** playlist item / node */
55
132
struct playlist_item_t
56
133
{
57
 
    input_item_t           input;       /**< input item descriptor */
58
 
 
59
 
    /* Tree specific fields */
60
 
    int                    i_children;  /**< Number of children
61
 
                                             -1 if not a node */
 
134
    input_item_t           *p_input;    /**< Linked input item */
 
135
    /** Number of children, -1 if not a node */
 
136
    int                    i_children;
62
137
    playlist_item_t      **pp_children; /**< Children nodes/items */
63
 
    int                    i_parents;   /**< Number of parents */
64
 
    struct item_parent_t **pp_parents;  /**< Parents */
65
 
    int                    i_serial;    /**< Has this node been updated ? */
 
138
    playlist_item_t       *p_parent;    /**< Item parent */
66
139
 
 
140
    int                    i_id;        /**< Playlist item specific id */
67
141
    uint8_t                i_flags;     /**< Flags */
68
 
 
69
 
 
70
 
    int        i_nb_played;       /**< How many times was this item played ? */
71
 
 
72
 
    /* LEGACY FIELDS */
73
 
    vlc_bool_t b_autodeletion;    /**< Indicates whther this item is to
74
 
                                   * be deleted after playback. True mean
75
 
                                   * that this item is to be deleted
76
 
                                   * after playback, false otherwise */
77
 
    vlc_bool_t b_enabled;         /**< Indicates whether this item is to be
78
 
                                   * played or skipped */
79
 
    /* END LEGACY FIELDS */
80
 
};
81
 
 
82
 
#define PLAYLIST_SAVE_FLAG      0x01     /**< Must it be saved */
83
 
#define PLAYLIST_SKIP_FLAG      0x02     /**< Must playlist skip after it ? */
84
 
#define PLAYLIST_ENA_FLAG       0x04     /**< Is it enabled ? */
85
 
#define PLAYLIST_DEL_FLAG       0x08     /**< Autodelete ? */
86
 
#define PLAYLIST_RO_FLAG        0x10    /**< Write-enabled ? */
87
 
#define PLAYLIST_REMOVE_FLAG    0x20    /**< Remove this item at the end */
88
 
 
89
 
/**
90
 
 * playlist view
91
 
 * \see playlist_t
92
 
*/
93
 
struct playlist_view_t
94
 
{
95
 
    char            *   psz_name;        /**< View name */
96
 
    int                 i_id;            /**< Identifier for the view */
97
 
    playlist_item_t *   p_root;          /**< Root node */
98
 
};
99
 
 
100
 
 
101
 
/**
102
 
 * predefined views
103
 
 *
104
 
 */
105
 
#define VIEW_CATEGORY 1
106
 
#define VIEW_SIMPLE   2
107
 
#define VIEW_ALL      3
108
 
#define VIEW_FIRST_SORTED  4
109
 
#define VIEW_S_AUTHOR 4
110
 
#define VIEW_S_GENRE 5
111
 
#define VIEW_S_ALBUM  6
112
 
 
113
 
#define VIEW_LAST_SORTED  10
114
 
 
115
 
#define VIEW_FIRST_CUSTOM 100
116
 
 
117
 
/**
118
 
 * Playlist status
119
 
 */
120
 
typedef enum { PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t;
121
 
 
122
 
 
123
 
struct services_discovery_t
124
 
{
125
 
    VLC_COMMON_MEMBERS
126
 
    char *psz_module;
127
 
 
128
 
    module_t *p_module;
129
 
 
130
 
    services_discovery_sys_t *p_sys;
131
 
    void (*pf_run) ( services_discovery_t *);
132
 
};
133
 
 
134
 
struct playlist_preparse_t
135
 
{
136
 
    VLC_COMMON_MEMBERS
137
 
    vlc_mutex_t     lock;
138
 
    int             i_waiting;
139
 
    int            *pi_waiting;
140
 
};
141
 
 
142
 
 
143
 
/**
144
 
 * Structure containing information about the playlist
145
 
 */
 
142
    playlist_t            *p_playlist;  /**< Parent playlist */
 
143
};
 
144
 
 
145
#define PLAYLIST_SAVE_FLAG      0x0001    /**< Must it be saved */
 
146
#define PLAYLIST_SKIP_FLAG      0x0002    /**< Must playlist skip after it ? */
 
147
#define PLAYLIST_DBL_FLAG       0x0004    /**< Is it disabled ? */
 
148
#define PLAYLIST_RO_FLAG        0x0008    /**< Write-enabled ? */
 
149
#define PLAYLIST_REMOVE_FLAG    0x0010    /**< Remove this item at the end */
 
150
#define PLAYLIST_EXPANDED_FLAG  0x0020    /**< Expanded node */
 
151
 
 
152
/** Playlist status */
 
153
typedef enum
 
154
{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t;
 
155
 
 
156
/** Structure containing information about the playlist */
146
157
struct playlist_t
147
158
{
148
159
    VLC_COMMON_MEMBERS
149
 
/**
150
 
   \name playlist_t
151
 
   These members are uniq to playlist_t
152
 
*/
153
 
/*@{*/
154
 
    int                   i_index;  /**< current index into the playlist */
155
 
    int                   i_enabled; /**< How many items are enabled ? */
156
 
 
157
 
    int                   i_size;   /**< total size of the list */
158
 
    playlist_item_t **    pp_items; /**< array of pointers to the
159
 
                                     * playlist items */
160
 
    int                   i_all_size; /**< size of list of items and nodes */
161
 
    playlist_item_t **    pp_all_items; /**< array of pointers to the
162
 
                                         * playlist items and nodes */
163
 
 
164
 
    int                   i_views; /**< Number of views */
165
 
    playlist_view_t **    pp_views; /**< array of pointers to the
166
 
                                     * playlist views */
167
 
 
168
 
    input_thread_t *      p_input;  /**< the input thread ascosiated
 
160
 
 
161
    struct playlist_services_discovery_support_t {
 
162
        /* the playlist items for category and onelevel */
 
163
        playlist_item_t*    p_cat;
 
164
        playlist_item_t*    p_one;
 
165
        services_discovery_t * p_sd; /**< Loaded service discovery modules */
 
166
    } ** pp_sds;
 
167
    int                   i_sds;   /**< Number of service discovery modules */
 
168
 
 
169
    playlist_item_array_t items; /**< Arrays of items */
 
170
    playlist_item_array_t all_items; /**< Array of items and nodes */
 
171
    playlist_item_array_t items_to_delete; /**< Array of items and nodes to
 
172
            delete... At the very end. This sucks. */
 
173
 
 
174
    playlist_item_array_t current; /**< Items currently being played */
 
175
    int                   i_current_index; /**< Index in current array */
 
176
    /** Reset current item array */
 
177
    bool            b_reset_currently_playing;
 
178
    mtime_t               last_rebuild_date;
 
179
 
 
180
    int                   i_last_playlist_id; /**< Last id to an item */
 
181
 
 
182
    /* Predefined items */
 
183
    playlist_item_t *     p_root_category; /**< Root of category tree */
 
184
    playlist_item_t *     p_root_onelevel; /**< Root of onelevel tree */
 
185
    playlist_item_t *     p_local_category; /** < "Playlist" in CATEGORY view */
 
186
    playlist_item_t *     p_ml_category; /** < "Library" in CATEGORY view */
 
187
    playlist_item_t *     p_local_onelevel; /** < "Playlist" in ONELEVEL view */
 
188
    playlist_item_t *     p_ml_onelevel; /** < "Library" in ONELEVEL view */
 
189
 
 
190
    bool                  b_tree; /**< Display as a tree */
 
191
 
 
192
    bool            b_doing_ml; /**< Doing media library stuff,
 
193
                                       * get quicker */
 
194
    bool            b_auto_preparse;
 
195
 
 
196
    /* Runtime */
 
197
    input_thread_t *      p_input;  /**< the input thread associated
169
198
                                     * with the current item */
170
 
 
171
 
    mtime_t               request_date; /**< Used for profiling */
172
 
 
173
 
    int                   i_last_id; /**< Last id to an item */
174
199
    int                   i_sort; /**< Last sorting applied to the playlist */
175
200
    int                   i_order; /**< Last ordering applied to the playlist */
176
 
 
177
 
    playlist_item_t *    p_general; /**< Keep a pointer on the "general"
178
 
                                        category */
179
 
 
180
 
    services_discovery_t **pp_sds;
181
 
    int                   i_sds;
182
 
 
183
 
    vlc_bool_t          b_go_next; /*< Go further than the parent node ? */
 
201
    mtime_t               gc_date;
 
202
    bool            b_cant_sleep;
 
203
    playlist_preparse_t  *p_preparse; /**< Preparser object */
 
204
    playlist_fetcher_t   *p_fetcher;/**< Meta and art fetcher object */
184
205
 
185
206
    struct {
186
 
        /* Current status */
 
207
        /* Current status. These fields are readonly, only the playlist
 
208
         * main loop can touch it*/
187
209
        playlist_status_t   i_status;  /**< Current status of playlist */
188
 
 
189
 
        /* R/O fields, don't touch if you aren't the playlist thread */
190
 
        /* Use a request */
191
210
        playlist_item_t *   p_item; /**< Currently playing/active item */
192
 
        playlist_item_t *   p_node;   /**< Current node to play from */
193
 
        int                 i_view;    /**< Current view */
 
211
        playlist_item_t *   p_node; /**< Current node to play from */
194
212
    } status;
195
213
 
196
214
    struct {
197
 
        /* Request */
198
 
        /* Playlist thread uses this info to calculate the next position */
199
 
        int                 i_view;   /**< requested view id */
 
215
        /* Request. Use this to give orders to the playlist main loop  */
 
216
        playlist_status_t   i_status; /**< requested playlist status */
200
217
        playlist_item_t *   p_node;   /**< requested node to play from */
201
218
        playlist_item_t *   p_item;   /**< requested item to play in the node */
202
219
 
203
220
        int                 i_skip;   /**< Number of items to skip */
204
 
        int                 i_goto;   /**< Direct index to go to (non-view)*/
205
221
 
206
 
        vlc_bool_t          b_request; /**< Set to true by the requester
207
 
                                            The playlist sets it back to false
208
 
                                            when processing the request */
209
 
        vlc_mutex_t         lock;      /**< Lock to protect request */
 
222
        bool          b_request;/**< Set to true by the requester
 
223
                                           The playlist sets it back to false
 
224
                                           when processing the request */
 
225
        vlc_mutex_t         lock;     /**< Lock to protect request */
210
226
    } request;
211
 
 
212
 
    playlist_preparse_t     *p_preparse;
213
 
 
214
 
    vlc_mutex_t gc_lock;         /**< Lock to protect the garbage collection */
215
 
 
216
 
    // The following members are about user interaction
217
 
    // The playlist manages the user interaction to avoid creating another
218
 
    // thread
219
 
    interaction_t *p_interaction;
220
 
 
221
 
    global_stats_t *p_stats;
222
 
 
223
 
    /*@}*/
224
227
};
225
228
 
226
 
/* Helper to add an item */
 
229
/** Helper to add an item */
227
230
struct playlist_add_t
228
231
{
229
232
    int i_node;
230
233
    int i_item;
231
 
    int i_view;
232
234
    int i_position;
233
235
};
234
236
 
235
237
#define SORT_ID 0
236
238
#define SORT_TITLE 1
237
239
#define SORT_TITLE_NODES_FIRST 2
238
 
#define SORT_AUTHOR 3
 
240
#define SORT_ARTIST 3
239
241
#define SORT_GENRE 4
240
242
#define SORT_RANDOM 5
241
243
#define SORT_DURATION 6
242
244
#define SORT_TITLE_NUMERIC 7
243
245
#define SORT_ALBUM 8
 
246
#define SORT_TRACK_NUMBER 9
 
247
#define SORT_DESCRIPTION 10
 
248
#define SORT_RATING 11
244
249
 
245
250
#define ORDER_NORMAL 0
246
251
#define ORDER_REVERSE 1
247
252
 
 
253
/* Used by playlist_Import */
 
254
#define PLAYLIST_INSERT          0x0001
 
255
#define PLAYLIST_APPEND          0x0002
 
256
#define PLAYLIST_GO              0x0004
 
257
#define PLAYLIST_PREPARSE        0x0008
 
258
#define PLAYLIST_SPREPARSE       0x0010
 
259
#define PLAYLIST_NO_REBUILD      0x0020
 
260
 
 
261
#define PLAYLIST_END           -666
 
262
 
 
263
enum pl_locked_state
 
264
{
 
265
    pl_Locked = true,
 
266
    pl_Unlocked = false
 
267
};
 
268
 
248
269
/*****************************************************************************
249
270
 * Prototypes
250
271
 *****************************************************************************/
251
272
 
252
 
/* Creation/Deletion */
253
 
#define playlist_Create(a) __playlist_Create(VLC_OBJECT(a))
254
 
playlist_t * __playlist_Create   ( vlc_object_t * );
255
 
int            playlist_Destroy  ( playlist_t * );
 
273
/* Helpers */
 
274
#define PL_LOCK vlc_object_lock( p_playlist )
 
275
#define PL_UNLOCK vlc_object_unlock( p_playlist )
 
276
 
 
277
VLC_EXPORT( playlist_t *, __pl_Yield, ( vlc_object_t * ) );
 
278
#define pl_Yield( a ) __pl_Yield( VLC_OBJECT(a) )
 
279
 
 
280
VLC_EXPORT( void, __pl_Release, ( vlc_object_t * ) );
 
281
#define pl_Release(a) __pl_Release( VLC_OBJECT(a) )
256
282
 
257
283
/* Playlist control */
258
 
#define playlist_Play(p) playlist_LockControl(p,PLAYLIST_PLAY )
259
 
#define playlist_Pause(p) playlist_LockControl(p,PLAYLIST_PAUSE )
260
 
#define playlist_Stop(p) playlist_LockControl(p,PLAYLIST_STOP )
261
 
#define playlist_Next(p) playlist_LockControl(p,PLAYLIST_SKIP, 1)
262
 
#define playlist_Prev(p) playlist_LockControl(p,PLAYLIST_SKIP, -1)
263
 
#define playlist_Skip(p,i) playlist_LockControl(p,PLAYLIST_SKIP, i)
264
 
#define playlist_Goto(p,i) playlist_LockControl(p,PLAYLIST_GOTO, i)
265
 
 
266
 
VLC_EXPORT( int, playlist_Control, ( playlist_t *, int, ...  ) );
267
 
VLC_EXPORT( int, playlist_LockControl, ( playlist_t *, int, ...  ) );
268
 
 
269
 
VLC_EXPORT( int,  playlist_Clear, ( playlist_t * ) );
270
 
VLC_EXPORT( int,  playlist_LockClear, ( playlist_t * ) );
271
 
 
 
284
#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked )
 
285
#define playlist_Pause(p) playlist_Control(p,PLAYLIST_PAUSE, pl_Unlocked )
 
286
#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked )
 
287
#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1)
 
288
#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1)
 
289
#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked,  i)
 
290
 
 
291
/**
 
292
 * Do a playlist action.
 
293
 * If there is something in the playlist then you can do playlist actions.
 
294
 * Possible queries are listed in vlc_common.h
 
295
 * \param p_playlist the playlist to do the command on
 
296
 * \param i_query the command to do
 
297
 * \param b_locked TRUE if playlist is locked when entering this function
 
298
 * \param variable number of arguments
 
299
 * \return VLC_SUCCESS or an error
 
300
 */
 
301
VLC_EXPORT( int, playlist_Control, ( playlist_t *p_playlist, int i_query, bool b_locked, ...  ) );
 
302
 
 
303
/** Get current playing input. The object is retained.
 
304
 */
 
305
VLC_EXPORT( input_thread_t *, playlist_CurrentInput, ( playlist_t *p_playlist ) );
 
306
 
 
307
/** Clear the playlist
 
308
 * \param b_locked TRUE if playlist is locked when entering this function
 
309
 */
 
310
VLC_EXPORT( void,  playlist_Clear, ( playlist_t *, bool ) );
 
311
 
 
312
/** Enqueue an input item for preparsing */
272
313
VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) );
 
314
 
 
315
/** Enqueue a playlist item and all of its children if any for preparsing */
273
316
VLC_EXPORT( int, playlist_PreparseEnqueueItem, (playlist_t *, playlist_item_t *) );
274
 
 
275
 
/* Services discovery */
276
 
 
 
317
/** Request the art for an input item to be fetched */
 
318
VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) );
 
319
 
 
320
/********************** Services discovery ***********************/
 
321
 
 
322
/** Add a list of comma-separated service discovery modules */
277
323
VLC_EXPORT( int, playlist_ServicesDiscoveryAdd, (playlist_t *, const char *));
 
324
/** Remove a services discovery module by name */
278
325
VLC_EXPORT( int, playlist_ServicesDiscoveryRemove, (playlist_t *, const char *));
279
 
VLC_EXPORT( int, playlist_AddSDModules, (playlist_t *, char *));
280
 
VLC_EXPORT( vlc_bool_t, playlist_IsServicesDiscoveryLoaded, ( playlist_t *,const char *));
281
 
 
282
 
 
283
 
/* Item management functions (act on items) */
284
 
#define playlist_AddItem(p,pi,i1,i2) playlist_ItemAdd(p,pi,i1,i2)
285
 
#define playlist_ItemNew( a , b, c ) __playlist_ItemNew(VLC_OBJECT(a) , b , c )
286
 
#define playlist_ItemCopy( a, b ) __playlist_ItemCopy(VLC_OBJECT(a), b )
287
 
VLC_EXPORT( playlist_item_t* , __playlist_ItemNew, ( vlc_object_t *,const char *,const char * ) );
288
 
VLC_EXPORT( playlist_item_t* , __playlist_ItemCopy, ( vlc_object_t *,playlist_item_t* ) );
289
 
VLC_EXPORT( playlist_item_t* , playlist_ItemNewWithType, ( vlc_object_t *,const char *,const char *, int ) );
290
 
VLC_EXPORT( int, playlist_ItemDelete, ( playlist_item_t * ) );
291
 
VLC_EXPORT( int, playlist_ItemAddParent, ( playlist_item_t *, int,playlist_item_t *) );
292
 
VLC_EXPORT( int, playlist_CopyParents, ( playlist_item_t *,playlist_item_t *) );
293
 
/* Item informations accessors */
294
 
VLC_EXPORT( int, playlist_ItemSetName, (playlist_item_t *,  char * ) );
295
 
VLC_EXPORT( int, playlist_ItemSetDuration, (playlist_item_t *, mtime_t ) );
296
 
 
297
 
 
298
 
/* View management functions */
299
 
VLC_EXPORT( int, playlist_ViewInsert, (playlist_t *, int, char * ) );
300
 
VLC_EXPORT( int, playlist_ViewDelete, (playlist_t *,playlist_view_t* ) );
301
 
VLC_EXPORT( playlist_view_t *, playlist_ViewFind, (playlist_t *, int ) );
302
 
VLC_EXPORT( int, playlist_ViewUpdate, (playlist_t *, int ) );
303
 
VLC_EXPORT( int, playlist_ViewDump, (playlist_t *, playlist_view_t * ) );
304
 
VLC_EXPORT( int, playlist_ViewEmpty, (playlist_t *, int, vlc_bool_t ) );
 
326
/** Check whether a given SD is loaded */
 
327
VLC_EXPORT( bool, playlist_IsServicesDiscoveryLoaded, ( playlist_t *,const char *));
 
328
 
 
329
/* Playlist sorting */
 
330
VLC_EXPORT( int,  playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) );
 
331
VLC_EXPORT( int,  playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
 
332
 
 
333
/**
 
334
 * Export a node of the playlist to a certain type of playlistfile
 
335
 * \param p_playlist the playlist to export
 
336
 * \param psz_filename the location where the exported file will be saved
 
337
 * \param p_export_root the root node to export
 
338
 * \param psz_type the type of playlist file to create (m3u, pls, ..)
 
339
 * \return VLC_SUCCESS on success
 
340
 */
 
341
VLC_EXPORT( int,  playlist_Export, ( playlist_t *p_playlist, const char *psz_name, playlist_item_t *p_export_root, const char *psz_type ) );
 
342
 
 
343
/********************************************************
 
344
 * Item management
 
345
 ********************************************************/
 
346
 
 
347
/*************************** Item creation **************************/
 
348
 
 
349
VLC_EXPORT( playlist_item_t* , playlist_ItemNewWithType, ( playlist_t *,const char *,const char *, int , const char *const *, int, int) );
 
350
 
 
351
/** Create a new item, without adding it to the playlist
 
352
 * \param p_obj a vlc object (anyone will do)
 
353
 * \param psz_uri the mrl of the item
 
354
 * \param psz_name a text giving a name or description of the item
 
355
 * \return the new item or NULL on failure
 
356
 */
 
357
#define playlist_ItemNew( a , b, c ) \
 
358
    playlist_ItemNewWithType( VLC_OBJECT(a) , b , c, 0, NULL, -1, 0 )
 
359
 
 
360
 
 
361
/*************************** Item deletion **************************/
 
362
VLC_EXPORT( int,  playlist_DeleteFromInput, ( playlist_t *, int, bool ) );
 
363
 
 
364
/*************************** Item fields accessors **************************/
 
365
VLC_EXPORT( int, playlist_ItemSetName, (playlist_item_t *, const char * ) );
 
366
 
 
367
/******************** Item addition ********************/
 
368
VLC_EXPORT( int,  playlist_Add,    ( playlist_t *, const char *, const char *, int, int, bool, bool ) );
 
369
VLC_EXPORT( int,  playlist_AddExt, ( playlist_t *, const char *, const char *, int, int, mtime_t, const char *const *,int, bool, bool ) );
 
370
VLC_EXPORT( int, playlist_AddInput, ( playlist_t *, input_item_t *, int, int, bool, bool ) );
 
371
VLC_EXPORT( int, playlist_BothAddInput, ( playlist_t *, input_item_t *,playlist_item_t *,int , int, int*, int*, bool ) );
 
372
 
 
373
/********************** Misc item operations **********************/
 
374
VLC_EXPORT( playlist_item_t*, playlist_ItemToNode, (playlist_t *,playlist_item_t *, bool) );
 
375
 
 
376
/********************************** Item search *************************/
 
377
VLC_EXPORT( playlist_item_t *, playlist_ItemGetById, (playlist_t *, int, bool ) );
 
378
VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInput, (playlist_t *,input_item_t *, bool ) );
 
379
VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInputId, (playlist_t *, int, playlist_item_t *) );
 
380
 
 
381
VLC_EXPORT( int, playlist_LiveSearchUpdate, (playlist_t *, playlist_item_t *, const char *) );
 
382
 
 
383
/********************************************************
 
384
 * Tree management
 
385
 ********************************************************/
 
386
VLC_EXPORT( int, playlist_NodeChildrenCount, (playlist_t *,playlist_item_t* ) );
305
387
 
306
388
/* Node management */
307
 
VLC_EXPORT( playlist_item_t *, playlist_NodeCreate, ( playlist_t *,int,char *, playlist_item_t * p_parent ) );
308
 
VLC_EXPORT( int, playlist_NodeAppend, (playlist_t *,int,playlist_item_t*,playlist_item_t *) );
309
 
VLC_EXPORT( int, playlist_NodeInsert, (playlist_t *,int,playlist_item_t*,playlist_item_t *, int) );
 
389
VLC_EXPORT( playlist_item_t *, playlist_NodeCreate, ( playlist_t *, const char *, playlist_item_t * p_parent, int i_flags, input_item_t * ) );
 
390
VLC_EXPORT( int, playlist_NodeAppend, (playlist_t *,playlist_item_t*,playlist_item_t *) );
 
391
VLC_EXPORT( int, playlist_NodeInsert, (playlist_t *,playlist_item_t*,playlist_item_t *, int) );
310
392
VLC_EXPORT( int, playlist_NodeRemoveItem, (playlist_t *,playlist_item_t*,playlist_item_t *) );
311
 
VLC_EXPORT( int, playlist_NodeRemoveParent, (playlist_t *,playlist_item_t*,playlist_item_t *) );
312
 
VLC_EXPORT( int, playlist_NodeChildrenCount, (playlist_t *,playlist_item_t* ) );
313
393
VLC_EXPORT( playlist_item_t *, playlist_ChildSearchName, (playlist_item_t*, const char* ) );
314
 
VLC_EXPORT( int, playlist_NodeDelete, ( playlist_t *, playlist_item_t *, vlc_bool_t , vlc_bool_t ) );
315
 
VLC_EXPORT( int, playlist_NodeEmpty, ( playlist_t *, playlist_item_t *, vlc_bool_t ) );
316
 
 
317
 
/* Tree walking */
318
 
playlist_item_t *playlist_FindNextFromParent( playlist_t *p_playlist,
319
 
                int i_view,
320
 
                playlist_item_t *p_root,
321
 
                playlist_item_t *p_node,
322
 
                playlist_item_t *p_item );
323
 
playlist_item_t *playlist_FindPrevFromParent( playlist_t *p_playlist,
324
 
                int i_view,
325
 
                playlist_item_t *p_root,
326
 
                playlist_item_t *p_node,
327
 
                playlist_item_t *p_item );
328
 
 
329
 
 
330
 
/* Simple add/remove functions */
331
 
/* These functions add the item to the "simple" view (+all & category )*/
332
 
VLC_EXPORT( int,  playlist_Add,    ( playlist_t *, const char *, const char *, int, int ) );
333
 
VLC_EXPORT( int,  playlist_AddExt, ( playlist_t *, const char *, const char *, int, int, mtime_t, const char **,int ) );
334
 
VLC_EXPORT( int,  playlist_ItemAdd, ( playlist_t *, playlist_item_t *, int, int ) );
335
 
VLC_EXPORT(int, playlist_NodeAddItem, ( playlist_t *, playlist_item_t *,int,playlist_item_t *,int , int ) );
336
 
 
337
 
/* Misc item operations (act on item+playlist) */
338
 
VLC_EXPORT( int,  playlist_Delete, ( playlist_t *, int ) );
339
 
VLC_EXPORT( int,  playlist_LockDelete, ( playlist_t *, int ) );
340
 
VLC_EXPORT( int,  playlist_Disable, ( playlist_t *, playlist_item_t * ) );
341
 
VLC_EXPORT( int,  playlist_Enable, ( playlist_t *, playlist_item_t * ) );
342
 
VLC_EXPORT( int, playlist_ItemToNode, (playlist_t *,playlist_item_t *) );
343
 
VLC_EXPORT( int, playlist_LockItemToNode, (playlist_t *,playlist_item_t *) );
344
 
VLC_EXPORT( int, playlist_Replace, (playlist_t *,playlist_item_t *, input_item_t*) );
345
 
VLC_EXPORT( int, playlist_LockReplace, (playlist_t *,playlist_item_t *, input_item_t*) );
346
 
 
347
 
 
348
 
/* Item search functions */
349
 
VLC_EXPORT( playlist_item_t *, playlist_ItemGetById, (playlist_t *, int) );
350
 
VLC_EXPORT( playlist_item_t *, playlist_LockItemGetById, (playlist_t *, int) );
351
 
VLC_EXPORT( playlist_item_t *, playlist_ItemGetByPos, (playlist_t *, int) );
352
 
VLC_EXPORT( playlist_item_t *, playlist_LockItemGetByPos, (playlist_t *, int) );
353
 
VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInput, (playlist_t *,input_item_t * ) );
354
 
VLC_EXPORT( playlist_item_t *, playlist_LockItemGetByInput, (playlist_t *,input_item_t * ) );
355
 
VLC_EXPORT( int, playlist_GetPositionById, (playlist_t *,int ) );
356
 
 
357
 
VLC_EXPORT( int, playlist_ItemAddOption, (playlist_item_t *, const char *) );
358
 
 
359
 
/* Playlist sorting */
360
 
#define playlist_SortID(p, i) playlist_Sort( p, SORT_ID, i)
361
 
#define playlist_SortTitle(p, i) playlist_Sort( p, SORT_TITLE, i)
362
 
#define playlist_SortAuthor(p, i) playlist_Sort( p, SORT_AUTHOR, i)
363
 
#define playlist_SortAlbum(p, i) playlist_Sort( p, SORT_ALBUM, i)
364
 
#define playlist_SortGroup(p, i) playlist_Sort( p, SORT_GROUP, i)
365
 
VLC_EXPORT( int,  playlist_Sort, ( playlist_t *, int, int) );
366
 
VLC_EXPORT( int,  playlist_Move, ( playlist_t *, int, int ) );
367
 
VLC_EXPORT( int,  playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int, int ) );
368
 
VLC_EXPORT( int,  playlist_NodeGroup, ( playlist_t *, int,playlist_item_t *,playlist_item_t **,int, int, int ) );
369
 
VLC_EXPORT( int,  playlist_NodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
370
 
VLC_EXPORT( int,  playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
371
 
 
372
 
/* Load/Save */
373
 
VLC_EXPORT( int,  playlist_Import, ( playlist_t *, const char * ) );
374
 
VLC_EXPORT( int,  playlist_Export, ( playlist_t *, const char *, const char * ) );
 
394
VLC_EXPORT( int, playlist_NodeDelete, ( playlist_t *, playlist_item_t *, bool , bool ) );
 
395
VLC_EXPORT( int, playlist_NodeEmpty, ( playlist_t *, playlist_item_t *, bool ) );
 
396
VLC_EXPORT( void, playlist_NodesPairCreate, (playlist_t *, const char *, playlist_item_t **, playlist_item_t **, bool ) );
 
397
VLC_EXPORT( playlist_item_t *, playlist_GetPreferredNode, ( playlist_t *p_playlist, playlist_item_t *p_node ) );
 
398
VLC_EXPORT( playlist_item_t *, playlist_GetNextLeaf, ( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) );
 
399
VLC_EXPORT( playlist_item_t *, playlist_GetPrevLeaf, ( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) );
 
400
VLC_EXPORT( playlist_item_t *, playlist_GetLastLeaf, ( playlist_t *p_playlist, playlist_item_t *p_root ) );
375
401
 
376
402
/***********************************************************************
377
403
 * Inline functions
378
404
 ***********************************************************************/
379
 
 
380
 
 
381
 
/**
382
 
 *  tell if a playlist is currently playing.
383
 
 *  \param p_playlist the playlist to check
384
 
 *  \return true if playlist is playing, false otherwise
385
 
 */
386
 
static inline vlc_bool_t playlist_IsPlaying( playlist_t * p_playlist )
387
 
{
388
 
    vlc_bool_t b_playing;
389
 
 
390
 
    vlc_mutex_lock( &p_playlist->object_lock );
391
 
    b_playing = p_playlist->status.i_status == PLAYLIST_RUNNING;
392
 
    vlc_mutex_unlock( &p_playlist->object_lock );
393
 
 
394
 
    return( b_playing );
395
 
}
396
 
 
397
 
/**
398
 
 *  tell if a playlist is currently empty
399
 
 *  \param p_playlist the playlist to check
400
 
 *  \return true if the playlist is empty, false otherwise
401
 
 */
402
 
static inline vlc_bool_t playlist_IsEmpty( playlist_t * p_playlist )
403
 
{
404
 
    vlc_bool_t b_empty;
405
 
 
406
 
    vlc_mutex_lock( &p_playlist->object_lock );
407
 
    b_empty = p_playlist->i_size == 0;
408
 
    vlc_mutex_unlock( &p_playlist->object_lock );
409
 
 
410
 
    return( b_empty );
411
 
}
412
 
 
413
 
 
414
 
 
415
 
/**
416
 
 * @}
417
 
 */
 
405
/** Open a playlist file, add its content to the current playlist */
 
406
static inline int playlist_Import( playlist_t *p_playlist, const char *psz_file)
 
407
{
 
408
    char psz_uri[256+10];
 
409
    input_item_t *p_input;
 
410
    snprintf( psz_uri, 256+9, "file/://%s", psz_file );
 
411
    const char *const psz_option = "meta-file";
 
412
    p_input = input_item_NewExt( p_playlist, psz_uri, psz_file,
 
413
                                1, &psz_option, -1 );
 
414
    playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END,
 
415
                       true, false );
 
416
    input_Read( p_playlist, p_input, true );
 
417
    return VLC_SUCCESS;
 
418
}
 
419
 
 
420
/** Small helper tp get current playing input or NULL. Release the input after use. */
 
421
#define pl_CurrentInput(a) __pl_CurrentInput( VLC_OBJECT(a) )
 
422
static  inline input_thread_t * __pl_CurrentInput( vlc_object_t * p_this )
 
423
{
 
424
    playlist_t * p_playlist = pl_Yield( p_this );
 
425
    if( !p_playlist ) return NULL;
 
426
    input_thread_t * p_input = playlist_CurrentInput( p_playlist );
 
427
    pl_Release( p_this );
 
428
    return p_input;
 
429
}
 
430
 
 
431
/** Tell if the playlist is currently running */
 
432
#define playlist_IsPlaying( pl ) ( pl->status.i_status == PLAYLIST_RUNNING && \
 
433
            !(pl->request.b_request && pl->request.i_status == PLAYLIST_STOPPED) )
 
434
 
 
435
#define playlist_IsStopped( pl ) ( pl->status.i_status == PLAYLIST_STOPPED || \
 
436
            (pl->request.b_request && pl->request.i_status == PLAYLIST_STOPPED) )
 
437
 
 
438
/** Tell if the playlist is empty */
 
439
#define playlist_IsEmpty( pl ) ( pl->items.i_size == 0 )
 
440
 
 
441
/** Tell the number of items in the current playing context */
 
442
#define playlist_CurrentSize( pl ) pl->current.i_size
 
443
 
 
444
/** Tell the current item id in current  playing context */
 
445
#define playlist_CurrentId( pl ) pl->status.p_item->i_id
 
446
 
 
447
/** Ask the playlist to do some work */
 
448
#define playlist_Signal( p_playlist ) vlc_object_signal( p_playlist )
 
449
 
 
450
/** @} */
 
451
# ifdef __cplusplus
 
452
}
 
453
# endif
 
454
 
 
455
#endif