2 * media_list_player.c - libvlc smoke test
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. *
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. *
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 **********************************************************************/
27 #include <vlc_common.h>
28 #include <vlc_mtime.h>
30 #include "libvlc_additions.h"
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.
37 #include "../../src/control/media_internal.h"
39 struct check_items_order_data {
46 static inline void check_data_init(struct check_items_order_data *check)
50 check->done_playing = false;
53 static inline void queue_expected_item(struct check_items_order_data *check, void *item)
55 assert(check->count < 16);
56 check->items[check->count] = item;
60 static inline void wait_queued_items(struct check_items_order_data *check)
62 // Wait dummily for check_items_order_callback() to flag 'done_playing':
63 while (!check->done_playing)
67 static void check_items_order_callback(const libvlc_event_t * p_event, void * user_data)
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)
74 char *title = libvlc_media_get_meta(md, libvlc_meta_Title);
75 log ("Got items %s\n", title);
78 assert(checks->items[checks->index] == md);
80 char *title = libvlc_media_get_meta(md, libvlc_meta_Title);
81 log ("Item %d '%s' was correctly queued\n", checks->index, title);
84 if (checks->index == (checks->count - 1))
86 log ("Done playing with success\n");
87 checks->done_playing = true;
92 static void test_media_list_player_items_queue(const char** argv, int argc)
94 libvlc_instance_t *vlc;
96 libvlc_media_list_t *ml;
97 libvlc_media_list_player_t *mlp;
99 const char * file = test_default_sample;
101 log ("Testing media player item queue-ing\n");
103 libvlc_exception_init (&ex);
104 vlc = libvlc_new (argc, argv, &ex);
107 md = libvlc_media_new (vlc, file, &ex);
110 ml = libvlc_media_list_new (vlc, &ex);
113 mlp = libvlc_media_list_player_new (vlc, &ex);
116 libvlc_media_list_add_media (ml, md, &ex);
119 static struct check_items_order_data check;
120 check_data_init(&check);
121 queue_expected_item(&check, md);
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));
129 libvlc_media_t *node = libvlc_media_new_as_node(vlc, "node", &ex);
131 libvlc_media_list_add_media(ml, node, &ex);
133 queue_expected_item(&check, node);
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);
142 libvlc_media_list_player_set_media_list (mlp, ml, &ex);
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);
148 libvlc_media_list_player_play(mlp, &ex);
151 // Wait until all item are read
152 wait_queued_items(&check);
154 libvlc_media_list_player_stop (mlp, &ex);
157 while (libvlc_media_list_player_is_playing (mlp, &ex))
160 libvlc_media_list_player_release (mlp);
163 libvlc_release (vlc);
167 static void test_media_list_player_previous(const char** argv, int argc)
169 libvlc_instance_t *vlc;
171 libvlc_media_list_t *ml;
172 libvlc_media_list_player_t *mlp;
174 const char * file = test_default_sample;
176 log ("Testing media player previous()\n");
178 libvlc_exception_init (&ex);
179 vlc = libvlc_new (argc, argv, &ex);
182 md = libvlc_media_new (vlc, file, &ex);
185 ml = libvlc_media_list_new (vlc, &ex);
188 mlp = libvlc_media_list_player_new (vlc, &ex);
191 libvlc_media_list_add_media (ml, md, &ex);
195 media_list_add_file_path (vlc, ml, file);
196 media_list_add_file_path (vlc, ml, file);
197 media_list_add_file_path (vlc, ml, file);
199 libvlc_media_list_player_set_media_list (mlp, ml, &ex);
201 libvlc_media_list_player_play_item (mlp, md, &ex);
204 while (!libvlc_media_list_player_is_playing (mlp, &ex))
207 libvlc_media_release (md);
209 libvlc_media_list_player_previous (mlp, &ex);
212 while (!libvlc_media_list_player_is_playing (mlp, &ex))
215 libvlc_media_list_player_pause (mlp, &ex);
218 libvlc_media_list_player_previous (mlp, &ex);
221 while (!libvlc_media_list_player_is_playing (mlp, &ex))
224 libvlc_media_list_player_stop (mlp, &ex);
227 while (libvlc_media_list_player_is_playing (mlp, &ex))
230 libvlc_media_list_player_previous (mlp, &ex);
233 while (!libvlc_media_list_player_is_playing (mlp, &ex))
236 libvlc_media_list_player_stop (mlp, &ex);
239 while (libvlc_media_list_player_is_playing (mlp, &ex))
242 libvlc_media_list_player_release (mlp);
245 libvlc_release (vlc);
249 static void test_media_list_player_next(const char** argv, int argc)
251 libvlc_instance_t *vlc;
253 libvlc_media_list_t *ml;
254 libvlc_media_list_player_t *mlp;
256 const char * file = test_default_sample;
258 log ("Testing media player next()\n");
260 libvlc_exception_init (&ex);
261 vlc = libvlc_new (argc, argv, &ex);
264 md = libvlc_media_new (vlc, file, &ex);
267 ml = libvlc_media_list_new (vlc, &ex);
270 mlp = libvlc_media_list_player_new (vlc, &ex);
273 libvlc_media_list_add_media (ml, md, &ex);
277 media_list_add_file_path (vlc, ml, file);
278 media_list_add_file_path (vlc, ml, file);
279 media_list_add_file_path (vlc, ml, file);
281 libvlc_media_list_player_set_media_list (mlp, ml, &ex);
283 libvlc_media_list_player_play_item (mlp, md, &ex);
286 libvlc_media_release (md);
288 while (!libvlc_media_list_player_is_playing (mlp, &ex))
291 libvlc_media_list_player_next (mlp, &ex);
294 while (!libvlc_media_list_player_is_playing (mlp, &ex))
297 libvlc_media_list_player_pause (mlp, &ex);
300 libvlc_media_list_player_next (mlp, &ex);
303 while (!libvlc_media_list_player_is_playing (mlp, &ex))
306 libvlc_media_list_player_stop (mlp, &ex);
309 while (libvlc_media_list_player_is_playing (mlp, &ex))
312 libvlc_media_list_player_next (mlp, &ex);
315 while (!libvlc_media_list_player_is_playing (mlp, &ex))
318 libvlc_media_list_player_stop (mlp, &ex);
321 while (libvlc_media_list_player_is_playing (mlp, &ex))
324 libvlc_media_list_player_release (mlp);
327 libvlc_release (vlc);
331 static void test_media_list_player_pause_stop(const char** argv, int argc)
333 libvlc_instance_t *vlc;
335 libvlc_media_list_t *ml;
336 libvlc_media_list_player_t *mlp;
338 const char * file = test_default_sample;
340 log ("Testing play and pause of %s using the media list.\n", file);
342 libvlc_exception_init (&ex);
343 vlc = libvlc_new (argc, argv, &ex);
346 md = libvlc_media_new (vlc, file, &ex);
349 ml = libvlc_media_list_new (vlc, &ex);
352 mlp = libvlc_media_list_player_new (vlc, &ex);
354 libvlc_media_list_add_media( ml, md, &ex );
357 libvlc_media_list_player_set_media_list( mlp, ml, &ex );
359 libvlc_media_list_player_play_item( mlp, md, &ex );
362 while (!libvlc_media_list_player_is_playing (mlp, &ex))
365 libvlc_media_list_player_pause (mlp, &ex);
368 libvlc_media_list_player_stop (mlp, &ex);
371 while (libvlc_media_list_player_is_playing (mlp, &ex))
374 libvlc_media_release (md);
376 libvlc_media_list_player_release (mlp);
379 libvlc_release (vlc);
383 static void test_media_list_player_play_item_at_index(const char** argv, int argc)
385 libvlc_instance_t *vlc;
387 libvlc_media_list_t *ml;
388 libvlc_media_list_player_t *mlp;
390 const char * file = test_default_sample;
392 log ("Testing play_item_at_index of %s using the media list.\n", file);
394 libvlc_exception_init (&ex);
395 vlc = libvlc_new (argc, argv, &ex);
398 md = libvlc_media_new (vlc, file, &ex);
401 ml = libvlc_media_list_new (vlc, &ex);
404 mlp = libvlc_media_list_player_new (vlc, &ex);
406 for (unsigned i = 0; i < 5; i++)
408 libvlc_media_list_add_media( ml, md, &ex );
412 libvlc_media_list_player_set_media_list( mlp, ml, &ex );
414 libvlc_media_list_player_play_item_at_index( mlp, 0, &ex );
417 while (!libvlc_media_list_player_is_playing (mlp, &ex))
420 libvlc_media_list_player_stop (mlp, &ex);
423 while (libvlc_media_list_player_is_playing (mlp, &ex))
426 libvlc_media_release (md);
429 libvlc_media_list_player_release (mlp);
432 libvlc_release (vlc);
436 static void test_media_list_player_playback_options (const char** argv, int argc)
438 libvlc_instance_t *vlc;
444 libvlc_media_list_t *ml;
445 libvlc_media_list_t *ml2;
446 libvlc_media_list_t *ml3;
447 libvlc_media_list_t *ml4;
448 libvlc_media_list_t *ml5;
449 libvlc_media_list_t *ml6;
450 libvlc_media_list_player_t *mlp;
452 const char * file = test_default_sample;
454 log ("Testing media player playback options()\n");
456 libvlc_exception_init (&ex);
457 vlc = libvlc_new (argc, argv, &ex);
461 * Create the following media tree:
463 * ml1: 0 ---- 1 ---- 2
465 * ml2&4: 0 -- 1 | 0 -- 1 -- 2
467 * ml3: 0 -- 1 -- 2 -- 3 -- 4 -- 5 -- 6
472 md = libvlc_media_new (vlc, file, &ex);
475 md2 = libvlc_media_new (vlc, file, &ex);
478 md3 = libvlc_media_new (vlc, file, &ex);
481 md4 = libvlc_media_new (vlc, file, &ex);
484 md5 = libvlc_media_new (vlc, file, &ex);
487 ml = libvlc_media_list_new (vlc, &ex);
490 ml2 = libvlc_media_list_new (vlc, &ex);
493 ml3 = libvlc_media_list_new (vlc, &ex);
496 ml4 = libvlc_media_list_new (vlc, &ex);
499 ml5 = libvlc_media_list_new (vlc, &ex);
502 ml6 = libvlc_media_list_new (vlc, &ex);
505 media_list_add_file_path (vlc, ml2, file);
506 media_list_add_file_path (vlc, ml2, file);
508 media_list_add_file_path (vlc, ml3, file);
509 media_list_add_file_path (vlc, ml3, file);
510 libvlc_media_list_add_media (ml3, md4, &ex);
512 media_list_add_file_path (vlc, ml3, file);
513 media_list_add_file_path (vlc, ml3, file);
514 media_list_add_file_path (vlc, ml3, file);
515 libvlc_media_list_add_media (ml3, md5, &ex);
518 media_list_add_file_path (vlc, ml4, file);
519 media_list_add_file_path (vlc, ml4, file);
520 media_list_add_file_path (vlc, ml4, file);
522 media_list_add_file_path (vlc, ml5, file);
524 media_list_add_file_path (vlc, ml6, file);
525 media_list_add_file_path (vlc, ml6, file);
527 md->p_subitems = ml2;
528 md2->p_subitems = ml3;
529 md3->p_subitems = ml4;
530 md4->p_subitems = ml5;
531 md5->p_subitems = ml6;
533 libvlc_media_list_add_media (ml, md, &ex);
536 libvlc_media_list_add_media (ml, md2, &ex);
539 libvlc_media_list_add_media (ml, md3, &ex);
542 mlp = libvlc_media_list_player_new (vlc, &ex);
545 libvlc_media_list_player_set_media_list (mlp, ml, &ex);
548 // Test default playback mode
549 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_default, &ex);
552 libvlc_media_list_player_play_item (mlp, md, &ex);
555 while (!libvlc_media_list_player_is_playing (mlp, &ex))
558 libvlc_media_release (md);
560 libvlc_media_release (md2);
562 libvlc_media_release (md3);
564 libvlc_media_release (md4);
566 libvlc_media_release (md5);
569 libvlc_media_list_player_stop (mlp, &ex);
572 while (libvlc_media_list_player_is_playing (mlp, &ex))
575 // Test looping playback mode
576 log ("Testing media player playback option - Loop\n");
577 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_loop, &ex);
580 libvlc_media_list_player_play_item (mlp, md, &ex);
583 while (!libvlc_media_list_player_is_playing (mlp, &ex))
586 libvlc_media_list_player_stop (mlp, &ex);
589 while (libvlc_media_list_player_is_playing (mlp, &ex))
592 // Test repeat playback mode
593 log ("Testing media player playback option - Repeat\n");
594 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_repeat, &ex);
597 libvlc_media_list_player_play_item (mlp, md, &ex);
600 while (!libvlc_media_list_player_is_playing (mlp, &ex))
603 libvlc_media_list_player_stop (mlp, &ex);
606 while (libvlc_media_list_player_is_playing (mlp, &ex))
609 libvlc_media_list_player_release (mlp);
612 libvlc_release (vlc);
621 test_media_list_player_pause_stop (test_defaults_args, test_defaults_nargs);
622 test_media_list_player_play_item_at_index (test_defaults_args, test_defaults_nargs);
623 test_media_list_player_previous (test_defaults_args, test_defaults_nargs);
624 test_media_list_player_next (test_defaults_args, test_defaults_nargs);
625 test_media_list_player_items_queue (test_defaults_args, test_defaults_nargs);
626 test_media_list_player_playback_options (test_defaults_args, test_defaults_nargs);