2 * This file is a part of MAFW
4 * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
6 * Contact: Visa Smolander <visa.smolander@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * check-gst-renderer.c
28 * Gst Renderer unit tests
30 * Copyright (C) 2007 Nokia Corporation
40 #include <gst/tag/tag.h>
42 #include <libmafw/mafw.h>
43 #include <checkmore.h>
47 #include "mafw-gst-renderer.h"
48 #include "mafw-mock-playlist.h"
49 #include "mafw-mock-pulseaudio.h"
52 #define G_LOG_DOMAIN "check-mafw-gstreamer-renderer"
54 #define SAMPLE_AUDIO_CLIP "test.wav"
55 #define SAMPLE_VIDEO_CLIP "test.avi"
56 #define SAMPLE_IMAGE "testframe.png"
58 /* Base timeout used when waiting for state transitions or execution of
59 user function callbacks associated to each mafw-renderer function */
60 #define DEFAULT_WAIT_TOUT 2000
62 /* EOS timeout must be longer than the clip duration */
63 #define EOS_TIMEOUT 7000
65 SRunner *configure_tests(void);
78 gboolean error_signal_expected;
79 GError *error_signal_received;
80 const gchar *property_expected;
81 GValue *property_received;
85 const gchar *expected_key;
87 } MetadataChangedInfo;
90 const gchar *expected;
92 } PropertyChangedInfo;
100 static gint wait_tout_val;
104 static MafwRenderer *g_gst_renderer = NULL;
106 /* Error messages. */
108 static const gchar *callback_err_msg = "Error received when %s: (%d) %s";
109 static const gchar *callback_no_err_msg = "No error received when %s: (%d) %s";
110 static const gchar *no_callback_msg = "We forgot to call the user callback";
111 static const gchar *state_err_msg = "Call %s didn't change state to %s. " \
112 "Current state is: %d";
113 static const gchar *index_err_msg = "Actual index is (%d) instead of the " \
114 "expected index (%d)";
117 /*----------------------------------------------------------------------------
119 ----------------------------------------------------------------------------*/
122 static void error_cb(MafwRenderer *s, GQuark domain, gint code, gchar *msg,
125 CallbackInfo* c = (CallbackInfo*) user_data;
127 /* "MafwExtension::error" signal handler */
128 if (user_data == NULL || !c->error_signal_expected) {
129 fail("Signal error received: (%d) %s", code, msg);
131 if (c->error_signal_received != NULL) {
132 fail("Error received already initialized");
134 c->error_signal_received =
135 g_error_new_literal(domain, code, msg);
140 static void state_changed_cb(MafwRenderer *s, MafwPlayState state,
143 /* "MafwRenderer::state-changed" signal handler */
144 RendererInfo *si = (RendererInfo *) user_data;
145 gchar *states[] = {"Stopped","Playing","Paused","Transitioning"};
148 g_debug("state changed (%s) ---", states[state]);
151 static gboolean media_changed_called;
153 static void media_changed_cb(MafwRenderer *s, gint index, gchar *objectid,
156 /* "MafwRenderer::media-changed" signal handler */
157 RendererInfo *si = (RendererInfo *) user_data;
160 g_debug("media changed (%d) ---", index);
161 media_changed_called = TRUE;
163 static void playlist_changed_cb (MafwRenderer *self,
167 g_debug("playlist changed");
168 fail_if(media_changed_called, "At first playlist-changed should be called");
171 static void metadata_changed_cb(MafwRenderer *self, const gchar *key,
172 GValueArray *value, gpointer user_data)
174 MetadataChangedInfo *m = user_data;
176 if (m->expected_key != NULL && strcmp(key, m->expected_key) == 0)
180 original = g_value_array_get_nth(value, 0);
182 m->value = g_new0(GValue, 1);
183 g_value_init(m->value, G_VALUE_TYPE(original));
184 g_value_copy(original, m->value);
188 static void property_changed_cb(MafwExtension *extension, const gchar *name,
189 const GValue *value, gpointer user_data)
191 PropertyChangedInfo* p = (PropertyChangedInfo*) user_data;
194 value_string = g_strdup_value_contents(value);
196 g_debug("property_changed_cb: %s (%s)", name, value_string);
197 g_free(value_string);
199 if (p->expected != NULL &&
200 strcmp(p->expected, name) == 0) {
201 p->received = g_new0(GValue, 1);
202 g_value_init(p->received, G_VALUE_TYPE(value));
203 g_value_copy(value, p->received);
207 static void buffering_info_cb(MafwRenderer *self, gfloat status,
210 BufferingInfo *b = user_data;
218 /*----------------------------------------------------------------------------
220 ----------------------------------------------------------------------------*/
223 static void status_cb(MafwRenderer* renderer, MafwPlaylist* playlist, guint index,
225 const gchar* object_id,
229 /* MafwRendererStatusCB */
230 RendererInfo* s = (RendererInfo*) user_data;
234 fail("Error received while trying to get renderer status: (%d) %s",
235 error->code, error->message);
241 static void playback_cb(MafwRenderer* renderer, gpointer user_data, const GError* error)
243 /* MafwRendererPlaybackCB:
245 Called after mafw_renderer_play(), mafw_renderer_play_uri(),
246 mafw_renderer_play_object(), mafw_renderer_stop(), mafw_renderer_pause(),
247 mafw_renderer_resume(), mafw_renderer_next(), mafw_renderer_previous() or
248 mafw_renderer_goto_index() has been called. */
249 CallbackInfo* c = (CallbackInfo*) user_data;
255 c->err_code = error->code;
256 c->err_msg = g_strdup(error->message);
260 static void seek_cb (MafwRenderer *self, gint position, gpointer user_data,
263 /* Called when seeking */
265 CallbackInfo* c = (CallbackInfo*) user_data;
269 c->seek_position = position;
272 c->err_code = error->code;
273 c->err_msg = g_strdup(error->message);
277 static void get_position_cb(MafwRenderer *self, gint position,
278 gpointer user_data, const GError *error)
280 CallbackInfo* c = (CallbackInfo*) user_data;
282 g_debug("get position cb: %d", position);
286 c->err_code = error->code;
287 c->err_msg = g_strdup(error->message);
292 static void get_property_cb(MafwExtension *self,
298 CallbackInfo* c = (CallbackInfo*) user_data;
301 value_string = g_strdup_value_contents(value);
303 g_debug("get property cb: %s (%s)", name, value_string);
304 g_free(value_string);
308 c->err_code = error->code;
309 c->err_msg = g_strdup(error->message);
312 if (c->property_expected != NULL &&
313 strcmp(c->property_expected, name) == 0) {
314 c->property_received = g_new0(GValue, 1);
315 g_value_init(c->property_received, G_VALUE_TYPE(value));
316 g_value_copy(value, c->property_received);
322 /*----------------------------------------------------------------------------
324 ----------------------------------------------------------------------------*/
326 static gchar *get_sample_clip_path(const gchar *clip)
328 gchar *my_dir, *media;
330 /* Makefile.am sets TESTS_DIR, required for VPATH builds (like make
331 * distcheck). Otherwise assume we are running in-place. */
332 my_dir = g_strdup(g_getenv("TESTS_DIR"));
334 my_dir = g_get_current_dir();
335 media = g_strconcat("file://", my_dir, G_DIR_SEPARATOR_S,
336 "media" G_DIR_SEPARATOR_S, clip,
342 static gchar *get_sample_clip_objectid(const gchar *clip)
345 gchar *objectid = NULL;
347 path = get_sample_clip_path(clip);
348 objectid = mafw_source_create_objectid(path);
354 static gboolean stop_wait_timeout(gpointer user_data)
356 gboolean *do_stop = (gboolean *) user_data;
357 g_debug("stop wait timeout");
363 static gboolean wait_until_timeout_finishes(guint millis)
366 gboolean stop_wait = FALSE;
367 gboolean result = FALSE;
369 g_debug("Init wait_");
370 /* We'll wait a limitted ammount of time */
371 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
373 result= g_main_context_iteration(NULL, TRUE);
376 g_debug("End wait_");
380 static gboolean wait_for_state(RendererInfo *renderer_info,
381 MafwPlayState expected_state, guint millis)
384 gboolean stop_wait = FALSE;
386 g_debug("Init wait for state");
387 /* We'll wait a limitted ammount of time */
388 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
390 while(renderer_info->state != expected_state && !stop_wait) {
391 g_main_context_iteration(NULL, TRUE);
395 g_source_remove(timeout);
398 g_debug("End wait for state");
399 return (renderer_info->state == expected_state);
402 static gboolean wait_for_callback(CallbackInfo *callback, guint millis)
405 gboolean stop_wait = FALSE;
407 g_debug("Init wait for callback");
408 /* We'll wait a limitted ammount of time */
409 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
411 while (callback->called == FALSE && !stop_wait) {
412 g_main_context_iteration(NULL, TRUE);
415 g_source_remove(timeout);
417 g_debug("End wait for callback");
418 return callback->called;
421 static gboolean wait_for_metadata(MetadataChangedInfo *callback, guint millis)
424 gboolean stop_wait = FALSE;
426 g_debug("Init wait for metadata");
427 /* We'll wait a limitted ammount of time */
428 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
430 while (callback->value == NULL && !stop_wait) {
431 g_main_context_iteration(NULL, TRUE);
434 g_source_remove(timeout);
436 g_debug("End wait for metadata");
437 return callback->value != NULL;
440 static gboolean wait_for_property(PropertyChangedInfo *callback, guint millis)
443 gboolean stop_wait = FALSE;
445 g_debug("Init wait for property changed");
446 /* We'll wait a limitted ammount of time */
447 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
449 while (callback->received == NULL && !stop_wait) {
450 g_main_context_iteration(NULL, TRUE);
453 g_source_remove(timeout);
455 g_debug("End wait for callback");
456 return callback->received != NULL;
459 static gboolean wait_for_buffering(BufferingInfo *callback, guint millis)
462 gboolean stop_wait = FALSE;
464 g_debug("Init wait for buffering info");
465 /* We'll wait a limitted ammount of time */
466 timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
468 while (!callback->received && !stop_wait) {
469 g_main_context_iteration(NULL, TRUE);
472 g_source_remove(timeout);
474 g_debug("End wait for buffering info");
475 return callback->received;
478 static void reset_callback_info(CallbackInfo *callback_info)
480 if (callback_info->err_msg != NULL)
481 g_free(callback_info->err_msg);
483 callback_info->err_msg = NULL;
484 callback_info->called = FALSE;
485 callback_info->error = FALSE;
486 callback_info->seek_position = 0;
487 callback_info->error_signal_expected = FALSE;
488 if (callback_info->error_signal_received != NULL) {
489 g_error_free(callback_info->error_signal_received);
490 callback_info->error_signal_received = NULL;
492 callback_info->property_expected = NULL;
493 if (callback_info->property_received != NULL) {
494 g_value_unset(callback_info->property_received);
495 callback_info->property_received = NULL;
499 /*----------------------------------------------------------------------------
501 ----------------------------------------------------------------------------*/
503 static void fx_setup_dummy_gst_renderer(void)
505 MafwRegistry *registry;
510 /* Create a gst renderer instance */
511 registry = MAFW_REGISTRY(mafw_registry_get_instance());
512 fail_if(registry == NULL,
513 "Error: cannot get MAFW registry");
515 g_gst_renderer = MAFW_RENDERER(mafw_gst_renderer_new(registry));
516 fail_if(!MAFW_IS_GST_RENDERER(g_gst_renderer),
517 "Could not create gst renderer instance");
520 static void fx_teardown_dummy_gst_renderer(void)
522 g_object_unref(g_gst_renderer);
525 /*----------------------------------------------------------------------------
527 ----------------------------------------------------------------------------*/
531 GstElement * gst_element_factory_make(const gchar * factoryname,
534 GstElementFactory *factory;
536 const gchar *use_factoryname;
538 g_return_val_if_fail(factoryname != NULL, NULL);
540 /* For testing, use playbin instead of playbin2 */
541 if (g_ascii_strcasecmp(factoryname, "playbin2") == 0)
542 use_factoryname = "playbin";
544 use_factoryname = factoryname;
546 GST_LOG("gstelementfactory: make \"%s\" \"%s\"",
547 use_factoryname, GST_STR_NULL (name));
549 factory = gst_element_factory_find(use_factoryname);
550 if (factory == NULL) {
552 GST_INFO("no such element factory \"%s\"!", use_factoryname);
556 GST_LOG_OBJECT(factory, "found factory %p", factory);
557 if (g_ascii_strcasecmp(use_factoryname, "pulsesink") == 0) {
558 element = gst_element_factory_make("fakesink", "pulsesink");
559 g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
560 } else if (g_ascii_strcasecmp(use_factoryname, "xvimagesink") == 0) {
561 element = gst_element_factory_make("fakesink", "xvimagesink");
562 g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
564 element = gst_element_factory_create(factory, name);
566 gst_object_unref(factory);
568 if (element == NULL) {
570 GST_INFO_OBJECT(factory, "couldn't create instance!");
574 GST_LOG("gstelementfactory: make \"%s\" \"%s\"",use_factoryname,
577 /* Playbin will use fake renderer */
578 if (g_ascii_strcasecmp(use_factoryname, "playbin") == 0) {
579 GstElement *audiorenderer = gst_element_factory_make("fakesink",
582 g_object_set(G_OBJECT(audiorenderer), "sync", TRUE, NULL);
583 g_object_set(G_OBJECT(element),
587 g_object_set(G_OBJECT(element),
597 /*----------------------------------------------------------------------------
599 ----------------------------------------------------------------------------*/
601 START_TEST(test_basic_playback)
605 MetadataChangedInfo m;
607 GstMessage *message = NULL;
609 /* Initialize callback info */
611 c.error_signal_expected = FALSE;
612 c.error_signal_received = NULL;
613 m.expected_key = NULL;
615 c.property_expected = NULL;
616 c.property_received = NULL;
618 /* Connect to renderer signals */
619 g_signal_connect(g_gst_renderer, "error",
620 G_CALLBACK(error_cb),
622 g_signal_connect(g_gst_renderer, "state-changed",
623 G_CALLBACK(state_changed_cb),
625 g_signal_connect(g_gst_renderer, "media-changed",
626 G_CALLBACK(media_changed_cb),
628 g_signal_connect(g_gst_renderer, "metadata-changed",
629 G_CALLBACK(metadata_changed_cb),
632 /* --- Get initial status --- */
634 reset_callback_info(&c);
636 g_debug("get status...");
637 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
641 reset_callback_info(&c);
644 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
646 if (wait_for_callback(&c, wait_tout_val)) {
647 /* No media item has been set so, we should get an error */
648 if (c.error == FALSE)
649 fail("Play of unset media did not return an error");
651 fail(no_callback_msg);
654 /* --- Play object --- */
656 reset_callback_info(&c);
658 gchar *objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
659 g_debug("play_object... %s", objectid);
660 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
663 if (wait_for_callback(&c, wait_tout_val)) {
665 fail(callback_err_msg, "playing an object", c.err_code,
668 fail(no_callback_msg);
671 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
672 fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
676 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
677 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
683 /* --- Get position --- */
685 reset_callback_info(&c);
687 mafw_renderer_get_position(g_gst_renderer, get_position_cb, &c);
689 if (wait_for_callback(&c, wait_tout_val)) {
691 fail(callback_err_msg, "get_position", c.err_code,
694 fail(no_callback_msg);
697 /* --- Duration emission --- */
699 m.expected_key = MAFW_METADATA_KEY_DURATION;
701 bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
702 fail_if(bus == NULL, "No GstBus");
704 message = gst_message_new_duration(NULL, GST_FORMAT_TIME,
706 gst_bus_post(bus, message);
708 if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
709 fail("Expected " MAFW_METADATA_KEY_DURATION
710 ", but not received");
713 fail_if(m.value == NULL, "Metadata " MAFW_METADATA_KEY_DURATION
716 g_value_unset(m.value);
719 m.expected_key = NULL;
723 reset_callback_info(&c);
726 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
728 if (wait_for_callback(&c, wait_tout_val)) {
730 fail(callback_err_msg, "pausing", c.err_code,
733 fail(no_callback_msg);
736 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
737 fail(state_err_msg, "mafw_renderer_pause", "Paused", s.state);
742 reset_callback_info(&c);
744 g_debug("resume...");
745 mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
747 if (wait_for_callback(&c, wait_tout_val)) {
749 fail(callback_err_msg, "resuming", c.err_code,
752 fail(no_callback_msg);
755 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
756 fail(state_err_msg, "mafw_renderer_resume", "Playing", s.state);
761 reset_callback_info(&c);
764 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
766 if (wait_for_callback(&c, wait_tout_val)) {
768 fail(callback_err_msg, "stopping", c.err_code,
771 fail(no_callback_msg);
774 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
775 fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
781 START_TEST(test_playlist_playback)
783 MafwPlaylist *playlist = NULL;
785 RendererInfo s = {0, };
786 CallbackInfo c = {0, };
787 gchar *cur_item_oid = NULL;
789 /* Initialize callback info */
791 c.error_signal_expected = FALSE;
792 c.error_signal_received = NULL;
793 c.property_expected = NULL;
794 c.property_received = NULL;
796 /* Connect to renderer signals */
797 g_signal_connect(g_gst_renderer, "error",
798 G_CALLBACK(error_cb),
801 g_signal_connect(g_gst_renderer, "state-changed",
802 G_CALLBACK(state_changed_cb),
804 g_signal_connect(g_gst_renderer, "media-changed",
805 G_CALLBACK(media_changed_cb),
807 g_signal_connect(g_gst_renderer, "playlist-changed",
808 G_CALLBACK(playlist_changed_cb),
811 /* --- Create and assign a playlist --- */
813 g_debug("assign playlist...");
814 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
816 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
817 for (i=0; i<10; i++) {
818 mafw_playlist_insert_item(
819 playlist, i, cur_item_oid, NULL);
821 g_free(cur_item_oid);
822 cur_item_oid = get_sample_clip_objectid("unexisting.wav");
823 mafw_playlist_insert_item(playlist, 9, cur_item_oid, NULL);
824 g_free(cur_item_oid);
826 media_changed_called = FALSE;
827 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
829 fail("Assign playlist failed");
832 wait_for_state(&s, Stopped, wait_tout_val);
836 reset_callback_info(&c);
839 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
841 if (wait_for_callback(&c, wait_tout_val)) {
843 fail(callback_err_msg, "playing", c.err_code,
846 fail(no_callback_msg);
849 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
850 fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
855 reset_callback_info(&c);
858 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
860 if (wait_for_callback(&c, wait_tout_val)) {
862 fail(callback_err_msg, "stopping", c.err_code,
865 fail(no_callback_msg);
868 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
869 fail(state_err_msg, "mafw_renderer_stop", "Stopped", s.state);
874 /* Get actual index */
876 gint initial_index = s.index;
878 for (i=0; i<3; i++) {
880 reset_callback_info(&c);
882 g_debug("move to next...");
883 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
885 if (wait_for_callback(&c, wait_tout_val)) {
887 fail(callback_err_msg, "moving to next", c.err_code,
890 fail(no_callback_msg);
893 /* Check if the playlist index is correct */
894 fail_if(s.index != initial_index + (i+1), index_err_msg, s.index,
895 initial_index + (i+1));
901 /* Get actual index */
902 initial_index = s.index;
904 for (i=0; i<3; i++) {
906 reset_callback_info(&c);
908 g_debug("move to prev...");
909 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
911 if (wait_for_callback(&c, wait_tout_val)) {
913 fail(callback_err_msg, "moving to prev", c.err_code,
916 fail(no_callback_msg);
919 /* Check if the playlist index is correct */
920 fail_if(s.index != initial_index - (i+1), index_err_msg, s.index,
921 initial_index - (i+1));
924 /* Check if renderer remains in Stopped state after some Prev operations */
925 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
926 "after doing prev. The actual state is %s and must be %s",
931 reset_callback_info(&c);
934 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
936 if (wait_for_callback(&c, wait_tout_val)) {
938 fail(callback_err_msg, "stopping playback",
939 c.err_code, c.err_msg);
941 fail(no_callback_msg);
944 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
945 fail(state_err_msg,"mafw_renderer_stop","Stopped", s.state);
948 /* --- Go to index in Stopped state --- */
950 reset_callback_info(&c);
952 g_debug("goto index 3...");
953 mafw_renderer_goto_index(g_gst_renderer, 3, playback_cb, &c);
955 if (wait_for_callback(&c, wait_tout_val)) {
957 fail(callback_err_msg, "going to index 3", c.err_code,
960 fail(no_callback_msg);
963 /* Check if the playlist index is correct */
964 fail_if(s.index != 3, index_err_msg, s.index, 3);
966 /* Check if renderer remains in Stopped state after running go to index */
967 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
968 "after running go to index. The actual state is %s and must be"
969 " %s", s.state, "Stopped");
971 /* --- Play (playlist index is 3) --- */
973 reset_callback_info(&c);
976 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
978 if (wait_for_callback(&c, wait_tout_val)) {
980 fail(callback_err_msg, "playing", c.err_code,
983 fail(no_callback_msg);
986 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
987 fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
990 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
991 fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
994 /* --- Goto index in Playing state --- */
996 reset_callback_info(&c);
998 g_debug("goto index 5...");
999 mafw_renderer_goto_index(g_gst_renderer, 5, playback_cb, &c);
1001 if (wait_for_callback(&c, wait_tout_val)) {
1003 fail(callback_err_msg, "going to index", c.err_code,
1006 fail(no_callback_msg);
1009 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1010 fail(state_err_msg, "mafw_renderer_goto_index", "Playing", s.state);
1013 /* Check if the index if correct */
1014 fail_if(s.index != 5, index_err_msg, s.index, 5);
1016 /* Check if renderer remains in Playing state after running go to index */
1017 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1018 fail("Gst renderer didn't remain in Playing state after running "
1019 "go to index. The actual state is %s and must be %s",
1020 s.state, "Playing");
1023 /* --- Goto an invalid index --- */
1025 reset_callback_info(&c);
1027 g_debug("goto the invalid index 20...");
1028 mafw_renderer_goto_index(g_gst_renderer, 20, playback_cb, &c);
1030 if (wait_for_callback(&c, wait_tout_val)) {
1031 if (c.error == FALSE)
1032 fail("Error not received when we go to an incorrect"
1035 fail(no_callback_msg);
1038 /* Check if the previous index (5) remains after an incorrect go to
1040 fail_if(s.index != 5, index_err_msg, 5, s.index);
1042 reset_callback_info(&c);
1044 /* --- Reassigning playlist --- */
1046 media_changed_called = FALSE;
1047 if (!mafw_renderer_assign_playlist(g_gst_renderer,
1048 g_object_ref(playlist), NULL))
1050 fail("Assign playlist failed");
1053 wait_for_state(&s, Stopped, wait_tout_val);
1055 /* --- Go to index with invalid media --- */
1057 reset_callback_info(&c);
1059 g_debug("goto index 9...");
1060 mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
1062 if (wait_for_callback(&c, wait_tout_val)) {
1064 fail(callback_err_msg, "going to index 9", c.err_code,
1067 fail(no_callback_msg);
1070 /* Check if the playlist index is correct */
1071 fail_if(s.index != 9, index_err_msg, s.index, 9);
1073 /* Check if renderer remains in Stopped state after running go
1075 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped "
1076 "state after running go to index. The actual state is %d and "
1077 "must be %s", s.state, "Stopped");
1079 /* --- Play (playlist index is 9) --- */
1081 reset_callback_info(&c);
1083 c.error_signal_expected = TRUE;
1086 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
1088 if (wait_for_callback(&c, wait_tout_val)) {
1090 fail(callback_err_msg, "playing", c.err_code,
1093 fail(no_callback_msg);
1096 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1097 fail(state_err_msg, "mafw_renderer_play", "Transitioning",
1101 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1102 fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
1105 fail_if(c.error_signal_received == NULL ||
1106 !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
1107 MAFW_RENDERER_ERROR_INVALID_URI),
1108 "No error received or incorrect one");
1110 if (c.error_signal_received != NULL) {
1111 g_error_free(c.error_signal_received);
1112 c.error_signal_received = NULL;
1114 c.error_signal_expected = FALSE;
1118 reset_callback_info(&c);
1121 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
1123 if (wait_for_callback(&c, wait_tout_val)) {
1125 fail(callback_err_msg, "stopping playback",
1126 c.err_code, c.err_msg);
1128 fail(no_callback_msg);
1131 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1132 fail(state_err_msg,"mafw_renderer_stop","Stopped", s.state);
1135 /* --- Remove last media --- */
1137 mafw_playlist_remove_item(playlist, 10, NULL);
1139 /* --- Go to index with invalid media --- */
1141 reset_callback_info(&c);
1143 g_debug("goto index 9...");
1144 mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
1146 if (wait_for_callback(&c, wait_tout_val)) {
1148 fail(callback_err_msg, "going to index 9", c.err_code,
1151 fail(no_callback_msg);
1154 /* Check if the playlist index is correct */
1155 fail_if(s.index != 9, index_err_msg, s.index, 9);
1157 /* Check if renderer remains in Stopped state after running go
1159 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped "
1160 "state after running go to index. The actual state is %d and "
1161 "must be %s", s.state, "Stopped");
1163 /* --- Play (playlist index is 9) --- */
1165 reset_callback_info(&c);
1167 c.error_signal_expected = TRUE;
1170 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
1172 if (wait_for_callback(&c, wait_tout_val)) {
1174 fail(callback_err_msg, "playing", c.err_code,
1177 fail(no_callback_msg);
1180 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1181 fail(state_err_msg, "mafw_renderer_play", "Transitioning",
1185 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1186 fail(state_err_msg, "mafw_renderer_play", "Stopped", s.state);
1189 fail_if(c.error_signal_received == NULL ||
1190 !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
1191 MAFW_RENDERER_ERROR_INVALID_URI),
1192 "No error received or incorrect one");
1194 if (c.error_signal_received != NULL) {
1195 g_error_free(c.error_signal_received);
1196 c.error_signal_received = NULL;
1198 c.error_signal_expected = FALSE;
1200 /* --- Play incorrect object --- */
1202 reset_callback_info(&c);
1204 c.error_signal_expected = TRUE;
1206 gchar *objectid = get_sample_clip_objectid("unexisting.wav");
1207 g_debug("play_object... %s", objectid);
1208 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
1210 if (wait_for_callback(&c, wait_tout_val)) {
1212 fail(callback_err_msg, "playing an object", c.err_code,
1215 fail(no_callback_msg);
1218 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1219 fail(state_err_msg, "mafw_renderer_play_object",
1224 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1225 fail(state_err_msg, "mafw_renderer_play_object", "Stopped",
1229 fail_if(c.error_signal_received == NULL ||
1230 !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
1231 MAFW_RENDERER_ERROR_INVALID_URI),
1232 "No error received or incorrect one");
1234 if (c.error_signal_received != NULL) {
1235 g_error_free(c.error_signal_received);
1236 c.error_signal_received = NULL;
1238 c.error_signal_expected = FALSE;
1246 START_TEST(test_repeat_mode_playback)
1248 MafwPlaylist *playlist = NULL;
1250 RendererInfo s = {0, };;
1251 CallbackInfo c = {0, };;
1253 /* Initialize callback info */
1255 c.error_signal_expected = FALSE;
1256 c.error_signal_received = NULL;
1257 c.property_expected = NULL;
1258 c.property_received = NULL;
1260 /* Connect to renderer signals */
1262 g_signal_connect(g_gst_renderer, "error",
1263 G_CALLBACK(error_cb),
1265 g_signal_connect(g_gst_renderer, "state-changed",
1266 G_CALLBACK(state_changed_cb),
1268 g_signal_connect(g_gst_renderer, "media-changed",
1269 G_CALLBACK(media_changed_cb),
1271 g_signal_connect(g_gst_renderer, "playlist-changed",
1272 G_CALLBACK(playlist_changed_cb),
1275 /* --- Create playlist --- */
1277 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
1278 for (i=0; i<10; i++) {
1279 gchar *cur_item_oid =
1280 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1281 mafw_playlist_insert_item(
1282 playlist, i, cur_item_oid, NULL);
1283 g_free(cur_item_oid);
1286 /* Set repeat mode */
1287 mafw_playlist_set_repeat(playlist, TRUE);
1289 /* --- Assign playlist --- */
1291 g_debug("assign playlist...");
1292 media_changed_called = FALSE;
1293 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
1295 fail("Assign playlist failed");
1298 wait_for_state(&s, Stopped, wait_tout_val);
1302 reset_callback_info(&c);
1305 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
1307 if (wait_for_callback(&c, wait_tout_val)) {
1309 fail(callback_err_msg, "playing", c.err_code,
1312 fail(no_callback_msg);
1315 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1316 fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
1319 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1320 fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
1323 /* --- Go to index --- */
1325 reset_callback_info(&c);
1327 g_debug("goto index 9...");
1328 /* go to the end of the playlist */
1329 mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
1331 if (wait_for_callback(&c, wait_tout_val)) {
1333 fail(callback_err_msg, "going to index 9", c.err_code,
1336 fail(no_callback_msg);
1339 /* check if the movement was successful */
1340 fail_if(s.index != 9, index_err_msg, 9, s.index);
1344 reset_callback_info(&c);
1347 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
1349 if (wait_for_callback(&c, wait_tout_val)) {
1351 fail(callback_err_msg, "stopping playback", c.err_code,
1354 fail(no_callback_msg);
1357 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1358 fail(state_err_msg, "mafw_renderer_stop", "Stopped", s.state);
1363 reset_callback_info(&c);
1366 /* The actual index is 9 */
1367 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
1369 if (wait_for_callback(&c, wait_tout_val)) {
1371 fail(callback_err_msg, "moving to next", c.err_code,
1374 fail(no_callback_msg);
1377 /* check if the movement was successful */
1378 fail_if(s.index != 0, index_err_msg, s.index, 0);
1380 /* Check if renderer remains in Stopped state after moving to next */
1381 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
1382 "after doing next. The actual state is %s and must be %s",
1383 s.state, "Stopped");
1387 reset_callback_info(&c);
1390 /* The actual index is 0 */
1391 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
1393 if (wait_for_callback(&c, wait_tout_val)) {
1395 fail(callback_err_msg, "moving to prev", c.err_code,
1398 fail(no_callback_msg);
1401 /* check if the movement was successful */
1402 fail_if(s.index != 9, index_err_msg, s.index, 9);
1404 /* Check if renderer remains in Stopped state after moving to next */
1405 fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
1406 "after doing next. The actual state is %s and must be %s",
1407 s.state, "Stopped");
1412 START_TEST(test_gst_renderer_mode)
1414 MafwPlaylist *playlist = NULL;
1415 MafwGstRenderer *renderer = NULL;
1416 MafwGstRendererPlaybackMode play_mode;
1417 gchar *objectid = NULL;
1419 RendererInfo s = {0, };;
1420 CallbackInfo c = {0, };;
1421 gchar *modes[] = {"MAFW_GST_RENDERER_MODE_PLAYLIST",
1422 "MAFW_GST_RENDERER_MODE_STANDALONE"};
1424 renderer = MAFW_GST_RENDERER(g_gst_renderer);
1426 /* Initiliaze callback info */
1428 c.error_signal_expected = FALSE;
1429 c.error_signal_received = NULL;
1430 c.property_expected = NULL;
1431 c.property_received = NULL;
1433 /* Connect to renderer signals */
1435 g_signal_connect(g_gst_renderer, "error",
1436 G_CALLBACK(error_cb),
1438 g_signal_connect(g_gst_renderer, "state-changed",
1439 G_CALLBACK(state_changed_cb),
1441 g_signal_connect(g_gst_renderer, "media-changed",
1442 G_CALLBACK(media_changed_cb),
1444 g_signal_connect(g_gst_renderer, "playlist-changed",
1445 G_CALLBACK(playlist_changed_cb),
1448 /* --- Create playlist --- */
1450 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
1451 for (i=0; i<10; i++) {
1452 gchar *cur_item_oid =
1453 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1454 mafw_playlist_insert_item(
1455 playlist, i, cur_item_oid, NULL);
1456 g_free(cur_item_oid);
1459 /* --- Assign playlist --- */
1461 g_debug("assign playlist...");
1462 media_changed_called = FALSE;
1463 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
1465 fail("Assign playlist failed");
1468 wait_for_state(&s, Stopped, wait_tout_val);
1472 reset_callback_info(&c);
1476 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
1477 if (wait_for_callback(&c, wait_tout_val)) {
1479 fail(callback_err_msg, "playing", c.err_code,
1482 fail(no_callback_msg);
1485 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1486 fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
1489 /* Check that renderer is playing a playlist */
1490 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1491 fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
1493 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1494 fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
1495 "Incorrect value of playback_mode: %s", modes[play_mode]);
1497 /* --- Play object --- */
1499 reset_callback_info(&c);
1501 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1502 g_debug("play_object... %s",objectid);
1503 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
1506 if (wait_for_callback(&c, wait_tout_val)) {
1508 fail(callback_err_msg, "playing an object", c.err_code,
1511 fail(no_callback_msg);
1514 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1515 fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
1519 /* Check that renderer is playing an object */
1520 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1521 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1525 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1526 fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
1527 "Incorrect value of playback_mode: %s", modes[play_mode]);
1529 /* Wait EOS_TIMEOUT to ensure that the play_object has finished */
1530 wait_until_timeout_finishes(EOS_TIMEOUT);
1532 /* Check that after playing the object, renderer returns to the playlist
1534 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1535 fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
1536 "Incorrect value of playback_mode: %s", modes[play_mode]);
1537 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1538 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1542 /* --- Play object --- */
1544 reset_callback_info(&c);
1546 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1547 g_debug("play_object... %s", objectid);
1548 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
1551 if (wait_for_callback(&c, wait_tout_val)) {
1553 fail(callback_err_msg, "playing an object", c.err_code,
1556 fail(no_callback_msg);
1559 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1560 fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
1564 /* Check that renderer is playing an object */
1565 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1566 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1569 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1570 fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
1571 "Incorrect value of playback_mode: %s", modes[play_mode]);
1574 /* --- Move to next when renderer is playing an object --- */
1576 reset_callback_info(&c);
1579 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
1581 if (wait_for_callback(&c, wait_tout_val)) {
1583 fail(callback_err_msg, "moving to next", c.err_code,
1586 fail(no_callback_msg);
1589 /* Check that "next" function finishes the object playback and returns
1590 to the playlist playback */
1591 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1592 fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
1593 "Incorrect value of playback_mode: %s", modes[play_mode]);
1595 /* Check that renderer is still in Playing state */
1596 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1597 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1603 reset_callback_info(&c);
1606 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
1608 if (wait_for_callback(&c, wait_tout_val)) {
1610 fail(callback_err_msg, "stopping", c.err_code,
1613 fail(no_callback_msg);
1616 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1617 fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
1620 /* --- Play object --- */
1622 reset_callback_info(&c);
1624 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1625 g_debug("play_object... %s", objectid);
1626 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
1628 if (wait_for_callback(&c, wait_tout_val)) {
1630 fail(callback_err_msg, "playing an object", c.err_code,
1633 fail(no_callback_msg);
1636 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1637 fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
1641 /* Check that renderer is playing an object */
1642 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1643 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1646 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1647 fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
1648 "Incorrect value of playback_mode: %s", modes[play_mode]);
1650 /* Wait EOS_TIMEOUT to ensure that object playback finishes */
1651 wait_until_timeout_finishes(EOS_TIMEOUT);
1653 /* Check if renderer is in playlist mode and the renderer state is the state before
1654 playing the object */
1655 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
1656 fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
1658 play_mode = mafw_gst_renderer_get_playback_mode(renderer);
1659 fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
1660 "Incorrect value of playback_mode: %s", modes[play_mode]);
1666 #define MOCK_SOURCE(o) \
1667 (G_TYPE_CHECK_INSTANCE_CAST((o), \
1668 mock_source_get_type(), \
1672 MafwSourceClass parent;
1681 GType mock_source_get_type(void);
1682 GObject* mock_source_new(void);
1684 G_DEFINE_TYPE(MockSource, mock_source, MAFW_TYPE_SOURCE);
1686 static GHashTable *get_md_ht; /* Metadata hash-table for the metadata result */
1687 static GError *get_md_err; /* Error value for the metadata result */
1688 static gboolean set_mdata_called; /* Whether set_metadata was called or not */
1689 static gboolean get_mdata_called; /* Whether get_metadata was called or not */
1690 static gint reference_pcount; /* Reference playcount, what should come in set_metadata */
1691 static gboolean set_for_playcount; /* TRUE, when the set_metadata is called to modify the playcount */
1692 static gboolean set_for_lastplayed; /* TRUE, when the set_metadata is called to modify the last-played */
1694 static void get_metadata(MafwSource *self,
1695 const gchar *object_id,
1696 const gchar *const *metadata,
1697 MafwSourceMetadataResultCb callback,
1700 get_mdata_called = TRUE;
1701 fail_if(strcmp(object_id, "mocksource::test"));
1702 callback(self, object_id, get_md_ht, user_data, get_md_err);
1705 static void set_metadata(MafwSource *self, const gchar *object_id,
1706 GHashTable *metadata,
1707 MafwSourceMetadataSetCb callback,
1713 if (set_for_playcount)
1715 if (set_for_lastplayed)
1717 fail_if(strcmp(object_id, "mocksource::test"));
1719 fail_if(g_hash_table_size(metadata) != htsize, "Hash table size: %d vs %d", g_hash_table_size(metadata), htsize);
1720 if (set_for_playcount)
1722 curval = mafw_metadata_first(metadata,
1723 MAFW_METADATA_KEY_PLAY_COUNT);
1725 fail_if(g_value_get_int(curval) != reference_pcount);
1727 if (set_for_lastplayed)
1729 curval = mafw_metadata_first(metadata,
1730 MAFW_METADATA_KEY_LAST_PLAYED);
1732 fail_if(!G_VALUE_HOLDS(curval, G_TYPE_LONG));
1734 set_mdata_called = TRUE;
1737 static void mock_source_class_init(MockSourceClass *klass)
1739 MafwSourceClass *sclass = MAFW_SOURCE_CLASS(klass);
1741 sclass->get_metadata = get_metadata;
1742 sclass->set_metadata = set_metadata;
1746 static void mock_source_init(MockSource *source)
1751 GObject* mock_source_new(void)
1754 object = g_object_new(mock_source_get_type(),
1755 "plugin", "mockland",
1756 "uuid", "mocksource",
1757 "name", "mocksource",
1763 START_TEST(test_update_stats)
1765 MafwGstRenderer *renderer = NULL;
1767 MafwRegistry *registry;
1769 registry = MAFW_REGISTRY(mafw_registry_get_instance());
1770 fail_if(registry == NULL,
1771 "Error: cannot get MAFW registry");
1774 renderer = MAFW_GST_RENDERER(g_gst_renderer);
1775 src = MAFW_SOURCE(mock_source_new());
1777 mafw_registry_add_extension(registry, MAFW_EXTENSION(src));
1779 /* Error on get_mdata_cb*/
1780 set_for_playcount = FALSE;
1781 set_for_lastplayed = FALSE;
1783 g_set_error(&get_md_err, MAFW_SOURCE_ERROR,
1784 MAFW_SOURCE_ERROR_INVALID_OBJECT_ID,
1785 "Wrong object id mocksource::test");
1786 renderer->media->object_id = g_strdup("mocksource::test");
1787 mafw_gst_renderer_update_stats(renderer);
1788 g_error_free(get_md_err);
1789 fail_if(set_mdata_called);
1790 fail_if(!get_mdata_called);
1792 /* get_mdata ok, but HashTable is NULL */
1793 reference_pcount = 1;
1794 get_mdata_called = FALSE;
1795 set_for_lastplayed = TRUE;
1796 set_for_playcount = TRUE;
1798 mafw_gst_renderer_update_stats(renderer);
1799 fail_if(!set_mdata_called);
1800 fail_if(!get_mdata_called);
1802 /* get_mdata ok, but HashTable is empty */
1803 get_mdata_called = FALSE;
1804 set_mdata_called = FALSE;
1805 set_for_lastplayed = TRUE;
1806 set_for_playcount = TRUE;
1807 get_md_ht = mafw_metadata_new();
1808 mafw_gst_renderer_update_stats(renderer);
1809 fail_if(!set_mdata_called);
1810 fail_if(!get_mdata_called);
1812 /* get_mdata ok, but HashTable has valid value */
1813 get_mdata_called = FALSE;
1814 set_mdata_called = FALSE;
1815 set_for_lastplayed = TRUE;
1816 set_for_playcount = TRUE;
1817 mafw_metadata_add_int(get_md_ht,
1818 MAFW_METADATA_KEY_PLAY_COUNT,
1820 reference_pcount = 2;
1821 mafw_gst_renderer_update_stats(renderer);
1822 fail_if(!set_mdata_called);
1823 fail_if(!get_mdata_called);
1827 START_TEST(test_play_state)
1829 MafwPlaylist *playlist = NULL;
1831 RendererInfo s = {0, };;
1832 CallbackInfo c = {0, };;
1833 gchar *objectid = NULL;
1835 /* Initialize callback info */
1837 c.error_signal_expected = FALSE;
1838 c.error_signal_received = NULL;
1839 c.property_expected = NULL;
1840 c.property_received = NULL;
1842 /* Connect to renderer signals */
1843 g_signal_connect(g_gst_renderer, "error",
1844 G_CALLBACK(error_cb),
1847 g_signal_connect(g_gst_renderer, "state-changed",
1848 G_CALLBACK(state_changed_cb),
1850 g_signal_connect(g_gst_renderer, "media-changed",
1851 G_CALLBACK(media_changed_cb),
1853 g_signal_connect(g_gst_renderer, "playlist-changed",
1854 G_CALLBACK(playlist_changed_cb),
1857 /* --- Get initial status --- */
1859 reset_callback_info(&c);
1861 g_debug("get status...");
1862 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
1864 /* --- Play object --- */
1866 reset_callback_info(&c);
1868 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1869 g_debug("play_object... %s", objectid);
1870 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
1873 if (wait_for_callback(&c, wait_tout_val)) {
1875 fail(callback_err_msg, "playing an object", c.err_code,
1878 fail(no_callback_msg);
1881 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1882 fail(state_err_msg, "mafw_renderer_play_object",
1883 "Transitioning", s.state);
1886 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1887 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
1891 if (wait_for_state(&s, Stopped, 3000) == FALSE) {
1892 fail(state_err_msg, "mafw_renderer_play_object", "Stop",
1899 /* --- Create and assign a playlist --- */
1901 g_debug("assign playlist...");
1902 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
1903 for (i=0; i<10; i++) {
1904 gchar *cur_item_oid =
1905 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
1906 mafw_playlist_insert_item(
1907 playlist, i, cur_item_oid, NULL);
1908 g_free(cur_item_oid);
1910 mafw_playlist_set_repeat(playlist, FALSE);
1912 media_changed_called = FALSE;
1913 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
1916 fail("Assign playlist failed");
1919 wait_for_state(&s, Stopped, wait_tout_val);
1923 reset_callback_info(&c);
1926 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
1928 if (wait_for_callback(&c, wait_tout_val)) {
1930 fail("Play after assigning playlist failed");
1932 fail(no_callback_msg);
1935 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1936 fail(state_err_msg, "mafw_renderer_play",
1937 "Transitioning", s.state);
1940 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1941 fail(state_err_msg, "mafw_renderer_play", "Playing",
1947 reset_callback_info(&c);
1949 g_debug("move to prev...");
1950 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
1952 if (wait_for_callback(&c, wait_tout_val)) {
1954 fail(callback_err_msg, "moving to prev", c.err_code,
1957 fail(no_callback_msg);
1960 fail_if(s.index != 9, index_err_msg, s.index, 9);
1962 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1963 fail(state_err_msg, "mafw_renderer_prev",
1964 "Transitioning", s.state);
1967 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1968 fail(state_err_msg, "mafw_renderer_prev", "Playing",
1972 /* Removing last element */
1974 g_debug("removing last element...");
1975 fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
1976 "Playlist should have 10 elements");
1977 mafw_playlist_remove_item(playlist, 9, NULL);
1978 fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
1979 "Playlist should have 9 elements");
1980 fail_if(s.index != 8, index_err_msg, s.index, 8);
1982 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
1983 fail(state_err_msg, "mafw_playlist_remove_element",
1984 "Transitioning", s.state);
1987 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
1988 fail(state_err_msg, "mafw_playlist_remove_element", "Playing",
1994 reset_callback_info(&c);
1996 g_debug("move to next...");
1997 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
1999 if (wait_for_callback(&c, wait_tout_val)) {
2001 fail(callback_err_msg, "moving to next", c.err_code,
2004 fail(no_callback_msg);
2007 fail_if(s.index != 0, index_err_msg, s.index, 0);
2009 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2010 fail(state_err_msg, "mafw_renderer_next",
2011 "Transitioning", s.state);
2014 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2015 fail(state_err_msg, "mafw_renderer_next", "Playing",
2019 /* --- Go to index --- */
2021 reset_callback_info(&c);
2023 g_debug("goto index 8...");
2024 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
2026 if (wait_for_callback(&c, wait_tout_val)) {
2028 fail(callback_err_msg, "going to index 8", c.err_code,
2031 fail(no_callback_msg);
2034 fail_if(s.index != 8, index_err_msg, s.index, 8);
2036 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2037 fail(state_err_msg, "mafw_renderer_goto_index",
2038 "Transitioning", s.state);
2041 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2042 fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
2046 /* --- Seeking --- */
2048 reset_callback_info(&c);
2050 g_debug("seeking...");
2051 mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
2054 if (wait_for_callback(&c, wait_tout_val)) {
2056 fail(callback_err_msg, "seeking failed", c.err_code,
2058 if (c.seek_position != 1) {
2059 fail("seeking failed");
2062 fail(no_callback_msg);
2065 /* --- Waiting EOS --- */
2067 if (wait_for_state(&s, Stopped, 2000) == FALSE) {
2068 fail(state_err_msg, "EOS", "Stop",
2074 START_TEST(test_pause_state)
2076 MafwPlaylist *playlist = NULL;
2078 RendererInfo s = {0, };;
2079 CallbackInfo c = {0, };;
2080 gchar *objectid = NULL;
2082 /* Initialize callback info */
2084 c.error_signal_expected = FALSE;
2085 c.error_signal_received = NULL;
2086 c.property_expected = NULL;
2087 c.property_received = NULL;
2089 /* Connect to renderer signals */
2090 g_signal_connect(g_gst_renderer, "error",
2091 G_CALLBACK(error_cb),
2094 g_signal_connect(g_gst_renderer, "state-changed",
2095 G_CALLBACK(state_changed_cb),
2097 g_signal_connect(g_gst_renderer, "media-changed",
2098 G_CALLBACK(media_changed_cb),
2100 g_signal_connect(g_gst_renderer, "playlist-changed",
2101 G_CALLBACK(playlist_changed_cb),
2104 /* --- Get initial status --- */
2106 reset_callback_info(&c);
2108 g_debug("get status...");
2109 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
2111 /* --- Create and assign a playlist --- */
2113 g_debug("assign playlist...");
2114 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
2115 for (i=0; i<10; i++) {
2116 gchar *cur_item_oid =
2117 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2118 mafw_playlist_insert_item(
2119 playlist, i, cur_item_oid, NULL);
2120 g_free(cur_item_oid);
2122 mafw_playlist_set_repeat(playlist, FALSE);
2124 media_changed_called = FALSE;
2125 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
2128 fail("Assign playlist failed");
2131 wait_for_state(&s, Stopped, wait_tout_val);
2135 reset_callback_info(&c);
2138 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
2140 if (wait_for_callback(&c, wait_tout_val)) {
2142 fail("Play failed");
2144 fail(no_callback_msg);
2147 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2148 fail(state_err_msg, "mafw_renderer_play",
2149 "Transitioning", s.state);
2152 /* Testing pause in transitioning */
2154 reset_callback_info(&c);
2156 g_debug("pause...");
2157 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2159 if (wait_for_callback(&c, wait_tout_val)) {
2161 fail(callback_err_msg, "pausing", c.err_code,
2164 fail(no_callback_msg);
2167 /* Testing resume in transitioning */
2169 reset_callback_info(&c);
2171 g_debug("resume...");
2172 mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
2174 if (wait_for_callback(&c, wait_tout_val)) {
2176 fail(callback_err_msg, "resuming", c.err_code,
2179 fail(no_callback_msg);
2182 reset_callback_info(&c);
2184 /* Testing resume without having paused in transitioning */
2186 reset_callback_info(&c);
2188 g_debug("resume...");
2189 mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
2191 if (wait_for_callback(&c, wait_tout_val)) {
2193 fail(callback_no_err_msg, "resuming", c.err_code,
2196 fail(no_callback_msg);
2199 reset_callback_info(&c);
2201 g_debug("pause...");
2202 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2204 if (wait_for_callback(&c, wait_tout_val)) {
2206 fail(callback_err_msg, "pausing", c.err_code,
2209 fail(no_callback_msg);
2212 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2213 fail(state_err_msg, "mafw_renderer_pause", "Paused",
2217 /* --- Play object in pause --- */
2219 reset_callback_info(&c);
2221 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2222 g_debug("play_object... %s", objectid);
2223 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
2226 if (wait_for_callback(&c, wait_tout_val)) {
2228 fail(callback_err_msg, "playing an object", c.err_code,
2231 fail(no_callback_msg);
2234 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2235 fail(state_err_msg, "mafw_renderer_play_object",
2236 "Transitioning", s.state);
2239 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2240 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
2244 reset_callback_info(&c);
2246 g_debug("pause...");
2247 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2249 if (wait_for_callback(&c, wait_tout_val)) {
2251 fail(callback_err_msg, "pausing", c.err_code,
2254 fail(no_callback_msg);
2257 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2258 fail(state_err_msg, "mafw_renderer_pause", "Paused",
2266 reset_callback_info(&c);
2269 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
2271 if (wait_for_callback(&c, wait_tout_val)) {
2273 fail("Play failed");
2275 fail(no_callback_msg);
2278 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2279 fail(state_err_msg, "mafw_renderer_play",
2280 "Transitioning", s.state);
2283 reset_callback_info(&c);
2285 g_debug("pause...");
2286 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2288 if (wait_for_callback(&c, wait_tout_val)) {
2290 fail(callback_err_msg, "pausing", c.err_code,
2293 fail(no_callback_msg);
2296 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2297 fail(state_err_msg, "mafw_renderer_pause", "Paused",
2303 reset_callback_info(&c);
2305 g_debug("move to prev...");
2306 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
2308 if (wait_for_callback(&c, wait_tout_val)) {
2310 fail(callback_err_msg, "moving to prev", c.err_code,
2313 fail(no_callback_msg);
2316 /* Check if the playlist index is correct */
2317 fail_if(s.index != 9, index_err_msg, s.index, 9);
2319 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2320 fail(state_err_msg, "mafw_renderer_prev",
2321 "Transitioning", s.state);
2324 reset_callback_info(&c);
2326 g_debug("pause...");
2327 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2329 if (wait_for_callback(&c, wait_tout_val)) {
2331 fail(callback_err_msg, "pausing", c.err_code,
2334 fail(no_callback_msg);
2337 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2338 fail(state_err_msg, "mafw_renderer_prev", "Playing",
2342 /* Removing last element */
2344 g_debug("removing last element...");
2345 fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
2346 "Playlist should have 10 elements");
2347 mafw_playlist_remove_item(playlist, 9, NULL);
2348 fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
2349 "Playlist should have 9 elements");
2350 fail_if(s.index != 8, index_err_msg, s.index, 8);
2352 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2353 fail(state_err_msg, "mafw_playlist_remove_item",
2354 "Transitioning", s.state);
2357 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2358 fail(state_err_msg, "mafw_playlist_remove_item", "Playing",
2362 reset_callback_info(&c);
2364 g_debug("pause...");
2365 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2367 if (wait_for_callback(&c, wait_tout_val)) {
2369 fail(callback_err_msg, "pausing", c.err_code,
2372 fail(no_callback_msg);
2375 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2376 fail(state_err_msg, "mafw_playlist_remove_item", "Playing",
2382 reset_callback_info(&c);
2384 g_debug("move to next...");
2385 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
2387 if (wait_for_callback(&c, wait_tout_val)) {
2389 fail(callback_err_msg, "moving to next", c.err_code,
2392 fail(no_callback_msg);
2395 /* Check if the playlist index is correct */
2396 fail_if(s.index != 0, index_err_msg, s.index, 0);
2398 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2399 fail(state_err_msg, "mafw_renderer_next",
2400 "Transitioning", s.state);
2403 reset_callback_info(&c);
2405 g_debug("pause...");
2406 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2408 if (wait_for_callback(&c, wait_tout_val)) {
2410 fail(callback_err_msg, "pausing", c.err_code,
2413 fail(no_callback_msg);
2416 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2417 fail(state_err_msg, "mafw_renderer_next", "Playing",
2421 /* --- Go to index --- */
2423 reset_callback_info(&c);
2425 g_debug("goto index 8...");
2426 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
2428 if (wait_for_callback(&c, wait_tout_val)) {
2430 fail(callback_err_msg, "going to index 8", c.err_code,
2433 fail(no_callback_msg);
2436 /* Check if the playlist index is correct */
2437 fail_if(s.index != 8, index_err_msg, s.index, 8);
2439 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2440 fail(state_err_msg, "mafw_renderer_goto_index",
2441 "Transitioning", s.state);
2444 reset_callback_info(&c);
2446 g_debug("pause...");
2447 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
2449 if (wait_for_callback(&c, wait_tout_val)) {
2451 fail(callback_err_msg, "pausing", c.err_code,
2454 fail(no_callback_msg);
2457 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
2458 fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
2462 /* --- Seeking --- */
2464 reset_callback_info(&c);
2466 mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
2469 if (wait_for_callback(&c, wait_tout_val)) {
2471 fail(callback_err_msg, "seeking", c.err_code,
2473 if (c.seek_position != 1) {
2474 fail("seeking failed");
2477 fail(no_callback_msg);
2482 reset_callback_info(&c);
2485 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
2487 if (wait_for_callback(&c, wait_tout_val)) {
2489 fail(callback_err_msg, "stopping", c.err_code,
2492 fail(no_callback_msg);
2495 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
2496 fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
2501 START_TEST(test_stop_state)
2503 MafwPlaylist *playlist = NULL;
2505 RendererInfo s = {0, };;
2506 CallbackInfo c = {0, };;
2508 /* Initialize callback info */
2510 c.error_signal_expected = FALSE;
2511 c.error_signal_received = NULL;
2512 c.property_expected = NULL;
2513 c.property_received = NULL;
2515 /* Connect to renderer signals */
2516 g_signal_connect(g_gst_renderer, "error",
2517 G_CALLBACK(error_cb),
2520 g_signal_connect(g_gst_renderer, "state-changed",
2521 G_CALLBACK(state_changed_cb),
2523 g_signal_connect(g_gst_renderer, "media-changed",
2524 G_CALLBACK(media_changed_cb),
2526 g_signal_connect(g_gst_renderer, "playlist-changed",
2527 G_CALLBACK(playlist_changed_cb),
2530 /* --- Get initial status --- */
2532 reset_callback_info(&c);
2534 g_debug("get status...");
2535 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
2539 reset_callback_info(&c);
2541 g_debug("move to prev...");
2542 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
2544 if (wait_for_callback(&c, wait_tout_val)) {
2546 fail(callback_no_err_msg, "moving to prev", c.err_code,
2549 fail(no_callback_msg);
2554 reset_callback_info(&c);
2556 g_debug("move to next...");
2557 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
2559 if (wait_for_callback(&c, wait_tout_val)) {
2561 fail(callback_no_err_msg, "moving to next", c.err_code,
2564 fail(no_callback_msg);
2567 /* --- Go to index --- */
2569 reset_callback_info(&c);
2571 g_debug("goto index 8...");
2572 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
2574 if (wait_for_callback(&c, wait_tout_val)) {
2576 fail(callback_no_err_msg, "going to index 8",
2577 c.err_code, c.err_msg);
2579 fail(no_callback_msg);
2582 /* --- Create and assign a playlist --- */
2584 g_debug("assign playlist...");
2585 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
2586 for (i=0; i<10; i++) {
2587 gchar *cur_item_oid =
2588 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2589 mafw_playlist_insert_item(
2590 playlist, i, cur_item_oid, NULL);
2591 g_free(cur_item_oid);
2593 mafw_playlist_set_repeat(playlist, FALSE);
2595 media_changed_called = FALSE;
2596 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
2599 fail("Assign playlist failed");
2602 wait_for_state(&s, Stopped, wait_tout_val);
2604 /* Removing last element */
2606 g_debug("removing last element...");
2607 fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
2608 "Playlist should have 10 elements");
2609 mafw_playlist_remove_item(playlist, 9, NULL);
2610 fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
2611 "Playlist should have 9 elements");
2613 /* --- Go to index --- */
2615 reset_callback_info(&c);
2617 g_debug("goto index 9...");
2618 mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
2620 if (wait_for_callback(&c, wait_tout_val)) {
2622 fail(callback_no_err_msg, "going to index 9",
2623 c.err_code, c.err_msg);
2625 fail(no_callback_msg);
2627 reset_callback_info(&c);
2631 START_TEST(test_transitioning_state)
2633 MafwPlaylist *playlist = NULL;
2635 RendererInfo s = {0, };;
2636 CallbackInfo c = {0, };;
2637 gchar *objectid = NULL;
2639 /* Initialize callback info */
2641 c.error_signal_expected = FALSE;
2642 c.error_signal_received = NULL;
2643 c.property_expected = NULL;
2644 c.property_received = NULL;
2646 /* Connect to renderer signals */
2647 g_signal_connect(g_gst_renderer, "error",
2648 G_CALLBACK(error_cb),
2651 g_signal_connect(g_gst_renderer, "state-changed",
2652 G_CALLBACK(state_changed_cb),
2654 g_signal_connect(g_gst_renderer, "media-changed",
2655 G_CALLBACK(media_changed_cb),
2657 g_signal_connect(g_gst_renderer, "playlist-changed",
2658 G_CALLBACK(playlist_changed_cb),
2661 /* --- Get initial status --- */
2663 reset_callback_info(&c);
2665 g_debug("get status...");
2666 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
2668 /* --- Create and assign a playlist --- */
2670 g_debug("assign playlist...");
2671 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
2672 for (i=0; i<10; i++) {
2673 gchar *cur_item_oid =
2674 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2675 mafw_playlist_insert_item(
2676 playlist, i, cur_item_oid, NULL);
2677 g_free(cur_item_oid);
2679 mafw_playlist_set_repeat(playlist, FALSE);
2681 media_changed_called = FALSE;
2682 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
2685 fail("Assign playlist failed");
2688 wait_for_state(&s, Stopped, wait_tout_val);
2692 reset_callback_info(&c);
2695 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
2697 if (wait_for_callback(&c, wait_tout_val)) {
2699 fail("Play after assigning playlist failed");
2701 fail(no_callback_msg);
2704 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2705 fail(state_err_msg, "mafw_renderer_play",
2706 "Transitioning", s.state);
2709 /* --- Play object --- */
2711 reset_callback_info(&c);
2713 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2714 g_debug("play_object... %s", objectid);
2715 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
2718 if (wait_for_callback(&c, wait_tout_val)) {
2720 fail(callback_err_msg, "playing an object", c.err_code,
2723 fail(no_callback_msg);
2726 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2727 fail(state_err_msg, "mafw_renderer_play_object",
2728 "Transitioning", s.state);
2736 reset_callback_info(&c);
2738 g_debug("move to prev...");
2739 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
2741 if (wait_for_callback(&c, wait_tout_val)) {
2743 fail(callback_err_msg, "moving to prev", c.err_code,
2746 fail(no_callback_msg);
2749 fail_if(s.index != 9, index_err_msg, s.index, 9);
2751 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2752 fail(state_err_msg, "mafw_renderer_prev",
2753 "Transitioning", s.state);
2756 /* Removing last element */
2758 g_debug("removing last element...");
2759 fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
2760 "Playlist should have 10 elements");
2761 mafw_playlist_remove_item(playlist, 9, NULL);
2762 fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
2763 "Playlist should have 9 elements");
2764 fail_if(s.index != 8, index_err_msg, s.index, 8);
2766 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2767 fail(state_err_msg, "mafw_playlist_remove_element",
2768 "Transitioning", s.state);
2773 reset_callback_info(&c);
2775 g_debug("move to next...");
2776 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
2778 if (wait_for_callback(&c, wait_tout_val)) {
2780 fail(callback_err_msg, "moving to next", c.err_code,
2783 fail(no_callback_msg);
2786 fail_if(s.index != 0, index_err_msg, s.index, 0);
2788 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2789 fail(state_err_msg, "mafw_renderer_next",
2790 "Transitioning", s.state);
2793 /* --- Go to index --- */
2795 reset_callback_info(&c);
2797 g_debug("goto index 8...");
2798 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
2800 if (wait_for_callback(&c, wait_tout_val)) {
2802 fail(callback_err_msg, "going to index 8", c.err_code,
2805 fail(no_callback_msg);
2808 fail_if(s.index != 8, index_err_msg, s.index, 8);
2810 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2811 fail(state_err_msg, "mafw_renderer_goto_index",
2812 "Transitioning", s.state);
2817 START_TEST(test_state_class)
2819 MafwPlaylist *playlist = NULL;
2821 RendererInfo s = {0, };;
2822 CallbackInfo c = {0, };;
2823 gchar *objectid = NULL;
2825 /* Initialize callback info */
2827 c.error_signal_expected = FALSE;
2828 c.error_signal_received = NULL;
2829 c.property_expected = NULL;
2830 c.property_received = NULL;
2832 /* Connect to renderer signals */
2833 g_signal_connect(g_gst_renderer, "error",
2834 G_CALLBACK(error_cb),
2837 g_signal_connect(g_gst_renderer, "state-changed",
2838 G_CALLBACK(state_changed_cb),
2840 g_signal_connect(g_gst_renderer, "media-changed",
2841 G_CALLBACK(media_changed_cb),
2843 g_signal_connect(g_gst_renderer, "playlist-changed",
2844 G_CALLBACK(playlist_changed_cb),
2847 /* --- Get initial status --- */
2849 reset_callback_info(&c);
2851 g_debug("get status...");
2852 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
2854 /* --- Play object --- */
2856 reset_callback_info(&c);
2858 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2859 g_debug("play_object... %s", objectid);
2860 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
2863 if (wait_for_callback(&c, wait_tout_val)) {
2865 fail(callback_err_msg, "playing an object", c.err_code,
2868 fail(no_callback_msg);
2871 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2872 fail(state_err_msg, "mafw_renderer_play_object",
2873 "Transitioning", s.state);
2876 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2877 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
2883 reset_callback_info(&c);
2885 g_debug("move to prev...");
2886 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
2888 if (wait_for_callback(&c, wait_tout_val)) {
2890 fail(callback_no_err_msg, "moving to prev", c.err_code,
2893 fail(no_callback_msg);
2896 /* --- Play object --- */
2898 reset_callback_info(&c);
2900 g_debug("play_object... %s", objectid);
2901 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
2904 if (wait_for_callback(&c, wait_tout_val)) {
2906 fail(callback_err_msg, "playing an object", c.err_code,
2909 fail(no_callback_msg);
2912 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2913 fail(state_err_msg, "mafw_renderer_play_object",
2914 "Transitioning", s.state);
2917 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2918 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
2924 reset_callback_info(&c);
2926 g_debug("move to next...");
2927 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
2929 if (wait_for_callback(&c, wait_tout_val)) {
2931 fail(callback_no_err_msg, "moving to next", c.err_code,
2934 fail(no_callback_msg);
2937 /* --- Play object --- */
2939 reset_callback_info(&c);
2941 g_debug("play_object... %s", objectid);
2942 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
2945 if (wait_for_callback(&c, wait_tout_val)) {
2947 fail(callback_err_msg, "playing an object", c.err_code,
2950 fail(no_callback_msg);
2953 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
2954 fail(state_err_msg, "mafw_renderer_play_object",
2955 "Transitioning", s.state);
2958 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
2959 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
2963 /* --- Go to index --- */
2965 reset_callback_info(&c);
2967 g_debug("goto index 8...");
2968 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
2970 if (wait_for_callback(&c, wait_tout_val)) {
2972 fail(callback_err_msg, "going to index 8", c.err_code,
2975 fail(no_callback_msg);
2978 /* --- Create and assign a playlist --- */
2980 g_debug("assign playlist...");
2981 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
2982 for (i=0; i<10; i++) {
2983 gchar *cur_item_oid =
2984 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
2985 mafw_playlist_insert_item(
2986 playlist, i, cur_item_oid, NULL);
2987 g_free(cur_item_oid);
2989 mafw_playlist_set_repeat(playlist, FALSE);
2991 media_changed_called = FALSE;
2992 if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
2995 fail("Assign playlist failed");
2998 wait_for_state(&s, Stopped, wait_tout_val);
3000 /* --- Play object --- */
3002 reset_callback_info(&c);
3004 g_debug("play_object... %s", objectid);
3005 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
3008 if (wait_for_callback(&c, wait_tout_val)) {
3010 fail(callback_err_msg, "playing an object", c.err_code,
3013 fail(no_callback_msg);
3016 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3017 fail(state_err_msg, "mafw_renderer_play_object",
3018 "Transitioning", s.state);
3021 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3022 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3028 reset_callback_info(&c);
3030 g_debug("move to next...");
3031 mafw_renderer_next(g_gst_renderer, playback_cb, &c);
3033 if (wait_for_callback(&c, wait_tout_val)) {
3035 fail(callback_err_msg, "moving to next", c.err_code,
3038 fail(no_callback_msg);
3041 fail_if(s.index != 1, index_err_msg, s.index, 1);
3043 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
3044 fail(state_err_msg, "mafw_renderer_next", "Playing",
3048 /* --- Play object --- */
3050 reset_callback_info(&c);
3052 g_debug("play_object... %s", objectid);
3053 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
3056 if (wait_for_callback(&c, wait_tout_val)) {
3058 fail(callback_err_msg, "playing an object", c.err_code,
3061 fail(no_callback_msg);
3064 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3065 fail(state_err_msg, "mafw_renderer_play_object",
3066 "Transitioning", s.state);
3069 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3070 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3074 /* --- Go to index --- */
3076 reset_callback_info(&c);
3078 g_debug("goto index 8...");
3079 mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
3081 if (wait_for_callback(&c, wait_tout_val)) {
3083 fail(callback_err_msg, "going to index 8", c.err_code,
3086 fail(no_callback_msg);
3089 fail_if(s.index != 8, index_err_msg, s.index, 8);
3091 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
3092 fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
3096 /* --- Play object --- */
3098 reset_callback_info(&c);
3100 g_debug("play_object... %s", objectid);
3101 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
3104 if (wait_for_callback(&c, wait_tout_val)) {
3106 fail(callback_err_msg, "playing an object", c.err_code,
3109 fail(no_callback_msg);
3112 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3113 fail(state_err_msg, "mafw_renderer_play_object",
3114 "Transitioning", s.state);
3117 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3118 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3124 reset_callback_info(&c);
3126 g_debug("move to prev...");
3127 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
3129 if (wait_for_callback(&c, wait_tout_val)) {
3131 fail(callback_err_msg, "moving to prev", c.err_code,
3134 fail(no_callback_msg);
3137 fail_if(s.index != 7, index_err_msg, s.index, 7);
3139 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
3140 fail(state_err_msg, "mafw_renderer_prev", "Playing",
3146 reset_callback_info(&c);
3149 mafw_renderer_play(g_gst_renderer, playback_cb, &c);
3151 if (wait_for_callback(&c, wait_tout_val)) {
3153 fail("Play after assigning playlist failed");
3155 fail(no_callback_msg);
3158 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3159 fail(state_err_msg, "mafw_renderer_play",
3160 "Transitioning", s.state);
3163 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3164 fail(state_err_msg, "mafw_renderer_play", "Playing",
3170 reset_callback_info(&c);
3172 g_debug("move to prev...");
3173 mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
3175 if (wait_for_callback(&c, wait_tout_val)) {
3177 fail(callback_err_msg, "moving to prev", c.err_code,
3180 fail(no_callback_msg);
3183 fail_if(s.index != 6, index_err_msg, s.index, 6);
3185 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3186 fail(state_err_msg, "mafw_renderer_prev",
3187 "Transitioning", s.state);
3190 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3191 fail(state_err_msg, "mafw_renderer_prev",
3192 "Transitioning", s.state);
3195 /* --- Seeking --- */
3197 reset_callback_info(&c);
3199 g_debug("seeking...");
3200 mafw_renderer_set_position(g_gst_renderer, SeekRelative, 1,
3203 if (wait_for_callback(&c, wait_tout_val)) {
3205 fail(callback_err_msg, "seeking failed", c.err_code,
3207 if (c.seek_position != 1) {
3208 fail("seeking failed");
3211 fail(no_callback_msg);
3214 /* --- Seeking --- */
3216 reset_callback_info(&c);
3218 g_debug("seeking...");
3219 mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, -1,
3222 if (wait_for_callback(&c, wait_tout_val)) {
3224 fail(callback_err_msg, "seeking failed", c.err_code,
3226 if (c.seek_position != -1) {
3227 fail("seeking failed");
3230 fail(no_callback_msg);
3233 /* --- Seeking --- */
3235 reset_callback_info(&c);
3237 g_debug("seeking...");
3238 mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
3241 if (wait_for_callback(&c, wait_tout_val)) {
3243 fail(callback_err_msg, "seeking failed", c.err_code,
3245 if (c.seek_position != 1) {
3246 fail("seeking failed");
3249 fail(no_callback_msg);
3254 START_TEST(test_playlist_iterator)
3256 MafwPlaylist *playlist = NULL;
3258 CallbackInfo c = {0, };;
3259 MafwPlaylistIterator *iterator = NULL;
3260 GError *error = NULL;
3264 /* Initialize callback info */
3267 reset_callback_info(&c);
3269 /* --- Create and assign a playlist --- */
3271 g_debug("assign playlist...");
3272 playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
3274 iterator = mafw_playlist_iterator_new();
3275 mafw_playlist_iterator_initialize(iterator, playlist, &error);
3276 if (error != NULL) {
3277 fail("Error found: %s, %d, %s",
3278 g_quark_to_string(error->domain),
3279 error->code, error->message);
3282 for (i = 0; i < 3; i++) {
3283 gchar *cur_item_oid = NULL;
3285 get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
3286 mafw_playlist_insert_item(playlist, 0, cur_item_oid, NULL);
3287 g_free(cur_item_oid);
3290 size = mafw_playlist_iterator_get_size(iterator, NULL);
3291 fail_if(size != 3, "Playlist should have 3 elements and it has %d",
3293 index = mafw_playlist_iterator_get_current_index(iterator);
3294 fail_if(index != 2, "Index should be 2 and it is %d", index);
3296 mafw_playlist_move_item(playlist, 1, 2, NULL);
3297 index = mafw_playlist_iterator_get_current_index(iterator);
3298 fail_if(index != 1, "Index should be 1 and it is %d", index);
3300 mafw_playlist_move_item(playlist, 2, 1, NULL);
3301 index = mafw_playlist_iterator_get_current_index(iterator);
3302 fail_if(index != 2, "Index should be 2 and it is %d", index);
3304 mafw_playlist_move_item(playlist, 2, 1, NULL);
3305 index = mafw_playlist_iterator_get_current_index(iterator);
3306 fail_if(index != 1, "Index should be 1 and it is %d", index);
3308 mafw_playlist_remove_item(playlist, 0, &error);
3309 if (error != NULL) {
3310 fail("Error found: %s, %d, %s",
3311 g_quark_to_string(error->domain),
3312 error->code, error->message);
3315 size = mafw_playlist_iterator_get_size(iterator, NULL);
3316 fail_if(size != 2, "Playlist should have 2 elements and it has %d",
3318 index = mafw_playlist_iterator_get_current_index(iterator);
3319 fail_if(index != 0, "Index should be 0 and it is %d", index);
3321 mafw_playlist_iterator_reset(iterator, NULL);
3322 index = mafw_playlist_iterator_get_current_index(iterator);
3323 fail_if(index != 0, "Index should be 0 and it is %d", index);
3325 mafw_playlist_remove_item(playlist, 0, &error);
3326 if (error != NULL) {
3327 fail("Error found: %s, %d, %s",
3328 g_quark_to_string(error->domain),
3329 error->code, error->message);
3332 size = mafw_playlist_iterator_get_size(iterator, NULL);
3333 fail_if(size != 1, "Playlist should have 1 elements and it has %d",
3335 index = mafw_playlist_iterator_get_current_index(iterator);
3336 fail_if(index != 0, "Index should be 0 and it is %d", index);
3338 mafw_playlist_remove_item(playlist, 0, &error);
3339 if (error != NULL) {
3340 fail("Error found: %s, %d, %s",
3341 g_quark_to_string(error->domain),
3342 error->code, error->message);
3345 size = mafw_playlist_iterator_get_size(iterator, NULL);
3346 fail_if(size != 0, "Playlist should have 0 elements and it has %d",
3348 index = mafw_playlist_iterator_get_current_index(iterator);
3349 fail_if(index != -1, "Index should be -1 and it is %d", index);
3351 g_object_unref(iterator);
3355 START_TEST(test_video)
3357 RendererInfo s = {0, };;
3358 CallbackInfo c = {0, };;
3359 MetadataChangedInfo m;
3360 gchar *objectid = NULL;
3362 GstStructure *structure = NULL;
3363 GstMessage *message = NULL;
3365 /* Initialize callback info */
3367 c.error_signal_expected = FALSE;
3368 c.error_signal_received = NULL;
3369 m.expected_key = NULL;
3371 c.property_expected = NULL;
3372 c.property_received = NULL;
3374 /* Connect to renderer signals */
3375 g_signal_connect(g_gst_renderer, "error",
3376 G_CALLBACK(error_cb),
3379 g_signal_connect(g_gst_renderer, "state-changed",
3380 G_CALLBACK(state_changed_cb),
3382 g_signal_connect(g_gst_renderer, "media-changed",
3383 G_CALLBACK(media_changed_cb),
3385 g_signal_connect(g_gst_renderer, "playlist-changed",
3386 G_CALLBACK(playlist_changed_cb),
3388 g_signal_connect(g_gst_renderer, "metadata-changed",
3389 G_CALLBACK(metadata_changed_cb),
3392 #ifdef HAVE_GDKPIXBUF
3393 mafw_extension_set_property_boolean(
3394 MAFW_EXTENSION(g_gst_renderer),
3395 MAFW_PROPERTY_GST_RENDERER_CURRENT_FRAME_ON_PAUSE,
3399 /* --- Get initial status --- */
3401 reset_callback_info(&c);
3403 g_debug("get status...");
3404 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
3406 /* --- Play object --- */
3408 reset_callback_info(&c);
3410 objectid = get_sample_clip_objectid(SAMPLE_VIDEO_CLIP);
3411 g_debug("play_object... %s", objectid);
3412 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
3415 if (wait_for_callback(&c, wait_tout_val)) {
3417 fail(callback_err_msg, "playing an object", c.err_code,
3420 fail(no_callback_msg);
3423 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3424 fail(state_err_msg, "mafw_renderer_play_object",
3425 "Transitioning", s.state);
3428 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3429 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3433 MAFW_GST_RENDERER(g_gst_renderer)->worker->xid = 0x1;
3434 bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
3435 fail_if(bus == NULL, "No GstBus");
3437 structure = gst_structure_new("prepare-xwindow-id", "width",
3438 G_TYPE_INT, 64, "height", G_TYPE_INT, 32,
3440 message = gst_message_new_element(NULL, structure);
3441 gst_bus_post(bus, message);
3445 reset_callback_info(&c);
3447 m.expected_key = MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI;
3449 g_debug("pause...");
3450 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
3452 if (wait_for_callback(&c, wait_tout_val)) {
3454 fail(callback_err_msg, "pausing", c.err_code,
3457 fail(no_callback_msg);
3460 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
3461 fail(state_err_msg, "mafw_renderer_prev", "Playing",
3465 if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
3466 fail("Expected " MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI
3467 ", but not received");
3470 fail_if(m.value == NULL, "Metadata "
3471 MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI " not received");
3473 g_value_unset(m.value);
3476 m.expected_key = NULL;
3478 /* --- Resume --- */
3480 reset_callback_info(&c);
3482 g_debug("resume...");
3483 mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
3485 if (wait_for_callback(&c, wait_tout_val)) {
3487 fail(callback_err_msg, "resuming", c.err_code,
3490 fail(no_callback_msg);
3493 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3494 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3500 if (wait_for_state(&s, Stopped, 3000) == FALSE) {
3501 fail(state_err_msg, "mafw_renderer_play_object", "Stop",
3509 START_TEST(test_media_art)
3511 RendererInfo s = {0, };;
3512 CallbackInfo c = {0, };;
3513 MetadataChangedInfo m;
3514 gchar *objectid = NULL;
3516 GstMessage *message = NULL;
3517 GstTagList *list = NULL;
3518 GstBuffer *buffer = NULL;
3519 guchar *image = NULL;
3520 gchar *image_path = NULL;
3522 GstCaps *caps = NULL;
3524 /* Initialize callback info */
3526 c.error_signal_expected = FALSE;
3527 m.expected_key = NULL;
3529 c.property_expected = NULL;
3530 c.property_received = NULL;
3532 /* Connect to renderer signals */
3533 g_signal_connect(g_gst_renderer, "error",
3534 G_CALLBACK(error_cb),
3537 g_signal_connect(g_gst_renderer, "state-changed",
3538 G_CALLBACK(state_changed_cb),
3540 g_signal_connect(g_gst_renderer, "media-changed",
3541 G_CALLBACK(media_changed_cb),
3543 g_signal_connect(g_gst_renderer, "playlist-changed",
3544 G_CALLBACK(playlist_changed_cb),
3546 g_signal_connect(g_gst_renderer, "metadata-changed",
3547 G_CALLBACK(metadata_changed_cb),
3550 /* --- Get initial status --- */
3552 reset_callback_info(&c);
3554 g_debug("get status...");
3555 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
3557 /* --- Play object --- */
3559 reset_callback_info(&c);
3561 objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
3562 g_debug("play_object... %s", objectid);
3563 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
3566 if (wait_for_callback(&c, wait_tout_val)) {
3568 fail(callback_err_msg, "playing an object", c.err_code,
3571 fail(no_callback_msg);
3576 reset_callback_info(&c);
3578 g_debug("pause...");
3579 mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
3581 if (wait_for_callback(&c, wait_tout_val)) {
3583 fail(callback_err_msg, "pausing", c.err_code,
3586 fail(no_callback_msg);
3589 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
3590 fail(state_err_msg, "mafw_renderer_play_object",
3591 "Transitioning", s.state);
3594 if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
3595 fail(state_err_msg, "mafw_renderer_prev", "Playing",
3601 bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
3602 fail_if(bus == NULL, "No GstBus");
3604 m.expected_key = MAFW_METADATA_KEY_RENDERER_ART_URI;
3606 image_path = get_sample_clip_path(SAMPLE_IMAGE);
3607 fail_if(!g_file_get_contents(image_path + 7, (gchar **) &image,
3608 &image_length, NULL),
3609 "Could not load test image");
3612 buffer = gst_buffer_new();
3613 gst_buffer_set_data(buffer, image, image_length);
3614 caps = gst_caps_new_simple("image/png", "image-type",
3615 GST_TYPE_TAG_IMAGE_TYPE,
3616 GST_TAG_IMAGE_TYPE_FRONT_COVER, NULL);
3617 gst_buffer_set_caps(buffer, caps);
3618 gst_caps_unref(caps);
3620 list = gst_tag_list_new();
3621 gst_tag_list_add(list, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, buffer,
3624 message = gst_message_new_tag(NULL, list);
3625 gst_bus_post(bus, message);
3627 /* --- Resume --- */
3629 reset_callback_info(&c);
3631 g_debug("resume...");
3632 mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
3634 if (wait_for_callback(&c, wait_tout_val)) {
3636 fail(callback_err_msg, "resuming", c.err_code,
3639 fail(no_callback_msg);
3642 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
3643 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
3647 if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
3648 fail("Expected " MAFW_METADATA_KEY_RENDERER_ART_URI
3649 ", but not received");
3652 fail_if(m.value == NULL, "Metadata "
3653 MAFW_METADATA_KEY_RENDERER_ART_URI " not received");
3655 g_value_unset(m.value);
3658 m.expected_key = NULL;
3662 if (wait_for_state(&s, Stopped, 3000) == FALSE) {
3663 fail(state_err_msg, "mafw_renderer_play_object", "Stop",
3671 START_TEST(test_properties_management)
3674 CallbackInfo c = {0, };;
3675 PropertyChangedInfo p;
3677 /* Initialize callback info */
3679 c.error_signal_expected = FALSE;
3680 c.error_signal_received = NULL;
3681 c.property_expected = NULL;
3682 c.property_received = NULL;
3686 /* Connect to renderer signals */
3687 g_signal_connect(g_gst_renderer, "state-changed",
3688 G_CALLBACK(state_changed_cb),
3690 g_signal_connect(g_gst_renderer, "property-changed",
3691 G_CALLBACK(property_changed_cb),
3694 /* Wait for the volume manager to be initialized */
3698 p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
3700 if (!wait_for_property(&p, wait_tout_val)) {
3701 fail("No property %s received", p.expected);
3704 fail_if(p.received == NULL, "No property %s received",
3706 fail_if(p.received != NULL &&
3707 g_value_get_uint(p.received) != 48,
3708 "Property with value %d and %d expected",
3709 g_value_get_uint(p.received), 48);
3711 if (p.received != NULL) {
3712 g_value_unset(p.received);
3720 reset_callback_info(&c);
3722 c.property_expected = MAFW_PROPERTY_RENDERER_MUTE;
3724 mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
3725 c.property_expected, TRUE);
3727 p.expected = MAFW_PROPERTY_RENDERER_MUTE;
3729 #ifdef MAFW_GST_RENDERER_ENABLE_MUTE
3730 if (!wait_for_property(&p, wait_tout_val)) {
3731 fail("No property %s received", p.expected);
3734 fail_if(p.received == NULL, "No property %s received",
3736 fail_if(p.received != NULL &&
3737 g_value_get_boolean(p.received) != TRUE,
3738 "Property with value %d and %d expected",
3739 g_value_get_boolean(p.received), TRUE);
3741 if (wait_for_property(&p, wait_tout_val)) {
3742 fail("Property %s received and it should not have been",
3746 fail_if(p.received != NULL,
3747 "Property %s received and it should not have been",
3751 if (p.received != NULL) {
3752 g_value_unset(p.received);
3758 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3759 c.property_expected, get_property_cb, &c);
3761 if (wait_for_callback(&c, wait_tout_val)) {
3763 fail(callback_err_msg, "get_property", c.err_code,
3766 fail(no_callback_msg);
3769 fail_if(c.property_received == NULL,
3770 "No property %s received and expected", c.property_expected);
3771 #ifdef MAFW_GST_RENDERER_ENABLE_MUTE
3772 fail_if(c.property_received != NULL &&
3773 g_value_get_boolean(c.property_received) != TRUE,
3774 "Property with value %d and %d expected",
3775 g_value_get_boolean(c.property_received), TRUE);
3777 fail_if(c.property_received != NULL &&
3778 g_value_get_boolean(c.property_received) != FALSE,
3779 "Property with value %d and %d expected",
3780 g_value_get_boolean(c.property_received), FALSE);
3785 reset_callback_info(&c);
3787 c.property_expected = MAFW_PROPERTY_RENDERER_XID;
3789 mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
3790 c.property_expected, 50);
3792 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3793 c.property_expected, get_property_cb, &c);
3795 if (wait_for_callback(&c, wait_tout_val)) {
3797 fail(callback_err_msg, "get_property", c.err_code,
3800 fail(no_callback_msg);
3803 fail_if(c.property_received == NULL,
3804 "No property %s received and expected", c.property_expected);
3805 fail_if(c.property_received != NULL &&
3806 g_value_get_uint(c.property_received) != 50,
3807 "Property with value %d and %d expected",
3808 g_value_get_uint(c.property_received), 50);
3810 /* --- error policy --- */
3812 reset_callback_info(&c);
3814 c.property_expected = MAFW_PROPERTY_RENDERER_ERROR_POLICY;
3816 mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
3817 c.property_expected, 1);
3819 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3820 c.property_expected, get_property_cb, &c);
3822 if (wait_for_callback(&c, wait_tout_val)) {
3824 fail(callback_err_msg, "get_property", c.err_code,
3827 fail(no_callback_msg);
3830 fail_if(c.property_received == NULL,
3831 "No property %s received and expected", c.property_expected);
3832 fail_if(c.property_received != NULL &&
3833 g_value_get_uint(c.property_received) != 1,
3834 "Property with value %d and %d expected",
3835 g_value_get_uint(c.property_received), 1);
3837 /* --- autopaint --- */
3839 reset_callback_info(&c);
3841 c.property_expected = MAFW_PROPERTY_RENDERER_AUTOPAINT;
3843 mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
3844 c.property_expected, TRUE);
3846 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3847 c.property_expected, get_property_cb, &c);
3849 if (wait_for_callback(&c, wait_tout_val)) {
3851 fail(callback_err_msg, "get_property", c.err_code,
3854 fail(no_callback_msg);
3857 fail_if(c.property_received == NULL,
3858 "No property %s received and expected", c.property_expected);
3859 fail_if(c.property_received != NULL &&
3860 g_value_get_boolean(c.property_received) != TRUE,
3861 "Property with value %d and %d expected",
3862 g_value_get_boolean(c.property_received), TRUE);
3864 /* --- colorkey --- */
3866 reset_callback_info(&c);
3868 c.property_expected = MAFW_PROPERTY_RENDERER_COLORKEY;
3870 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3871 c.property_expected, get_property_cb, &c);
3873 if (wait_for_callback(&c, wait_tout_val)) {
3875 fail(callback_err_msg, "get_property", c.err_code,
3878 fail(no_callback_msg);
3881 fail_if(c.property_received == NULL,
3882 "No property %s received and expected", c.property_expected);
3883 fail_if(c.property_received != NULL &&
3884 g_value_get_int(c.property_received) != -1,
3885 "Property with value %d and %d expected",
3886 g_value_get_int(c.property_received), -1);
3888 /* --- current frame on pause --- */
3890 reset_callback_info(&c);
3892 c.property_expected = MAFW_PROPERTY_GST_RENDERER_CURRENT_FRAME_ON_PAUSE;
3894 mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
3895 c.property_expected, TRUE);
3897 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3898 c.property_expected, get_property_cb, &c);
3900 if (wait_for_callback(&c, wait_tout_val)) {
3902 fail(callback_err_msg, "get_property", c.err_code,
3905 fail(no_callback_msg);
3908 fail_if(c.property_received == NULL,
3909 "No property %s received and expected", c.property_expected);
3910 fail_if(c.property_received != NULL &&
3911 g_value_get_boolean(c.property_received) != TRUE,
3912 "Property with value %d and %d expected",
3913 g_value_get_boolean(c.property_received), TRUE);
3915 /* --- volume --- */
3917 p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
3919 mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
3922 if (!wait_for_property(&p, wait_tout_val)) {
3923 fail("No property %s received", p.expected);
3926 fail_if(p.received == NULL, "No property %s received",
3928 fail_if(p.received != NULL &&
3929 g_value_get_uint(p.received) != 50,
3930 "Property with value %d and %d expected",
3931 g_value_get_uint(p.received), 50);
3933 if (p.received != NULL) {
3934 g_value_unset(p.received);
3940 c.property_expected = MAFW_PROPERTY_RENDERER_VOLUME;
3942 mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
3943 c.property_expected, get_property_cb, &c);
3945 if (wait_for_callback(&c, wait_tout_val)) {
3947 fail(callback_err_msg, "get_property", c.err_code,
3950 fail(no_callback_msg);
3953 fail_if(c.property_received == NULL,
3954 "No property %s received and expected", c.property_expected);
3955 fail_if(c.property_received != NULL &&
3956 g_value_get_uint(c.property_received) != 50,
3957 "Property with value %d and %d expected",
3958 g_value_get_uint(c.property_received), 50);
3960 #ifndef MAFW_GST_RENDERER_DISABLE_PULSE_VOLUME
3961 /* Test reconnection to pulse */
3963 pa_context_disconnect(pa_context_get_instance());
3965 /* Wait for the volume manager to be reinitialized */
3969 p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
3971 if (!wait_for_property(&p, wait_tout_val)) {
3972 fail("No property %s received", p.expected);
3975 fail_if(p.received == NULL, "No property %s received",
3977 fail_if(p.received != NULL &&
3978 g_value_get_uint(p.received) != 48,
3979 "Property with value %d and %d expected",
3980 g_value_get_uint(p.received), 48);
3982 if (p.received != NULL) {
3983 g_value_unset(p.received);
3989 reset_callback_info(&c);
3994 START_TEST(test_buffering)
4000 GstMessage *message = NULL;
4002 /* Initialize callback info */
4004 c.error_signal_expected = FALSE;
4005 c.error_signal_received = NULL;
4006 c.property_expected = NULL;
4007 c.property_received = NULL;
4008 b.requested = FALSE;
4012 /* Connect to renderer signals */
4013 g_signal_connect(g_gst_renderer, "error",
4014 G_CALLBACK(error_cb),
4016 g_signal_connect(g_gst_renderer, "state-changed",
4017 G_CALLBACK(state_changed_cb),
4019 g_signal_connect(g_gst_renderer, "buffering-info",
4020 G_CALLBACK(buffering_info_cb),
4023 /* --- Get initial status --- */
4025 reset_callback_info(&c);
4027 g_debug("get status...");
4028 mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
4030 /* --- Play object --- */
4032 reset_callback_info(&c);
4034 gchar *objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
4035 g_debug("play_object... %s", objectid);
4036 mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
4038 if (wait_for_callback(&c, wait_tout_val)) {
4040 fail(callback_err_msg, "playing an object", c.err_code,
4043 fail(no_callback_msg);
4046 if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
4047 fail(state_err_msg, "mafw_renderer_play_object",
4048 "Transitioning", s.state);
4051 if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
4052 fail(state_err_msg, "mafw_renderer_play_object", "Playing",
4058 /* --- Buffering info --- */
4062 bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
4063 fail_if(bus == NULL, "No GstBus");
4065 message = gst_message_new_buffering(NULL, 50);
4066 gst_bus_post(bus, message);
4068 if (wait_for_buffering(&b, wait_tout_val) == FALSE) {
4069 fail("Expected buffering message but not received");
4072 fail_if(b.value != 0.5, "Expected buffering 0.50 and received %1.2f",
4075 b.requested = FALSE;
4079 /* --- Buffering info --- */
4083 message = gst_message_new_buffering(NULL, 100);
4084 gst_bus_post(bus, message);
4086 if (wait_for_buffering(&b, wait_tout_val) == FALSE) {
4087 fail("Expected buffering message but not received");
4090 fail_if(b.value != 1.0, "Expected buffering 1.00 and received %1.2f",
4093 b.requested = FALSE;
4099 reset_callback_info(&c);
4102 mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
4104 if (wait_for_callback(&c, wait_tout_val)) {
4106 fail(callback_err_msg, "stopping", c.err_code,
4109 fail(no_callback_msg);
4112 if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
4113 fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
4118 /*----------------------------------------------------------------------------
4120 ----------------------------------------------------------------------------*/
4122 SRunner * configure_tests(void)
4126 const gchar *tout = g_getenv("WAIT_TIMEOUT");
4129 wait_tout_val = DEFAULT_WAIT_TOUT;
4132 wait_tout_val = (gint)strtol(tout, NULL, 0);
4133 if (wait_tout_val<=0)
4134 wait_tout_val = DEFAULT_WAIT_TOUT;
4137 checkmore_wants_dbus();
4138 mafw_log_init(":error");
4139 /* Create the suite */
4140 s = suite_create("MafwGstRenderer");
4142 /* Create test cases */
4143 TCase *tc1 = tcase_create("Playback");
4145 /* Create unit tests for test case "Playback" */
4146 tcase_add_checked_fixture(tc1, fx_setup_dummy_gst_renderer,
4147 fx_teardown_dummy_gst_renderer);
4148 if (1) tcase_add_test(tc1, test_basic_playback);
4149 if (1) tcase_add_test(tc1, test_playlist_playback);
4150 if (1) tcase_add_test(tc1, test_repeat_mode_playback);
4151 if (1) tcase_add_test(tc1, test_gst_renderer_mode);
4152 if (1) tcase_add_test(tc1, test_update_stats);
4153 if (1) tcase_add_test(tc1, test_play_state);
4154 if (1) tcase_add_test(tc1, test_pause_state);
4155 if (1) tcase_add_test(tc1, test_stop_state);
4156 if (1) tcase_add_test(tc1, test_transitioning_state);
4157 if (1) tcase_add_test(tc1, test_state_class);
4158 if (1) tcase_add_test(tc1, test_playlist_iterator);
4159 if (1) tcase_add_test(tc1, test_video);
4160 if (1) tcase_add_test(tc1, test_media_art);
4161 if (1) tcase_add_test(tc1, test_properties_management);
4162 if (1) tcase_add_test(tc1, test_buffering);
4164 tcase_set_timeout(tc1, 0);
4166 suite_add_tcase(s, tc1);
4168 /* Create srunner object with the test suite */
4169 sr = srunner_create(s);
4174 /* vi: set noexpandtab ts=8 sw=8 cino=t0,(0: */