Update test cases
[vlc.git] / 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, &ex);
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, &ex);
155     catch ();
156
157     libvlc_media_list_player_release (mlp);
158     catch ();
159     
160     libvlc_release (vlc);
161     catch ();
162 }
163
164 static void test_media_list_player_previous(const char** argv, int argc)
165 {
166     libvlc_instance_t *vlc;
167     libvlc_media_t *md;
168     libvlc_media_list_t *ml;
169     libvlc_media_list_player_t *mlp;
170     
171     const char * file = test_default_sample;
172     
173     log ("Testing media player previous()\n");
174     
175     libvlc_exception_init (&ex);
176     vlc = libvlc_new (argc, argv, &ex);
177     catch ();
178     
179     md = libvlc_media_new (vlc, file, &ex);
180     catch ();
181     
182     ml = libvlc_media_list_new (vlc, &ex);
183     catch ();
184     
185     mlp = libvlc_media_list_player_new (vlc, &ex);
186     catch ();
187
188     libvlc_media_list_add_media (ml, md, &ex);
189     catch ();
190
191     // Add three media
192     media_list_add_file_path (vlc, ml, file);
193     media_list_add_file_path (vlc, ml, file);
194     media_list_add_file_path (vlc, ml, file);
195
196     libvlc_media_list_player_set_media_list (mlp, ml, &ex);
197
198     libvlc_media_list_player_play_item (mlp, md, &ex);
199     catch ();
200
201     libvlc_media_release (md);
202
203     msleep(100000);
204     
205     libvlc_media_list_player_previous (mlp, &ex);
206     catch ();
207
208     libvlc_media_list_player_pause (mlp, &ex);
209     catch();
210
211     msleep(100000);
212     
213     libvlc_media_list_player_previous (mlp, &ex);
214     catch ();
215     
216     libvlc_media_list_player_stop (mlp, &ex);
217     catch ();
218
219     msleep(100000);
220     
221     libvlc_media_list_player_previous (mlp, &ex);
222     catch ();
223     
224     libvlc_media_list_player_release (mlp);
225     catch ();
226     
227     libvlc_release (vlc);
228     catch ();
229 }
230
231 static void test_media_list_player_next(const char** argv, int argc)
232 {
233     libvlc_instance_t *vlc;
234     libvlc_media_t *md;
235     libvlc_media_list_t *ml;
236     libvlc_media_list_player_t *mlp;
237     
238     const char * file = test_default_sample;
239     
240     log ("Testing media player next()\n");
241     
242     libvlc_exception_init (&ex);
243     vlc = libvlc_new (argc, argv, &ex);
244     catch ();
245     
246     md = libvlc_media_new (vlc, file, &ex);
247     catch ();
248     
249     ml = libvlc_media_list_new (vlc, &ex);
250     catch ();
251     
252     mlp = libvlc_media_list_player_new (vlc, &ex);
253     catch ();
254
255     libvlc_media_list_add_media (ml, md, &ex);
256     catch ();
257
258     // Add three media
259     media_list_add_file_path (vlc, ml, file);
260     media_list_add_file_path (vlc, ml, file);
261     media_list_add_file_path (vlc, ml, file);
262
263     libvlc_media_list_player_set_media_list (mlp, ml, &ex);
264     
265     libvlc_media_list_player_play_item (mlp, md, &ex);
266     catch ();
267
268     libvlc_media_release (md);
269
270     msleep(100000);
271     
272     libvlc_media_list_player_next (mlp, &ex);
273     catch ();
274
275     libvlc_media_list_player_pause (mlp, &ex);
276     catch();
277
278     msleep(100000);
279     
280     libvlc_media_list_player_next (mlp, &ex);
281     catch ();
282     
283     libvlc_media_list_player_stop (mlp, &ex);
284     catch ();
285
286     msleep(100000);
287     
288     libvlc_media_list_player_next (mlp, &ex);
289     catch ();
290         
291     libvlc_media_list_player_release (mlp);
292     catch ();
293     
294     libvlc_release (vlc);
295     catch ();
296 }
297
298 static void test_media_list_player_pause_stop(const char** argv, int argc)
299 {
300     libvlc_instance_t *vlc;
301     libvlc_media_t *md;
302     libvlc_media_list_t *ml;
303     libvlc_media_list_player_t *mlp;
304
305     const char * file = test_default_sample;
306
307     log ("Testing play and pause of %s using the media list.\n", file);
308
309     libvlc_exception_init (&ex);
310     vlc = libvlc_new (argc, argv, &ex);
311     catch ();
312
313     md = libvlc_media_new (vlc, file, &ex);
314     catch ();
315
316     ml = libvlc_media_list_new (vlc, &ex);
317     catch ();
318
319     mlp = libvlc_media_list_player_new (vlc, &ex);
320
321     libvlc_media_list_add_media( ml, md, &ex );
322     catch ();
323
324     libvlc_media_list_player_set_media_list( mlp, ml, &ex );
325
326     libvlc_media_list_player_play_item( mlp, md, &ex );
327     catch ();
328
329     libvlc_media_list_player_pause (mlp, &ex);
330     catch();
331
332     libvlc_media_list_player_stop (mlp, &ex);
333     catch ();
334
335     libvlc_media_release (md);
336
337     libvlc_media_list_player_release (mlp);
338     catch ();
339
340     libvlc_release (vlc);
341     catch ();
342 }
343
344 static void test_media_list_player_play_item_at_index(const char** argv, int argc)
345 {
346     libvlc_instance_t *vlc;
347     libvlc_media_t *md;
348     libvlc_media_list_t *ml;
349     libvlc_media_list_player_t *mlp;
350
351     const char * file = test_default_sample;
352
353     log ("Testing play_item_at_index of %s using the media list.\n", file);
354
355     libvlc_exception_init (&ex);
356     vlc = libvlc_new (argc, argv, &ex);
357     catch ();
358
359     md = libvlc_media_new (vlc, file, &ex);
360     catch ();
361
362     ml = libvlc_media_list_new (vlc, &ex);
363     catch ();
364
365     mlp = libvlc_media_list_player_new (vlc, &ex);
366
367     for (unsigned i = 0; i < 5; i++)
368     {
369         libvlc_media_list_add_media( ml, md, &ex );
370         catch ();
371     }
372
373     libvlc_media_list_player_set_media_list( mlp, ml, &ex );
374
375     libvlc_media_list_player_play_item_at_index( mlp, 0, &ex );
376     catch ();
377
378     libvlc_media_list_player_stop (mlp, &ex);
379     catch ();
380
381     libvlc_media_release (md);
382     catch ();
383
384     libvlc_media_list_player_release (mlp);
385     catch ();
386
387     libvlc_release (vlc);
388     catch ();
389 }
390
391 static void test_media_list_player_playback_options (const char** argv, int argc)
392 {
393     libvlc_instance_t *vlc;
394     libvlc_media_t *md;
395     libvlc_media_t *md2;
396     libvlc_media_t *md3;
397     libvlc_media_t *md4;
398     libvlc_media_t *md5;
399     libvlc_media_list_t *ml;
400     libvlc_media_list_t *ml2;
401     libvlc_media_list_t *ml3;
402     libvlc_media_list_t *ml4;
403     libvlc_media_list_t *ml5;
404     libvlc_media_list_t *ml6;
405     libvlc_media_list_player_t *mlp;
406     
407     const char * file = test_default_sample;
408     
409     log ("Testing media player playback options()\n");
410     
411     libvlc_exception_init (&ex);
412     vlc = libvlc_new (argc, argv, &ex);
413     catch ();
414     
415     /*
416      *   Create the following media tree:
417      *
418      *  ml1:            0 ---- 1 ---- 2
419      *                 /       |       \
420      *  ml2&4:      0 -- 1     |   0 -- 1 -- 2
421      *                         |
422      *  ml3:    0 -- 1 -- 2 -- 3 -- 4 -- 5 -- 6
423      *                    |                   |
424      *  ml5&6:            0                 0 -- 1
425      */
426
427     md = libvlc_media_new (vlc, file, &ex);
428     catch ();
429
430     md2 = libvlc_media_new (vlc, file, &ex);
431     catch ();
432
433     md3 = libvlc_media_new (vlc, file, &ex);
434     catch ();
435
436     md4 = libvlc_media_new (vlc, file, &ex);
437     catch ();
438
439     md5 = libvlc_media_new (vlc, file, &ex);
440     catch ();
441     
442     ml = libvlc_media_list_new (vlc, &ex);
443     catch ();
444     
445     ml2 = libvlc_media_list_new (vlc, &ex);
446     catch ();
447
448     ml3 = libvlc_media_list_new (vlc, &ex);
449     catch ();
450
451     ml4 = libvlc_media_list_new (vlc, &ex);
452     catch ();
453
454     ml5 = libvlc_media_list_new (vlc, &ex);
455     catch ();
456
457     ml6 = libvlc_media_list_new (vlc, &ex);
458     catch ();
459
460     media_list_add_file_path (vlc, ml2, file);
461     media_list_add_file_path (vlc, ml2, file);
462
463     media_list_add_file_path (vlc, ml3, file);
464     media_list_add_file_path (vlc, ml3, file);
465     libvlc_media_list_add_media (ml3, md4, &ex);
466     catch ();
467     media_list_add_file_path (vlc, ml3, file);
468     media_list_add_file_path (vlc, ml3, file);
469     media_list_add_file_path (vlc, ml3, file);
470     libvlc_media_list_add_media (ml3, md5, &ex);
471     catch ();
472
473     media_list_add_file_path (vlc, ml4, file);
474     media_list_add_file_path (vlc, ml4, file);
475     media_list_add_file_path (vlc, ml4, file);
476
477     media_list_add_file_path (vlc, ml5, file);
478
479     media_list_add_file_path (vlc, ml6, file);
480     media_list_add_file_path (vlc, ml6, file);
481
482     md->p_subitems = ml2;
483     md2->p_subitems = ml3;
484     md3->p_subitems = ml4;
485     md4->p_subitems = ml5;
486     md5->p_subitems = ml6;
487
488     libvlc_media_list_add_media (ml, md, &ex);
489     catch ();
490
491     libvlc_media_list_add_media (ml, md2, &ex);
492     catch ();
493
494     libvlc_media_list_add_media (ml, md3, &ex);
495     catch ();
496     
497     mlp = libvlc_media_list_player_new (vlc, &ex);
498     catch ();
499
500     libvlc_media_list_player_set_media_list (mlp, ml, &ex);
501     catch ();
502     
503     // Test default playback mode 
504     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_default, &ex);
505     catch ();
506
507     libvlc_media_list_player_play_item (mlp, md, &ex);
508     catch ();
509
510     libvlc_media_release (md);
511     catch ();
512     libvlc_media_release (md2);
513     catch ();
514     libvlc_media_release (md3);
515     catch ();
516     libvlc_media_release (md4);
517     catch ();
518     libvlc_media_release (md5);
519     catch ();
520
521     msleep(500000);
522
523     libvlc_media_list_player_stop (mlp, &ex);
524     catch ();
525
526     // Test looping playback mode
527     log ("Testing media player playback option - Loop\n");
528     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_loop, &ex);
529     catch ();
530
531     libvlc_media_list_player_play_item (mlp, md, &ex);
532     catch ();
533
534     msleep(500000);
535
536     libvlc_media_list_player_stop (mlp, &ex);
537     catch ();
538
539     // Test repeat playback mode
540     log ("Testing media player playback option - Repeat\n");
541     libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_repeat, &ex);
542     catch ();
543
544     libvlc_media_list_player_play_item (mlp, md, &ex);
545     catch ();
546
547     msleep(500000);
548         
549     libvlc_media_list_player_release (mlp);
550     catch ();
551     
552     libvlc_release (vlc);
553     catch ();
554 }
555
556
557 int main (void)
558 {
559     test_init();
560
561     test_media_list_player_pause_stop (test_defaults_args, test_defaults_nargs);
562     test_media_list_player_play_item_at_index (test_defaults_args, test_defaults_nargs);
563     test_media_list_player_previous (test_defaults_args, test_defaults_nargs);
564     test_media_list_player_next (test_defaults_args, test_defaults_nargs);
565     test_media_list_player_items_queue (test_defaults_args, test_defaults_nargs);
566     test_media_list_player_playback_options (test_defaults_args, test_defaults_nargs);
567     return 0;
568 }