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 vlc = libvlc_new (argc, argv);
104 assert (vlc != NULL);
106 md = libvlc_media_new (vlc, file, &ex);
109 ml = libvlc_media_list_new (vlc);
112 mlp = libvlc_media_list_player_new (vlc, &ex);
115 libvlc_media_list_add_media (ml, md, &ex);
118 static struct check_items_order_data check;
119 check_data_init(&check);
120 queue_expected_item(&check, md);
122 // Add three more media
123 queue_expected_item(&check, media_list_add_file_path (vlc, ml, file));
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));
128 libvlc_media_t *node = libvlc_media_new_as_node(vlc, "node", &ex);
130 libvlc_media_list_add_media(ml, node, &ex);
132 queue_expected_item(&check, node);
134 // Add items to that node
135 libvlc_media_list_t *subitems = libvlc_media_subitems(node);
136 queue_expected_item(&check, media_list_add_file_path(vlc, subitems, file));
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 libvlc_media_list_release(subitems);
141 libvlc_media_list_player_set_media_list (mlp, ml);
143 libvlc_event_manager_t * em = libvlc_media_list_player_event_manager(mlp);
144 int val = libvlc_event_attach(em, libvlc_MediaListPlayerNextItemSet,
145 check_items_order_callback, &check);
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);
155 while (libvlc_media_list_player_is_playing (mlp))
158 libvlc_media_list_player_release (mlp);
159 libvlc_release (vlc);
162 static void test_media_list_player_previous(const char** argv, int argc)
164 libvlc_instance_t *vlc;
166 libvlc_media_list_t *ml;
167 libvlc_media_list_player_t *mlp;
169 const char * file = test_default_sample;
171 log ("Testing media player previous()\n");
173 vlc = libvlc_new (argc, argv);
174 assert (vlc != NULL);
176 md = libvlc_media_new (vlc, file, &ex);
179 ml = libvlc_media_list_new (vlc);
182 mlp = libvlc_media_list_player_new (vlc, &ex);
185 libvlc_media_list_add_media (ml, md, &ex);
189 media_list_add_file_path (vlc, ml, file);
190 media_list_add_file_path (vlc, ml, file);
191 media_list_add_file_path (vlc, ml, file);
193 libvlc_media_list_player_set_media_list (mlp, ml);
195 libvlc_media_list_player_play_item (mlp, md, &ex);
198 while (!libvlc_media_list_player_is_playing (mlp))
201 libvlc_media_release (md);
203 libvlc_media_list_player_previous (mlp, &ex);
206 while (!libvlc_media_list_player_is_playing (mlp))
209 libvlc_media_list_player_pause (mlp, &ex);
212 libvlc_media_list_player_previous (mlp, &ex);
215 while (!libvlc_media_list_player_is_playing (mlp))
218 libvlc_media_list_player_stop (mlp);
220 while (libvlc_media_list_player_is_playing (mlp))
223 libvlc_media_list_player_previous (mlp, &ex);
226 while (!libvlc_media_list_player_is_playing (mlp))
229 libvlc_media_list_player_stop (mlp);
231 while (libvlc_media_list_player_is_playing (mlp))
234 libvlc_media_list_player_release (mlp);
235 libvlc_release (vlc);
238 static void test_media_list_player_next(const char** argv, int argc)
240 libvlc_instance_t *vlc;
242 libvlc_media_list_t *ml;
243 libvlc_media_list_player_t *mlp;
245 const char * file = test_default_sample;
247 log ("Testing media player next()\n");
249 vlc = libvlc_new (argc, argv);
250 assert (vlc != NULL);
252 md = libvlc_media_new (vlc, file, &ex);
255 ml = libvlc_media_list_new (vlc);
258 mlp = libvlc_media_list_player_new (vlc, &ex);
261 libvlc_media_list_add_media (ml, md, &ex);
265 media_list_add_file_path (vlc, ml, file);
266 media_list_add_file_path (vlc, ml, file);
267 media_list_add_file_path (vlc, ml, file);
269 libvlc_media_list_player_set_media_list (mlp, ml);
271 libvlc_media_list_player_play_item (mlp, md, &ex);
274 libvlc_media_release (md);
276 while (!libvlc_media_list_player_is_playing (mlp))
279 libvlc_media_list_player_next (mlp, &ex);
282 while (!libvlc_media_list_player_is_playing (mlp))
285 libvlc_media_list_player_pause (mlp, &ex);
288 libvlc_media_list_player_next (mlp, &ex);
291 while (!libvlc_media_list_player_is_playing (mlp))
294 libvlc_media_list_player_stop (mlp);
296 while (libvlc_media_list_player_is_playing (mlp))
299 libvlc_media_list_player_next (mlp, &ex);
302 while (!libvlc_media_list_player_is_playing (mlp))
305 libvlc_media_list_player_stop (mlp);
306 while (libvlc_media_list_player_is_playing (mlp))
309 libvlc_media_list_player_release (mlp);
310 libvlc_release (vlc);
313 static void test_media_list_player_pause_stop(const char** argv, int argc)
315 libvlc_instance_t *vlc;
317 libvlc_media_list_t *ml;
318 libvlc_media_list_player_t *mlp;
320 const char * file = test_default_sample;
322 log ("Testing play and pause of %s using the media list.\n", file);
324 vlc = libvlc_new (argc, argv);
325 assert (vlc != NULL);
327 md = libvlc_media_new (vlc, file, &ex);
330 ml = libvlc_media_list_new (vlc);
333 mlp = libvlc_media_list_player_new (vlc, &ex);
335 libvlc_media_list_add_media( ml, md, &ex );
338 libvlc_media_list_player_set_media_list( mlp, ml );
340 libvlc_media_list_player_play_item( mlp, md, &ex );
343 while (!libvlc_media_list_player_is_playing (mlp))
346 libvlc_media_list_player_pause (mlp, &ex);
349 libvlc_media_list_player_stop (mlp);
351 while (libvlc_media_list_player_is_playing (mlp))
354 libvlc_media_release (md);
355 libvlc_media_list_player_release (mlp);
356 libvlc_release (vlc);
359 static void test_media_list_player_play_item_at_index(const char** argv, int argc)
361 libvlc_instance_t *vlc;
363 libvlc_media_list_t *ml;
364 libvlc_media_list_player_t *mlp;
366 const char * file = test_default_sample;
368 log ("Testing play_item_at_index of %s using the media list.\n", file);
370 vlc = libvlc_new (argc, argv, &ex);
371 assert (vlc != NULL);
373 md = libvlc_media_new (vlc, file, &ex);
376 ml = libvlc_media_list_new (vlc);
379 mlp = libvlc_media_list_player_new (vlc, &ex);
381 for (unsigned i = 0; i < 5; i++)
383 libvlc_media_list_add_media( ml, md, &ex );
387 libvlc_media_list_player_set_media_list( mlp, ml );
389 libvlc_media_list_player_play_item_at_index( mlp, 0, &ex );
392 while (!libvlc_media_list_player_is_playing (mlp))
395 libvlc_media_list_player_stop (mlp);
397 while (libvlc_media_list_player_is_playing (mlp))
400 libvlc_media_release (md);
401 libvlc_media_list_player_release (mlp);
402 libvlc_release (vlc);
405 static void test_media_list_player_playback_options (const char** argv, int argc)
407 libvlc_instance_t *vlc;
413 libvlc_media_list_t *ml;
414 libvlc_media_list_t *ml2;
415 libvlc_media_list_t *ml3;
416 libvlc_media_list_t *ml4;
417 libvlc_media_list_t *ml5;
418 libvlc_media_list_t *ml6;
419 libvlc_media_list_player_t *mlp;
421 const char * file = test_default_sample;
423 log ("Testing media player playback options()\n");
425 vlc = libvlc_new (argc, argv);
426 assert (vlc != NULL);
429 * Create the following media tree:
431 * ml1: 0 ---- 1 ---- 2
433 * ml2&4: 0 -- 1 | 0 -- 1 -- 2
435 * ml3: 0 -- 1 -- 2 -- 3 -- 4 -- 5 -- 6
440 md = libvlc_media_new (vlc, file, &ex);
443 md2 = libvlc_media_new (vlc, file, &ex);
446 md3 = libvlc_media_new (vlc, file, &ex);
449 md4 = libvlc_media_new (vlc, file, &ex);
452 md5 = libvlc_media_new (vlc, file, &ex);
455 ml = libvlc_media_list_new (vlc);
458 ml2 = libvlc_media_list_new (vlc);
459 assert (ml2 != NULL);
461 ml3 = libvlc_media_list_new (vlc);
462 assert (ml3 != NULL);
464 ml4 = libvlc_media_list_new (vlc);
465 assert (ml4 != NULL);
467 ml5 = libvlc_media_list_new (vlc);
468 assert (ml5 != NULL);
470 ml6 = libvlc_media_list_new (vlc);
471 assert (ml6 != NULL);
473 media_list_add_file_path (vlc, ml2, file);
474 media_list_add_file_path (vlc, ml2, file);
476 media_list_add_file_path (vlc, ml3, file);
477 media_list_add_file_path (vlc, ml3, file);
478 libvlc_media_list_add_media (ml3, md4, &ex);
480 media_list_add_file_path (vlc, ml3, file);
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, md5, &ex);
486 media_list_add_file_path (vlc, ml4, file);
487 media_list_add_file_path (vlc, ml4, file);
488 media_list_add_file_path (vlc, ml4, file);
490 media_list_add_file_path (vlc, ml5, file);
492 media_list_add_file_path (vlc, ml6, file);
493 media_list_add_file_path (vlc, ml6, file);
495 md->p_subitems = ml2;
496 md2->p_subitems = ml3;
497 md3->p_subitems = ml4;
498 md4->p_subitems = ml5;
499 md5->p_subitems = ml6;
501 libvlc_media_list_add_media (ml, md, &ex);
504 libvlc_media_list_add_media (ml, md2, &ex);
507 libvlc_media_list_add_media (ml, md3, &ex);
510 mlp = libvlc_media_list_player_new (vlc, &ex);
513 libvlc_media_list_player_set_media_list (mlp, ml);
515 // Test default playback mode
516 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_default);
518 libvlc_media_list_player_play_item (mlp, md, &ex);
521 while (!libvlc_media_list_player_is_playing (mlp))
524 libvlc_media_release (md);
525 libvlc_media_release (md2);
526 libvlc_media_release (md3);
527 libvlc_media_release (md4);
528 libvlc_media_release (md5);
530 libvlc_media_list_player_stop (mlp);
532 while (libvlc_media_list_player_is_playing (mlp))
535 // Test looping playback mode
536 log ("Testing media player playback option - Loop\n");
537 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_loop);
539 libvlc_media_list_player_play_item (mlp, md, &ex);
542 while (!libvlc_media_list_player_is_playing (mlp))
545 libvlc_media_list_player_stop (mlp);
547 while (libvlc_media_list_player_is_playing (mlp))
550 // Test repeat playback mode
551 log ("Testing media player playback option - Repeat\n");
552 libvlc_media_list_player_set_playback_mode(mlp, libvlc_playback_mode_repeat);
554 libvlc_media_list_player_play_item (mlp, md, &ex);
557 while (!libvlc_media_list_player_is_playing (mlp))
560 libvlc_media_list_player_stop (mlp);
562 while (libvlc_media_list_player_is_playing (mlp))
565 libvlc_media_list_player_release (mlp);
566 libvlc_release (vlc);
574 test_media_list_player_pause_stop (test_defaults_args, test_defaults_nargs);
575 test_media_list_player_play_item_at_index (test_defaults_args, test_defaults_nargs);
576 test_media_list_player_previous (test_defaults_args, test_defaults_nargs);
577 test_media_list_player_next (test_defaults_args, test_defaults_nargs);
578 test_media_list_player_items_queue (test_defaults_args, test_defaults_nargs);
579 test_media_list_player_playback_options (test_defaults_args, test_defaults_nargs);