]> git.sesse.net Git - vlc/blob - test/libvlc/media_list_player.c
f63d960bbe46f11c756f261fbe18ba2a261740df
[vlc] / test / libvlc / media_list_player.c
1 /*
2  * media_list_player.c - libvlc smoke test
3  *
4  * $Id$
5  */
6
7 /**********************************************************************
8  *  Copyright (C) 2007 RĂ©mi Denis-Courmont.                           *
9  *  This program is free software; you can redistribute and/or modify *
10  *  it under the terms of the GNU General Public License as published *
11  *  by the Free Software Foundation; version 2 of the license, or (at *
12  *  your option) any later version.                                   *
13  *                                                                    *
14  *  This program is distributed in the hope that it will be useful,   *
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of    *
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.              *
17  *  See the GNU General Public License for more details.              *
18  *                                                                    *
19  *  You should have received a copy of the GNU General Public License *
20  *  along with this program; if not, you can get it from:             *
21  *  http://www.gnu.org/copyleft/gpl.html                              *
22  **********************************************************************/
23
24 #include "test.h"
25
26  // For msleep
27 #include <vlc_common.h>
28 #include <vlc_mtime.h>
29
30 #include "libvlc_additions.h"
31
32 /*
33     HACK - FIX ME
34     This allows for the direct addition of subitems in the playback options test.
35     This would not be necessary if there were an add subitems function.
36 */
37 #include "../../src/control/media_internal.h"
38
39 struct check_items_order_data {
40     bool done_playing;
41     unsigned count;
42     unsigned index;
43     void * items[16];
44 };
45
46 static inline void check_data_init(struct check_items_order_data *check)
47 {
48     check->index = 0;
49     check->count = 0;
50     check->done_playing = false;
51 }
52
53 static inline void queue_expected_item(struct check_items_order_data *check, void *item)
54 {
55     assert(check->count < 16);
56     check->items[check->count] = item;
57     check->count++;
58 }
59
60 static inline void wait_queued_items(struct check_items_order_data *check)
61 {
62     // Wait dummily for check_items_order_callback() to flag 'done_playing':
63     while (!check->done_playing)
64         msleep(100000);
65 }
66
67 static void check_items_order_callback(const libvlc_event_t * p_event, void * user_data)
68 {
69     struct check_items_order_data *checks = user_data;
70     libvlc_media_t *md = p_event->u.media_list_player_next_item_set.item;
71     assert(checks->index < checks->count);
72     if (checks->items[checks->index] != md)
73     {
74         char *title = libvlc_media_get_meta(md, libvlc_meta_Title);
75         log ("Got items %s\n", title);
76         free(title);
77     }
78     assert(checks->items[checks->index] == md);
79
80     char *title = libvlc_media_get_meta(md, libvlc_meta_Title);
81     log ("Item %d '%s' was correctly queued\n", checks->index, title);
82     free(title);
83
84     if (checks->index == (checks->count - 1))
85     {
86         log ("Done playing with success\n");
87         checks->done_playing = true;
88     }
89     checks->index++;
90 }
91
92 static void test_media_list_player_items_queue(const char** argv, int argc)
93 {
94     libvlc_instance_t *vlc;
95     libvlc_media_t *md;
96     libvlc_media_list_t *ml;
97     libvlc_media_list_player_t *mlp;
98
99     const char * file = test_default_sample;
100
101     log ("Testing media player item queue-ing\n");
102
103     libvlc_exception_init (&ex);
104     vlc = libvlc_new (argc, argv, &ex);
105     catch ();
106
107     md = libvlc_media_new (vlc, file, &ex);
108     catch ();
109
110     ml = libvlc_media_list_new (vlc, &ex);
111     catch ();
112
113     mlp = libvlc_media_list_player_new (vlc, &ex);
114     catch ();
115
116     libvlc_media_list_add_media (ml, md, &ex);
117     catch ();
118
119     static struct check_items_order_data check;
120     check_data_init(&check);
121     queue_expected_item(&check, md);
122
123     // Add three more media
124     queue_expected_item(&check, media_list_add_file_path (vlc, ml, file));
125     queue_expected_item(&check, media_list_add_file_path (vlc, ml, file));
126     queue_expected_item(&check, media_list_add_file_path (vlc, ml, file));
127
128     // Add a node
129     libvlc_media_t *node = libvlc_media_new_as_node(vlc, "node", &ex);
130     catch ();
131     libvlc_media_list_add_media(ml, node, &ex);
132     catch ();
133     queue_expected_item(&check, node);
134
135     // Add items to that node
136     libvlc_media_list_t *subitems = libvlc_media_subitems(node);
137     queue_expected_item(&check, media_list_add_file_path(vlc, subitems, file));
138     queue_expected_item(&check, media_list_add_file_path(vlc, subitems, file));
139     queue_expected_item(&check, media_list_add_file_path(vlc, subitems, file));
140     libvlc_media_list_release(subitems);
141
142     libvlc_media_list_player_set_media_list (mlp, ml);
143
144     libvlc_event_manager_t * em = libvlc_media_list_player_event_manager(mlp);
145     libvlc_event_attach(em, libvlc_MediaListPlayerNextItemSet, check_items_order_callback, &check, &ex);
146     catch ();
147
148     libvlc_media_list_player_play(mlp, &ex);
149     catch ();
150
151     // Wait until all item are read
152     wait_queued_items(&check);
153
154     libvlc_media_list_player_stop (mlp);
155     while (libvlc_media_list_player_is_playing (mlp))
156         sched_yield();
157
158     libvlc_media_list_player_release (mlp);
159     libvlc_release (vlc);
160 }
161
162 static void test_media_list_player_previous(const char** argv, int argc)
163 {
164     libvlc_instance_t *vlc;
165     libvlc_media_t *md;
166     libvlc_media_list_t *ml;
167     libvlc_media_list_player_t *mlp;
168
169     const char * file = test_default_sample;
170
171     log ("Testing media player previous()\n");
172
173     libvlc_exception_init (&ex);
174     vlc = libvlc_new (argc, argv, &ex);
175     catch ();
176
177     md = libvlc_media_new (vlc, file, &ex);
178     catch ();
179
180     ml = libvlc_media_list_new (vlc, &ex);
181     catch ();
182
183     mlp = libvlc_media_list_player_new (vlc, &ex);
184     catch ();
185
186     libvlc_media_list_add_media (ml, md, &ex);
187     catch ();
188
189     // Add three media
190     media_list_add_file_path (vlc, ml, file);
191     media_list_add_file_path (vlc, ml, file);
192     media_list_add_file_path (vlc, ml, file);
193
194     libvlc_media_list_player_set_media_list (mlp, ml);
195
196     libvlc_media_list_player_play_item (mlp, md, &ex);
197     catch ();
198
199     while (!libvlc_media_list_player_is_playing (mlp))
200         sched_yield();
201
202     libvlc_media_release (md);
203
204     libvlc_media_list_player_previous (mlp, &ex);
205     catch ();
206
207     while (!libvlc_media_list_player_is_playing (mlp))
208         sched_yield();
209
210     libvlc_media_list_player_pause (mlp, &ex);
211     catch();
212
213     libvlc_media_list_player_previous (mlp, &ex);
214     catch ();
215
216     while (!libvlc_media_list_player_is_playing (mlp))
217         sched_yield();
218
219     libvlc_media_list_player_stop (mlp);
220
221     while (libvlc_media_list_player_is_playing (mlp))
222         sched_yield();
223
224     libvlc_media_list_player_previous (mlp, &ex);
225     catch ();
226
227     while (!libvlc_media_list_player_is_playing (mlp))
228         sched_yield();
229
230     libvlc_media_list_player_stop (mlp);
231
232     while (libvlc_media_list_player_is_playing (mlp))
233         sched_yield();
234
235     libvlc_media_list_player_release (mlp);
236     libvlc_release (vlc);
237 }
238
239 static void test_media_list_player_next(const char** argv, int argc)
240 {
241     libvlc_instance_t *vlc;
242     libvlc_media_t *md;
243     libvlc_media_list_t *ml;
244     libvlc_media_list_player_t *mlp;
245
246     const char * file = test_default_sample;
247
248     log ("Testing media player next()\n");
249
250     libvlc_exception_init (&ex);
251     vlc = libvlc_new (argc, argv, &ex);
252     catch ();
253
254     md = libvlc_media_new (vlc, file, &ex);
255     catch ();
256
257     ml = libvlc_media_list_new (vlc, &ex);
258     catch ();
259
260     mlp = libvlc_media_list_player_new (vlc, &ex);
261     catch ();
262
263     libvlc_media_list_add_media (ml, md, &ex);
264     catch ();
265
266     // Add three media
267     media_list_add_file_path (vlc, ml, file);
268     media_list_add_file_path (vlc, ml, file);
269     media_list_add_file_path (vlc, ml, file);
270
271     libvlc_media_list_player_set_media_list (mlp, ml);
272
273     libvlc_media_list_player_play_item (mlp, md, &ex);
274     catch ();
275
276     libvlc_media_release (md);
277
278     while (!libvlc_media_list_player_is_playing (mlp))
279         sched_yield();
280
281     libvlc_media_list_player_next (mlp, &ex);
282     catch ();
283
284     while (!libvlc_media_list_player_is_playing (mlp))
285         sched_yield();
286
287     libvlc_media_list_player_pause (mlp, &ex);
288     catch();
289
290     libvlc_media_list_player_next (mlp, &ex);
291     catch ();
292
293     while (!libvlc_media_list_player_is_playing (mlp))
294         sched_yield();
295
296     libvlc_media_list_player_stop (mlp);
297
298     while (libvlc_media_list_player_is_playing (mlp))
299         sched_yield();
300
301     libvlc_media_list_player_next (mlp, &ex);
302     catch ();
303
304     while (!libvlc_media_list_player_is_playing (mlp))
305         sched_yield();
306
307     libvlc_media_list_player_stop (mlp);
308     while (libvlc_media_list_player_is_playing (mlp))
309         sched_yield();
310
311     libvlc_media_list_player_release (mlp);
312     libvlc_release (vlc);
313 }
314
315 static void test_media_list_player_pause_stop(const char** argv, int argc)
316 {
317     libvlc_instance_t *vlc;
318     libvlc_media_t *md;
319     libvlc_media_list_t *ml;
320     libvlc_media_list_player_t *mlp;
321
322     const char * file = test_default_sample;
323
324     log ("Testing play and pause of %s using the media list.\n", file);
325
326     libvlc_exception_init (&ex);
327     vlc = libvlc_new (argc, argv, &ex);
328     catch ();
329
330     md = libvlc_media_new (vlc, file, &ex);
331     catch ();
332
333     ml = libvlc_media_list_new (vlc, &ex);
334     catch ();
335
336     mlp = libvlc_media_list_player_new (vlc, &ex);
337
338     libvlc_media_list_add_media( ml, md, &ex );
339     catch ();
340
341     libvlc_media_list_player_set_media_list( mlp, ml );
342
343     libvlc_media_list_player_play_item( mlp, md, &ex );
344     catch ();
345
346     while (!libvlc_media_list_player_is_playing (mlp))
347         sched_yield();
348
349     libvlc_media_list_player_pause (mlp, &ex);
350     catch();
351
352     libvlc_media_list_player_stop (mlp);
353
354     while (libvlc_media_list_player_is_playing (mlp))
355         sched_yield();
356
357     libvlc_media_release (md);
358     libvlc_media_list_player_release (mlp);
359     libvlc_release (vlc);
360 }
361
362 static void test_media_list_player_play_item_at_index(const char** argv, int argc)
363 {
364     libvlc_instance_t *vlc;
365     libvlc_media_t *md;
366     libvlc_media_list_t *ml;
367     libvlc_media_list_player_t *mlp;
368
369     const char * file = test_default_sample;
370
371     log ("Testing play_item_at_index of %s using the media list.\n", file);
372
373     libvlc_exception_init (&ex);
374     vlc = libvlc_new (argc, argv, &ex);
375     catch ();
376
377     md = libvlc_media_new (vlc, file, &ex);
378     catch ();
379
380     ml = libvlc_media_list_new (vlc, &ex);
381     catch ();
382
383     mlp = libvlc_media_list_player_new (vlc, &ex);
384
385     for (unsigned i = 0; i < 5; i++)
386     {
387         libvlc_media_list_add_media( ml, md, &ex );
388         catch ();
389     }
390
391     libvlc_media_list_player_set_media_list( mlp, ml );
392
393     libvlc_media_list_player_play_item_at_index( mlp, 0, &ex );
394     catch ();
395
396     while (!libvlc_media_list_player_is_playing (mlp))
397         sched_yield();
398
399     libvlc_media_list_player_stop (mlp);
400
401     while (libvlc_media_list_player_is_playing (mlp))
402         sched_yield();
403
404     libvlc_media_release (md);
405     libvlc_media_list_player_release (mlp);
406     libvlc_release (vlc);
407 }
408
409 static void test_media_list_player_playback_options (const char** argv, int argc)
410 {
411     libvlc_instance_t *vlc;
412     libvlc_media_t *md;
413     libvlc_media_t *md2;
414     libvlc_media_t *md3;
415     libvlc_media_t *md4;
416     libvlc_media_t *md5;
417     libvlc_media_list_t *ml;
418     libvlc_media_list_t *ml2;
419     libvlc_media_list_t *ml3;
420     libvlc_media_list_t *ml4;
421     libvlc_media_list_t *ml5;
422     libvlc_media_list_t *ml6;
423     libvlc_media_list_player_t *mlp;
424
425     const char * file = test_default_sample;
426
427     log ("Testing media player playback options()\n");
428
429     libvlc_exception_init (&ex);
430     vlc = libvlc_new (argc, argv, &ex);
431     catch ();
432
433     /*
434      *   Create the following media tree:
435      *
436      *  ml1:            0 ---- 1 ---- 2
437      *                 /       |       \
438      *  ml2&4:      0 -- 1     |   0 -- 1 -- 2
439      *                         |
440      *  ml3:    0 -- 1 -- 2 -- 3 -- 4 -- 5 -- 6
441      *                    |                   |
442      *  ml5&6:            0                 0 -- 1
443      */
444
445     md = libvlc_media_new (vlc, file, &ex);
446     catch ();
447
448     md2 = libvlc_media_new (vlc, file, &ex);
449     catch ();
450
451     md3 = libvlc_media_new (vlc, file, &ex);
452     catch ();
453
454     md4 = libvlc_media_new (vlc, file, &ex);
455     catch ();
456
457     md5 = libvlc_media_new (vlc, file, &ex);
458     catch ();
459
460     ml = libvlc_media_list_new (vlc, &ex);
461     catch ();
462
463     ml2 = libvlc_media_list_new (vlc, &ex);
464     catch ();
465
466     ml3 = libvlc_media_list_new (vlc, &ex);
467     catch ();
468
469     ml4 = libvlc_media_list_new (vlc, &ex);
470     catch ();
471
472     ml5 = libvlc_media_list_new (vlc, &ex);
473     catch ();
474
475     ml6 = libvlc_media_list_new (vlc, &ex);
476     catch ();
477
478     media_list_add_file_path (vlc, ml2, file);
479     media_list_add_file_path (vlc, ml2, file);
480
481     media_list_add_file_path (vlc, ml3, file);
482     media_list_add_file_path (vlc, ml3, file);
483     libvlc_media_list_add_media (ml3, md4, &ex);
484     catch ();
485     media_list_add_file_path (vlc, ml3, file);
486     media_list_add_file_path (vlc, ml3, file);
487     media_list_add_file_path (vlc, ml3, file);
488     libvlc_media_list_add_media (ml3, md5, &ex);
489     catch ();
490
491     media_list_add_file_path (vlc, ml4, file);
492     media_list_add_file_path (vlc, ml4, file);
493     media_list_add_file_path (vlc, ml4, file);
494
495     media_list_add_file_path (vlc, ml5, file);
496
497     media_list_add_file_path (vlc, ml6, file);
498     media_list_add_file_path (vlc, ml6, file);
499
500     md->p_subitems = ml2;
501     md2->p_subitems = ml3;
502     md3->p_subitems = ml4;
503     md4->p_subitems = ml5;
504     md5->p_subitems = ml6;
505
506     libvlc_media_list_add_media (ml, md, &ex);
507     catch ();
508
509     libvlc_media_list_add_media (ml, md2, &ex);
510     catch ();
511
512     libvlc_media_list_add_media (ml, md3, &ex);
513     catch ();
514
515     mlp = libvlc_media_list_player_new (vlc, &ex);
516     catch ();
517
518     libvlc_media_list_player_set_media_list (mlp, ml);
519
520     // Test default playback mode
521     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_default);
522
523     libvlc_media_list_player_play_item (mlp, md, &ex);
524     catch ();
525
526     while (!libvlc_media_list_player_is_playing (mlp))
527         sched_yield();
528
529     libvlc_media_release (md);
530     libvlc_media_release (md2);
531     libvlc_media_release (md3);
532     libvlc_media_release (md4);
533     libvlc_media_release (md5);
534
535     libvlc_media_list_player_stop (mlp);
536
537     while (libvlc_media_list_player_is_playing (mlp))
538         sched_yield();
539
540     // Test looping playback mode
541     log ("Testing media player playback option - Loop\n");
542     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_loop);
543
544     libvlc_media_list_player_play_item (mlp, md, &ex);
545     catch ();
546
547     while (!libvlc_media_list_player_is_playing (mlp))
548         sched_yield();
549
550     libvlc_media_list_player_stop (mlp);
551
552     while (libvlc_media_list_player_is_playing (mlp))
553         sched_yield();
554
555     // Test repeat playback mode
556     log ("Testing media player playback option - Repeat\n");
557     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_repeat);
558
559     libvlc_media_list_player_play_item (mlp, md, &ex);
560     catch ();
561
562     while (!libvlc_media_list_player_is_playing (mlp))
563         sched_yield();
564
565     libvlc_media_list_player_stop (mlp);
566
567     while (libvlc_media_list_player_is_playing (mlp))
568         sched_yield();
569
570     libvlc_media_list_player_release (mlp);
571     libvlc_release (vlc);
572 }
573
574
575 int main (void)
576 {
577     test_init();
578
579     test_media_list_player_pause_stop (test_defaults_args, test_defaults_nargs);
580     test_media_list_player_play_item_at_index (test_defaults_args, test_defaults_nargs);
581     test_media_list_player_previous (test_defaults_args, test_defaults_nargs);
582     test_media_list_player_next (test_defaults_args, test_defaults_nargs);
583     test_media_list_player_items_queue (test_defaults_args, test_defaults_nargs);
584     test_media_list_player_playback_options (test_defaults_args, test_defaults_nargs);
585     return 0;
586 }