+/*
+ * This file is a part of MAFW
+ *
+ * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+/*
+ * check-gst-renderer.c
+ *
+ * Gst Renderer unit tests
+ *
+ * Copyright (C) 2007 Nokia Corporation
+ *
+ */
+
+#include <glib.h>
+
+#include <check.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sqlite3.h>
+#include <gst/tag/tag.h>
+
+#include <libmafw/mafw.h>
+#include <checkmore.h>
+
+#include "config.h"
+
+#include "mafw-gst-renderer.h"
+#include "mafw-mock-playlist.h"
+#include "mafw-mock-pulseaudio.h"
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "check-mafw-gstreamer-renderer"
+
+#define SAMPLE_AUDIO_CLIP "test.wav"
+#define SAMPLE_VIDEO_CLIP "test.avi"
+#define SAMPLE_IMAGE "testframe.png"
+
+/* Base timeout used when waiting for state transitions or execution of
+ user function callbacks associated to each mafw-renderer function */
+#define DEFAULT_WAIT_TOUT 2000
+
+/* EOS timeout must be longer than the clip duration */
+#define EOS_TIMEOUT 7000
+
+SRunner *configure_tests(void);
+
+typedef struct {
+ gint index;
+ MafwPlayState state;
+} RendererInfo;
+
+typedef struct {
+ gboolean called;
+ gboolean error;
+ gint err_code;
+ gchar *err_msg;
+ gint seek_position;
+ gboolean error_signal_expected;
+ GError *error_signal_received;
+ const gchar *property_expected;
+ GValue *property_received;
+} CallbackInfo;
+
+typedef struct {
+ const gchar *expected_key;
+ GValue *value;
+} MetadataChangedInfo;
+
+typedef struct {
+ const gchar *expected;
+ GValue *received;
+} PropertyChangedInfo;
+
+typedef struct {
+ gboolean requested;
+ gboolean received;
+ gfloat value;
+} BufferingInfo;
+
+static gint wait_tout_val;
+
+/* Globals. */
+
+static MafwRenderer *g_gst_renderer = NULL;
+
+/* Error messages. */
+
+static const gchar *callback_err_msg = "Error received when %s: (%d) %s";
+static const gchar *callback_no_err_msg = "No error received when %s: (%d) %s";
+static const gchar *no_callback_msg = "We forgot to call the user callback";
+static const gchar *state_err_msg = "Call %s didn't change state to %s. " \
+"Current state is: %d";
+static const gchar *index_err_msg = "Actual index is (%d) instead of the " \
+"expected index (%d)";
+
+
+/*----------------------------------------------------------------------------
+ Signal handlers
+ ----------------------------------------------------------------------------*/
+
+
+static void error_cb(MafwRenderer *s, GQuark domain, gint code, gchar *msg,
+ gpointer user_data)
+{
+ CallbackInfo* c = (CallbackInfo*) user_data;
+
+ /* "MafwExtension::error" signal handler */
+ if (user_data == NULL || !c->error_signal_expected) {
+ fail("Signal error received: (%d) %s", code, msg);
+ } else {
+ if (c->error_signal_received != NULL) {
+ fail("Error received already initialized");
+ } else {
+ c->error_signal_received =
+ g_error_new_literal(domain, code, msg);
+ }
+ }
+}
+
+static void state_changed_cb(MafwRenderer *s, MafwPlayState state,
+ gpointer user_data)
+{
+ /* "MafwRenderer::state-changed" signal handler */
+ RendererInfo *si = (RendererInfo *) user_data;
+ gchar *states[] = {"Stopped","Playing","Paused","Transitioning"};
+
+ si->state = state;
+ g_debug("state changed (%s) ---", states[state]);
+}
+
+static gboolean media_changed_called;
+
+static void media_changed_cb(MafwRenderer *s, gint index, gchar *objectid,
+ gpointer user_data)
+{
+ /* "MafwRenderer::media-changed" signal handler */
+ RendererInfo *si = (RendererInfo *) user_data;
+
+ si->index = index;
+ g_debug("media changed (%d) ---", index);
+ media_changed_called = TRUE;
+}
+static void playlist_changed_cb (MafwRenderer *self,
+ GObject *playlist,
+ gpointer user_data)
+{
+ g_debug("playlist changed");
+ fail_if(media_changed_called, "At first playlist-changed should be called");
+}
+
+static void metadata_changed_cb(MafwRenderer *self, const gchar *key,
+ GValueArray *value, gpointer user_data)
+{
+ MetadataChangedInfo *m = user_data;
+
+ if (m->expected_key != NULL && strcmp(key, m->expected_key) == 0)
+ {
+ GValue *original;
+
+ original = g_value_array_get_nth(value, 0);
+
+ m->value = g_new0(GValue, 1);
+ g_value_init(m->value, G_VALUE_TYPE(original));
+ g_value_copy(original, m->value);
+ }
+}
+
+static void property_changed_cb(MafwExtension *extension, const gchar *name,
+ const GValue *value, gpointer user_data)
+{
+ PropertyChangedInfo* p = (PropertyChangedInfo*) user_data;
+ gchar *value_string;
+
+ value_string = g_strdup_value_contents(value);
+
+ g_debug("property_changed_cb: %s (%s)", name, value_string);
+ g_free(value_string);
+
+ if (p->expected != NULL &&
+ strcmp(p->expected, name) == 0) {
+ p->received = g_new0(GValue, 1);
+ g_value_init(p->received, G_VALUE_TYPE(value));
+ g_value_copy(value, p->received);
+ }
+}
+
+static void buffering_info_cb(MafwRenderer *self, gfloat status,
+ gpointer user_data)
+{
+ BufferingInfo *b = user_data;
+
+ if (b->requested) {
+ b->received = TRUE;
+ b->value = status;
+ }
+}
+
+/*----------------------------------------------------------------------------
+ Function callbacks
+ ----------------------------------------------------------------------------*/
+
+
+static void status_cb(MafwRenderer* renderer, MafwPlaylist* playlist, guint index,
+ MafwPlayState state,
+ const gchar* object_id,
+ gpointer user_data,
+ const GError *error)
+{
+ /* MafwRendererStatusCB */
+ RendererInfo* s = (RendererInfo*) user_data;
+ g_assert(s != NULL);
+
+ if (error != NULL) {
+ fail("Error received while trying to get renderer status: (%d) %s",
+ error->code, error->message);
+ }
+ s->state = state;
+
+}
+
+static void playback_cb(MafwRenderer* renderer, gpointer user_data, const GError* error)
+{
+ /* MafwRendererPlaybackCB:
+
+ Called after mafw_renderer_play(), mafw_renderer_play_uri(),
+ mafw_renderer_play_object(), mafw_renderer_stop(), mafw_renderer_pause(),
+ mafw_renderer_resume(), mafw_renderer_next(), mafw_renderer_previous() or
+ mafw_renderer_goto_index() has been called. */
+ CallbackInfo* c = (CallbackInfo*) user_data;
+ g_assert(c != NULL);
+
+ c->called = TRUE;
+ if (error != NULL) {
+ c->error = TRUE;
+ c->err_code = error->code;
+ c->err_msg = g_strdup(error->message);
+ }
+}
+
+static void seek_cb (MafwRenderer *self, gint position, gpointer user_data,
+ const GError *error)
+{
+ /* Called when seeking */
+
+ CallbackInfo* c = (CallbackInfo*) user_data;
+ g_assert(c != NULL);
+
+ c->called = TRUE;
+ c->seek_position = position;
+ if (error != NULL) {
+ c->error = TRUE;
+ c->err_code = error->code;
+ c->err_msg = g_strdup(error->message);
+ }
+}
+
+static void get_position_cb(MafwRenderer *self, gint position,
+ gpointer user_data, const GError *error)
+{
+ CallbackInfo* c = (CallbackInfo*) user_data;
+
+ g_debug("get position cb: %d", position);
+
+ if (error != NULL) {
+ c->error = TRUE;
+ c->err_code = error->code;
+ c->err_msg = g_strdup(error->message);
+ }
+ c->called = TRUE;
+}
+
+static void get_property_cb(MafwExtension *self,
+ const gchar *name,
+ GValue *value,
+ gpointer user_data,
+ const GError *error)
+{
+ CallbackInfo* c = (CallbackInfo*) user_data;
+ gchar *value_string;
+
+ value_string = g_strdup_value_contents(value);
+
+ g_debug("get property cb: %s (%s)", name, value_string);
+ g_free(value_string);
+
+ if (error != NULL) {
+ c->error = TRUE;
+ c->err_code = error->code;
+ c->err_msg = g_strdup(error->message);
+ }
+
+ if (c->property_expected != NULL &&
+ strcmp(c->property_expected, name) == 0) {
+ c->property_received = g_new0(GValue, 1);
+ g_value_init(c->property_received, G_VALUE_TYPE(value));
+ g_value_copy(value, c->property_received);
+
+ c->called = TRUE;
+ }
+}
+
+/*----------------------------------------------------------------------------
+ Helpers
+ ----------------------------------------------------------------------------*/
+
+static gchar *get_sample_clip_path(const gchar *clip)
+{
+ gchar *my_dir, *media;
+
+ /* Makefile.am sets TESTS_DIR, required for VPATH builds (like make
+ * distcheck). Otherwise assume we are running in-place. */
+ my_dir = g_strdup(g_getenv("TESTS_DIR"));
+ if (!my_dir)
+ my_dir = g_get_current_dir();
+ media = g_strconcat("file://", my_dir, G_DIR_SEPARATOR_S,
+ "media" G_DIR_SEPARATOR_S, clip,
+ NULL);
+ g_free(my_dir);
+ return media;
+}
+
+static gchar *get_sample_clip_objectid(const gchar *clip)
+{
+ gchar *path = NULL;
+ gchar *objectid = NULL;
+
+ path = get_sample_clip_path(clip);
+ objectid = mafw_source_create_objectid(path);
+ g_free(path);
+
+ return objectid;
+}
+
+static gboolean stop_wait_timeout(gpointer user_data)
+{
+ gboolean *do_stop = (gboolean *) user_data;
+ g_debug("stop wait timeout");
+ *do_stop = TRUE;
+
+ return FALSE;
+}
+
+static gboolean wait_until_timeout_finishes(guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+ gboolean result = FALSE;
+
+ g_debug("Init wait_");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+ while(!stop_wait) {
+ result= g_main_context_iteration(NULL, TRUE);
+ }
+
+ g_debug("End wait_");
+ return TRUE;
+}
+
+static gboolean wait_for_state(RendererInfo *renderer_info,
+ MafwPlayState expected_state, guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+
+ g_debug("Init wait for state");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+
+ while(renderer_info->state != expected_state && !stop_wait) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+
+ if (!stop_wait) {
+ g_source_remove(timeout);
+ }
+
+ g_debug("End wait for state");
+ return (renderer_info->state == expected_state);
+}
+
+static gboolean wait_for_callback(CallbackInfo *callback, guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+
+ g_debug("Init wait for callback");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+
+ while (callback->called == FALSE && !stop_wait) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+ if (!stop_wait) {
+ g_source_remove(timeout);
+ }
+ g_debug("End wait for callback");
+ return callback->called;
+}
+
+static gboolean wait_for_metadata(MetadataChangedInfo *callback, guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+
+ g_debug("Init wait for metadata");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+
+ while (callback->value == NULL && !stop_wait) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+ if (!stop_wait) {
+ g_source_remove(timeout);
+ }
+ g_debug("End wait for metadata");
+ return callback->value != NULL;
+}
+
+static gboolean wait_for_property(PropertyChangedInfo *callback, guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+
+ g_debug("Init wait for property changed");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+
+ while (callback->received == NULL && !stop_wait) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+ if (!stop_wait) {
+ g_source_remove(timeout);
+ }
+ g_debug("End wait for callback");
+ return callback->received != NULL;
+}
+
+static gboolean wait_for_buffering(BufferingInfo *callback, guint millis)
+{
+ guint timeout = 0;
+ gboolean stop_wait = FALSE;
+
+ g_debug("Init wait for buffering info");
+ /* We'll wait a limitted ammount of time */
+ timeout = g_timeout_add(millis, stop_wait_timeout, &stop_wait);
+
+ while (!callback->received && !stop_wait) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+ if (!stop_wait) {
+ g_source_remove(timeout);
+ }
+ g_debug("End wait for buffering info");
+ return callback->received;
+}
+
+static void reset_callback_info(CallbackInfo *callback_info)
+{
+ if (callback_info->err_msg != NULL)
+ g_free(callback_info->err_msg);
+
+ callback_info->err_msg = NULL;
+ callback_info->called = FALSE;
+ callback_info->error = FALSE;
+ callback_info->seek_position = 0;
+ callback_info->error_signal_expected = FALSE;
+ if (callback_info->error_signal_received != NULL) {
+ g_error_free(callback_info->error_signal_received);
+ callback_info->error_signal_received = NULL;
+ }
+ callback_info->property_expected = NULL;
+ if (callback_info->property_received != NULL) {
+ g_value_unset(callback_info->property_received);
+ callback_info->property_received = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------------
+ Fixtures
+ ----------------------------------------------------------------------------*/
+
+static void fx_setup_dummy_gst_renderer(void)
+{
+ MafwRegistry *registry;
+
+ /* Setup GLib */
+ g_type_init();
+
+ /* Create a gst renderer instance */
+ registry = MAFW_REGISTRY(mafw_registry_get_instance());
+ fail_if(registry == NULL,
+ "Error: cannot get MAFW registry");
+
+ g_gst_renderer = MAFW_RENDERER(mafw_gst_renderer_new(registry));
+ fail_if(!MAFW_IS_GST_RENDERER(g_gst_renderer),
+ "Could not create gst renderer instance");
+}
+
+static void fx_teardown_dummy_gst_renderer(void)
+{
+ g_object_unref(g_gst_renderer);
+}
+
+/*----------------------------------------------------------------------------
+ Mockups
+ ----------------------------------------------------------------------------*/
+
+/* GStreamer mock */
+
+GstElement * gst_element_factory_make(const gchar * factoryname,
+ const gchar * name)
+{
+ GstElementFactory *factory;
+ GstElement *element;
+ const gchar *use_factoryname;
+
+ g_return_val_if_fail(factoryname != NULL, NULL);
+
+ /* For testing, use playbin instead of playbin2 */
+ if (g_ascii_strcasecmp(factoryname, "playbin2") == 0)
+ use_factoryname = "playbin";
+ else
+ use_factoryname = factoryname;
+
+ GST_LOG("gstelementfactory: make \"%s\" \"%s\"",
+ use_factoryname, GST_STR_NULL (name));
+
+ factory = gst_element_factory_find(use_factoryname);
+ if (factory == NULL) {
+ /* No factory */
+ GST_INFO("no such element factory \"%s\"!", use_factoryname);
+ return NULL;
+ }
+
+ GST_LOG_OBJECT(factory, "found factory %p", factory);
+ if (g_ascii_strcasecmp(use_factoryname, "pulsesink") == 0) {
+ element = gst_element_factory_make("fakesink", "pulsesink");
+ g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
+ } else if (g_ascii_strcasecmp(use_factoryname, "xvimagesink") == 0) {
+ element = gst_element_factory_make("fakesink", "xvimagesink");
+ g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
+ } else {
+ element = gst_element_factory_create(factory, name);
+ }
+ gst_object_unref(factory);
+
+ if (element == NULL) {
+ /* Create failed */
+ GST_INFO_OBJECT(factory, "couldn't create instance!");
+ return NULL;
+ }
+
+ GST_LOG("gstelementfactory: make \"%s\" \"%s\"",use_factoryname,
+ GST_STR_NULL(name));
+
+ /* Playbin will use fake renderer */
+ if (g_ascii_strcasecmp(use_factoryname, "playbin") == 0) {
+ GstElement *audiorenderer = gst_element_factory_make("fakesink",
+ "audiorenderer");
+
+ g_object_set(G_OBJECT(audiorenderer), "sync", TRUE, NULL);
+ g_object_set(G_OBJECT(element),
+ "audio-sink",
+ audiorenderer,
+ NULL);
+ g_object_set(G_OBJECT(element),
+ "video-sink",
+ audiorenderer,
+ NULL);
+ }
+
+ return element;
+}
+
+
+/*----------------------------------------------------------------------------
+ Test cases
+ ----------------------------------------------------------------------------*/
+
+START_TEST(test_basic_playback)
+{
+ RendererInfo s;
+ CallbackInfo c;
+ MetadataChangedInfo m;
+ GstBus *bus = NULL;
+ GstMessage *message = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ m.expected_key = NULL;
+ m.value = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "metadata-changed",
+ G_CALLBACK(metadata_changed_cb),
+ &m);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ /* No media item has been set so, we should get an error */
+ if (c.error == FALSE)
+ fail("Play of unset media did not return an error");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ gchar *objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
+ s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ g_free(objectid);
+
+ /* --- Get position --- */
+
+ reset_callback_info(&c);
+
+ mafw_renderer_get_position(g_gst_renderer, get_position_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_position", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Duration emission --- */
+
+ m.expected_key = MAFW_METADATA_KEY_DURATION;
+
+ bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
+ fail_if(bus == NULL, "No GstBus");
+
+ message = gst_message_new_duration(NULL, GST_FORMAT_TIME,
+ 5 * GST_SECOND);
+ gst_bus_post(bus, message);
+
+ if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
+ fail("Expected " MAFW_METADATA_KEY_DURATION
+ ", but not received");
+ }
+
+ fail_if(m.value == NULL, "Metadata " MAFW_METADATA_KEY_DURATION
+ " not received");
+
+ g_value_unset(m.value);
+ g_free(m.value);
+ m.value = NULL;
+ m.expected_key = NULL;
+
+ /* --- Pause --- */
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_pause", "Paused", s.state);
+ }
+
+ /* --- Resume --- */
+
+ reset_callback_info(&c);
+
+ g_debug("resume...");
+ mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "resuming", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_resume", "Playing", s.state);
+ }
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
+ }
+
+}
+END_TEST
+
+START_TEST(test_playlist_playback)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };
+ CallbackInfo c = {0, };
+ gchar *cur_item_oid = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ for (i=0; i<10; i++) {
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ }
+ g_free(cur_item_oid);
+ cur_item_oid = get_sample_clip_objectid("unexisting.wav");
+ mafw_playlist_insert_item(playlist, 9, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
+ }
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_stop", "Stopped", s.state);
+ }
+
+ /* --- Next --- */
+
+ /* Get actual index */
+
+ gint initial_index = s.index;
+
+ for (i=0; i<3; i++) {
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != initial_index + (i+1), index_err_msg, s.index,
+ initial_index + (i+1));
+ }
+
+
+ /* --- Prev --- */
+
+ /* Get actual index */
+ initial_index = s.index;
+
+ for (i=0; i<3; i++) {
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != initial_index - (i+1), index_err_msg, s.index,
+ initial_index - (i+1));
+ }
+
+ /* Check if renderer remains in Stopped state after some Prev operations */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
+ "after doing prev. The actual state is %s and must be %s",
+ s.state, "Stopped");
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping playback",
+ c.err_code, c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop","Stopped", s.state);
+ }
+
+ /* --- Go to index in Stopped state --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 3...");
+ mafw_renderer_goto_index(g_gst_renderer, 3, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 3", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 3, index_err_msg, s.index, 3);
+
+ /* Check if renderer remains in Stopped state after running go to index */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
+ "after running go to index. The actual state is %s and must be"
+ " %s", s.state, "Stopped");
+
+ /* --- Play (playlist index is 3) --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
+ }
+
+ /* --- Goto index in Playing state --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 5...");
+ mafw_renderer_goto_index(g_gst_renderer, 5, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index", "Playing", s.state);
+ }
+
+ /* Check if the index if correct */
+ fail_if(s.index != 5, index_err_msg, s.index, 5);
+
+ /* Check if renderer remains in Playing state after running go to index */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail("Gst renderer didn't remain in Playing state after running "
+ "go to index. The actual state is %s and must be %s",
+ s.state, "Playing");
+ }
+
+ /* --- Goto an invalid index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto the invalid index 20...");
+ mafw_renderer_goto_index(g_gst_renderer, 20, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error == FALSE)
+ fail("Error not received when we go to an incorrect"
+ "index");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the previous index (5) remains after an incorrect go to
+ index request */
+ fail_if(s.index != 5, index_err_msg, 5, s.index);
+
+ reset_callback_info(&c);
+
+ /* --- Reassigning playlist --- */
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer,
+ g_object_ref(playlist), NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Go to index with invalid media --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 9...");
+ mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 9", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ /* Check if renderer remains in Stopped state after running go
+ * to index */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped "
+ "state after running go to index. The actual state is %d and "
+ "must be %s", s.state, "Stopped");
+
+ /* --- Play (playlist index is 9) --- */
+
+ reset_callback_info(&c);
+
+ c.error_signal_expected = TRUE;
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Transitioning",
+ s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
+ }
+
+ fail_if(c.error_signal_received == NULL ||
+ !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
+ MAFW_RENDERER_ERROR_INVALID_URI),
+ "No error received or incorrect one");
+
+ if (c.error_signal_received != NULL) {
+ g_error_free(c.error_signal_received);
+ c.error_signal_received = NULL;
+ }
+ c.error_signal_expected = FALSE;
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping playback",
+ c.err_code, c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop","Stopped", s.state);
+ }
+
+ /* --- Remove last media --- */
+
+ mafw_playlist_remove_item(playlist, 10, NULL);
+
+ /* --- Go to index with invalid media --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 9...");
+ mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 9", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ /* Check if renderer remains in Stopped state after running go
+ * to index */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped "
+ "state after running go to index. The actual state is %d and "
+ "must be %s", s.state, "Stopped");
+
+ /* --- Play (playlist index is 9) --- */
+
+ reset_callback_info(&c);
+
+ c.error_signal_expected = TRUE;
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Transitioning",
+ s.state);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Stopped", s.state);
+ }
+
+ fail_if(c.error_signal_received == NULL ||
+ !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
+ MAFW_RENDERER_ERROR_INVALID_URI),
+ "No error received or incorrect one");
+
+ if (c.error_signal_received != NULL) {
+ g_error_free(c.error_signal_received);
+ c.error_signal_received = NULL;
+ }
+ c.error_signal_expected = FALSE;
+
+ /* --- Play incorrect object --- */
+
+ reset_callback_info(&c);
+
+ c.error_signal_expected = TRUE;
+
+ gchar *objectid = get_sample_clip_objectid("unexisting.wav");
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning",
+ s.state);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Stopped",
+ s.state);
+ }
+
+ fail_if(c.error_signal_received == NULL ||
+ !g_error_matches(c.error_signal_received, MAFW_RENDERER_ERROR,
+ MAFW_RENDERER_ERROR_INVALID_URI),
+ "No error received or incorrect one");
+
+ if (c.error_signal_received != NULL) {
+ g_error_free(c.error_signal_received);
+ c.error_signal_received = NULL;
+ }
+ c.error_signal_expected = FALSE;
+
+ g_free(objectid);
+
+}
+END_TEST
+
+
+START_TEST(test_repeat_mode_playback)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Create playlist --- */
+
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+
+ /* Set repeat mode */
+ mafw_playlist_set_repeat(playlist, TRUE);
+
+ /* --- Assign playlist --- */
+
+ g_debug("assign playlist...");
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 9...");
+ /* go to the end of the playlist */
+ mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 9", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* check if the movement was successful */
+ fail_if(s.index != 9, index_err_msg, 9, s.index);
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping playback", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_stop", "Stopped", s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("next...");
+ /* The actual index is 9 */
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* check if the movement was successful */
+ fail_if(s.index != 0, index_err_msg, s.index, 0);
+
+ /* Check if renderer remains in Stopped state after moving to next */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
+ "after doing next. The actual state is %s and must be %s",
+ s.state, "Stopped");
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("prev...");
+ /* The actual index is 0 */
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* check if the movement was successful */
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ /* Check if renderer remains in Stopped state after moving to next */
+ fail_if(s.state != Stopped, "Gst renderer didn't remain in Stopped state "
+ "after doing next. The actual state is %s and must be %s",
+ s.state, "Stopped");
+}
+END_TEST
+
+
+START_TEST(test_gst_renderer_mode)
+{
+ MafwPlaylist *playlist = NULL;
+ MafwGstRenderer *renderer = NULL;
+ MafwGstRendererPlaybackMode play_mode;
+ gchar *objectid = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ gchar *modes[] = {"MAFW_GST_RENDERER_MODE_PLAYLIST",
+ "MAFW_GST_RENDERER_MODE_STANDALONE"};
+
+ renderer = MAFW_GST_RENDERER(g_gst_renderer);
+
+ /* Initiliaze callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Create playlist --- */
+
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+
+ /* --- Assign playlist --- */
+
+ g_debug("assign playlist...");
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist, NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Transitioning", s.state);
+ }
+
+ /* Check that renderer is playing a playlist */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing", s.state);
+ }
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s",objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+ g_free(objectid);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
+ s.state);
+ }
+
+ /* Check that renderer is playing an object */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+ /* Wait EOS_TIMEOUT to ensure that the play_object has finished */
+ wait_until_timeout_finishes(EOS_TIMEOUT);
+
+ /* Check that after playing the object, renderer returns to the playlist
+ playback */
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+ g_free(objectid);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
+ s.state);
+ }
+
+ /* Check that renderer is playing an object */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+
+ /* --- Move to next when renderer is playing an object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check that "next" function finishes the object playback and returns
+ to the playlist playback */
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+ /* Check that renderer is still in Playing state */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Transitioning",
+ s.state);
+ }
+
+ /* Check that renderer is playing an object */
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_STANDALONE,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+ /* Wait EOS_TIMEOUT to ensure that object playback finishes */
+ wait_until_timeout_finishes(EOS_TIMEOUT);
+
+ /* Check if renderer is in playlist mode and the renderer state is the state before
+ playing the object */
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
+ }
+ play_mode = mafw_gst_renderer_get_playback_mode(renderer);
+ fail_if(play_mode != MAFW_GST_RENDERER_MODE_PLAYLIST,
+ "Incorrect value of playback_mode: %s", modes[play_mode]);
+
+ g_free(objectid);
+}
+END_TEST
+
+#define MOCK_SOURCE(o) \
+ (G_TYPE_CHECK_INSTANCE_CAST((o), \
+ mock_source_get_type(), \
+ MockSource))
+
+typedef struct {
+ MafwSourceClass parent;
+} MockSourceClass;
+
+typedef struct {
+ MafwSource parent;
+
+
+} MockSource;
+
+GType mock_source_get_type(void);
+GObject* mock_source_new(void);
+
+G_DEFINE_TYPE(MockSource, mock_source, MAFW_TYPE_SOURCE);
+
+static GHashTable *get_md_ht; /* Metadata hash-table for the metadata result */
+static GError *get_md_err; /* Error value for the metadata result */
+static gboolean set_mdata_called; /* Whether set_metadata was called or not */
+static gboolean get_mdata_called; /* Whether get_metadata was called or not */
+static gint reference_pcount; /* Reference playcount, what should come in set_metadata */
+static gboolean set_for_playcount; /* TRUE, when the set_metadata is called to modify the playcount */
+static gboolean set_for_lastplayed; /* TRUE, when the set_metadata is called to modify the last-played */
+
+static void get_metadata(MafwSource *self,
+ const gchar *object_id,
+ const gchar *const *metadata,
+ MafwSourceMetadataResultCb callback,
+ gpointer user_data)
+{
+ get_mdata_called = TRUE;
+ fail_if(strcmp(object_id, "mocksource::test"));
+ callback(self, object_id, get_md_ht, user_data, get_md_err);
+}
+
+static void set_metadata(MafwSource *self, const gchar *object_id,
+ GHashTable *metadata,
+ MafwSourceMetadataSetCb callback,
+ gpointer user_data)
+{
+ GValue *curval;
+ gint htsize = 0;
+
+ if (set_for_playcount)
+ htsize++;
+ if (set_for_lastplayed)
+ htsize++;
+ fail_if(strcmp(object_id, "mocksource::test"));
+ fail_if(!metadata);
+ fail_if(g_hash_table_size(metadata) != htsize, "Hash table size: %d vs %d", g_hash_table_size(metadata), htsize);
+ if (set_for_playcount)
+ {
+ curval = mafw_metadata_first(metadata,
+ MAFW_METADATA_KEY_PLAY_COUNT);
+ fail_if(!curval);
+ fail_if(g_value_get_int(curval) != reference_pcount);
+ }
+ if (set_for_lastplayed)
+ {
+ curval = mafw_metadata_first(metadata,
+ MAFW_METADATA_KEY_LAST_PLAYED);
+ fail_if(!curval);
+ fail_if(!G_VALUE_HOLDS(curval, G_TYPE_LONG));
+ }
+ set_mdata_called = TRUE;
+}
+
+static void mock_source_class_init(MockSourceClass *klass)
+{
+ MafwSourceClass *sclass = MAFW_SOURCE_CLASS(klass);
+
+ sclass->get_metadata = get_metadata;
+ sclass->set_metadata = set_metadata;
+
+}
+
+static void mock_source_init(MockSource *source)
+{
+ /* NOP */
+}
+
+GObject* mock_source_new(void)
+{
+ GObject* object;
+ object = g_object_new(mock_source_get_type(),
+ "plugin", "mockland",
+ "uuid", "mocksource",
+ "name", "mocksource",
+ NULL);
+ return object;
+}
+
+
+START_TEST(test_update_stats)
+{
+ MafwGstRenderer *renderer = NULL;
+ MafwSource *src;
+ MafwRegistry *registry;
+
+ registry = MAFW_REGISTRY(mafw_registry_get_instance());
+ fail_if(registry == NULL,
+ "Error: cannot get MAFW registry");
+
+
+ renderer = MAFW_GST_RENDERER(g_gst_renderer);
+ src = MAFW_SOURCE(mock_source_new());
+
+ mafw_registry_add_extension(registry, MAFW_EXTENSION(src));
+
+ /* Error on get_mdata_cb*/
+ set_for_playcount = FALSE;
+ set_for_lastplayed = FALSE;
+ get_md_err = NULL;
+ g_set_error(&get_md_err, MAFW_SOURCE_ERROR,
+ MAFW_SOURCE_ERROR_INVALID_OBJECT_ID,
+ "Wrong object id mocksource::test");
+ renderer->media->object_id = g_strdup("mocksource::test");
+ mafw_gst_renderer_update_stats(renderer);
+ g_error_free(get_md_err);
+ fail_if(set_mdata_called);
+ fail_if(!get_mdata_called);
+
+ /* get_mdata ok, but HashTable is NULL */
+ reference_pcount = 1;
+ get_mdata_called = FALSE;
+ set_for_lastplayed = TRUE;
+ set_for_playcount = TRUE;
+ get_md_err = NULL;
+ mafw_gst_renderer_update_stats(renderer);
+ fail_if(!set_mdata_called);
+ fail_if(!get_mdata_called);
+
+ /* get_mdata ok, but HashTable is empty */
+ get_mdata_called = FALSE;
+ set_mdata_called = FALSE;
+ set_for_lastplayed = TRUE;
+ set_for_playcount = TRUE;
+ get_md_ht = mafw_metadata_new();
+ mafw_gst_renderer_update_stats(renderer);
+ fail_if(!set_mdata_called);
+ fail_if(!get_mdata_called);
+
+ /* get_mdata ok, but HashTable has valid value */
+ get_mdata_called = FALSE;
+ set_mdata_called = FALSE;
+ set_for_lastplayed = TRUE;
+ set_for_playcount = TRUE;
+ mafw_metadata_add_int(get_md_ht,
+ MAFW_METADATA_KEY_PLAY_COUNT,
+ 1);
+ reference_pcount = 2;
+ mafw_gst_renderer_update_stats(renderer);
+ fail_if(!set_mdata_called);
+ fail_if(!get_mdata_called);
+}
+END_TEST
+
+START_TEST(test_play_state)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ gchar *objectid = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ if (wait_for_state(&s, Stopped, 3000) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Stop",
+ s.state);
+ }
+
+ g_free(objectid);
+
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+ mafw_playlist_set_repeat(playlist, FALSE);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
+ NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail("Play after assigning playlist failed");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing",
+ s.state);
+ }
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev", "Playing",
+ s.state);
+ }
+
+ /* Removing last element */
+
+ g_debug("removing last element...");
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
+ "Playlist should have 10 elements");
+ mafw_playlist_remove_item(playlist, 9, NULL);
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
+ "Playlist should have 9 elements");
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_element",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_element", "Playing",
+ s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 0, index_err_msg, s.index, 0);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next", "Playing",
+ s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 8", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
+ s.state);
+ }
+
+ /* --- Seeking --- */
+
+ reset_callback_info(&c);
+
+ g_debug("seeking...");
+ mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
+ seek_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "seeking failed", c.err_code,
+ c.err_msg);
+ if (c.seek_position != 1) {
+ fail("seeking failed");
+ }
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Waiting EOS --- */
+
+ if (wait_for_state(&s, Stopped, 2000) == FALSE) {
+ fail(state_err_msg, "EOS", "Stop",
+ s.state);
+ }
+}
+END_TEST
+
+START_TEST(test_pause_state)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ gchar *objectid = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+ mafw_playlist_set_repeat(playlist, FALSE);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
+ NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail("Play failed");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play",
+ "Transitioning", s.state);
+ }
+
+ /* Testing pause in transitioning */
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Testing resume in transitioning */
+
+ reset_callback_info(&c);
+
+ g_debug("resume...");
+ mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "resuming", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ reset_callback_info(&c);
+
+ /* Testing resume without having paused in transitioning */
+
+ reset_callback_info(&c);
+
+ g_debug("resume...");
+ mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "resuming", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_pause", "Paused",
+ s.state);
+ }
+
+ /* --- Play object in pause --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_pause", "Paused",
+ s.state);
+ }
+
+ g_free(objectid);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail("Play failed");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play",
+ "Transitioning", s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_pause", "Paused",
+ s.state);
+ }
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev",
+ "Transitioning", s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev", "Playing",
+ s.state);
+ }
+
+ /* Removing last element */
+
+ g_debug("removing last element...");
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
+ "Playlist should have 10 elements");
+ mafw_playlist_remove_item(playlist, 9, NULL);
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
+ "Playlist should have 9 elements");
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_item",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_item", "Playing",
+ s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_item", "Playing",
+ s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 0, index_err_msg, s.index, 0);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next",
+ "Transitioning", s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next", "Playing",
+ s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 8", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* Check if the playlist index is correct */
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index",
+ "Transitioning", s.state);
+ }
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
+ s.state);
+ }
+
+ /* --- Seeking --- */
+
+ reset_callback_info(&c);
+
+ mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
+ seek_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "seeking", c.err_code,
+ c.err_msg);
+ if (c.seek_position != 1) {
+ fail("seeking failed");
+ }
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
+ }
+}
+END_TEST
+
+START_TEST(test_stop_state)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "going to index 8",
+ c.err_code, c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+ mafw_playlist_set_repeat(playlist, FALSE);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
+ NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* Removing last element */
+
+ g_debug("removing last element...");
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
+ "Playlist should have 10 elements");
+ mafw_playlist_remove_item(playlist, 9, NULL);
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
+ "Playlist should have 9 elements");
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 9...");
+ mafw_renderer_goto_index(g_gst_renderer, 9, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "going to index 9",
+ c.err_code, c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+ reset_callback_info(&c);
+}
+END_TEST
+
+START_TEST(test_transitioning_state)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ gchar *objectid = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+ mafw_playlist_set_repeat(playlist, FALSE);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
+ NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail("Play after assigning playlist failed");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play",
+ "Transitioning", s.state);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ g_free(objectid);
+
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 9, index_err_msg, s.index, 9);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev",
+ "Transitioning", s.state);
+ }
+
+ /* Removing last element */
+
+ g_debug("removing last element...");
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 10,
+ "Playlist should have 10 elements");
+ mafw_playlist_remove_item(playlist, 9, NULL);
+ fail_if(mafw_playlist_get_size(playlist, NULL) != 9,
+ "Playlist should have 9 elements");
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_playlist_remove_element",
+ "Transitioning", s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 0, index_err_msg, s.index, 0);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next",
+ "Transitioning", s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 8", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index",
+ "Transitioning", s.state);
+ }
+}
+END_TEST
+
+START_TEST(test_state_class)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ gchar *objectid = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_no_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (!c.error)
+ fail(callback_err_msg, "going to index 8", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+ for (i=0; i<10; i++) {
+ gchar *cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(
+ playlist, i, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+ mafw_playlist_set_repeat(playlist, FALSE);
+
+ media_changed_called = FALSE;
+ if (!mafw_renderer_assign_playlist(g_gst_renderer, playlist,
+ NULL))
+ {
+ fail("Assign playlist failed");
+ }
+
+ wait_for_state(&s, Stopped, wait_tout_val);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Next --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to next...");
+ mafw_renderer_next(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to next", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 1, index_err_msg, s.index, 1);
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_next", "Playing",
+ s.state);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Go to index --- */
+
+ reset_callback_info(&c);
+
+ g_debug("goto index 8...");
+ mafw_renderer_goto_index(g_gst_renderer, 8, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "going to index 8", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 8, index_err_msg, s.index, 8);
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_goto_index", "Playing",
+ s.state);
+ }
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 7, index_err_msg, s.index, 7);
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev", "Playing",
+ s.state);
+ }
+
+ /* --- Play --- */
+
+ reset_callback_info(&c);
+
+ g_debug("play...");
+ mafw_renderer_play(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail("Play after assigning playlist failed");
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play", "Playing",
+ s.state);
+ }
+
+ /* --- Prev --- */
+
+ reset_callback_info(&c);
+
+ g_debug("move to prev...");
+ mafw_renderer_previous(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "moving to prev", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(s.index != 6, index_err_msg, s.index, 6);
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev",
+ "Transitioning", s.state);
+ }
+
+ /* --- Seeking --- */
+
+ reset_callback_info(&c);
+
+ g_debug("seeking...");
+ mafw_renderer_set_position(g_gst_renderer, SeekRelative, 1,
+ seek_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "seeking failed", c.err_code,
+ c.err_msg);
+ if (c.seek_position != 1) {
+ fail("seeking failed");
+ }
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Seeking --- */
+
+ reset_callback_info(&c);
+
+ g_debug("seeking...");
+ mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, -1,
+ seek_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "seeking failed", c.err_code,
+ c.err_msg);
+ if (c.seek_position != -1) {
+ fail("seeking failed");
+ }
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Seeking --- */
+
+ reset_callback_info(&c);
+
+ g_debug("seeking...");
+ mafw_renderer_set_position(g_gst_renderer, SeekAbsolute, 1,
+ seek_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "seeking failed", c.err_code,
+ c.err_msg);
+ if (c.seek_position != 1) {
+ fail("seeking failed");
+ }
+ } else {
+ fail(no_callback_msg);
+ }
+}
+END_TEST
+
+START_TEST(test_playlist_iterator)
+{
+ MafwPlaylist *playlist = NULL;
+ gint i = 0;
+ CallbackInfo c = {0, };;
+ MafwPlaylistIterator *iterator = NULL;
+ GError *error = NULL;
+ gint size;
+ gint index;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error = FALSE;
+ reset_callback_info(&c);
+
+ /* --- Create and assign a playlist --- */
+
+ g_debug("assign playlist...");
+ playlist = MAFW_PLAYLIST(mafw_mock_playlist_new());
+
+ iterator = mafw_playlist_iterator_new();
+ mafw_playlist_iterator_initialize(iterator, playlist, &error);
+ if (error != NULL) {
+ fail("Error found: %s, %d, %s",
+ g_quark_to_string(error->domain),
+ error->code, error->message);
+ }
+
+ for (i = 0; i < 3; i++) {
+ gchar *cur_item_oid = NULL;
+ cur_item_oid =
+ get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ mafw_playlist_insert_item(playlist, 0, cur_item_oid, NULL);
+ g_free(cur_item_oid);
+ }
+
+ size = mafw_playlist_iterator_get_size(iterator, NULL);
+ fail_if(size != 3, "Playlist should have 3 elements and it has %d",
+ size);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 2, "Index should be 2 and it is %d", index);
+
+ mafw_playlist_move_item(playlist, 1, 2, NULL);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 1, "Index should be 1 and it is %d", index);
+
+ mafw_playlist_move_item(playlist, 2, 1, NULL);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 2, "Index should be 2 and it is %d", index);
+
+ mafw_playlist_move_item(playlist, 2, 1, NULL);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 1, "Index should be 1 and it is %d", index);
+
+ mafw_playlist_remove_item(playlist, 0, &error);
+ if (error != NULL) {
+ fail("Error found: %s, %d, %s",
+ g_quark_to_string(error->domain),
+ error->code, error->message);
+ }
+
+ size = mafw_playlist_iterator_get_size(iterator, NULL);
+ fail_if(size != 2, "Playlist should have 2 elements and it has %d",
+ size);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 0, "Index should be 0 and it is %d", index);
+
+ mafw_playlist_iterator_reset(iterator, NULL);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 0, "Index should be 0 and it is %d", index);
+
+ mafw_playlist_remove_item(playlist, 0, &error);
+ if (error != NULL) {
+ fail("Error found: %s, %d, %s",
+ g_quark_to_string(error->domain),
+ error->code, error->message);
+ }
+
+ size = mafw_playlist_iterator_get_size(iterator, NULL);
+ fail_if(size != 1, "Playlist should have 1 elements and it has %d",
+ size);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != 0, "Index should be 0 and it is %d", index);
+
+ mafw_playlist_remove_item(playlist, 0, &error);
+ if (error != NULL) {
+ fail("Error found: %s, %d, %s",
+ g_quark_to_string(error->domain),
+ error->code, error->message);
+ }
+
+ size = mafw_playlist_iterator_get_size(iterator, NULL);
+ fail_if(size != 0, "Playlist should have 0 elements and it has %d",
+ size);
+ index = mafw_playlist_iterator_get_current_index(iterator);
+ fail_if(index != -1, "Index should be -1 and it is %d", index);
+
+ g_object_unref(iterator);
+}
+END_TEST
+
+START_TEST(test_video)
+{
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ MetadataChangedInfo m;
+ gchar *objectid = NULL;
+ GstBus *bus = NULL;
+ GstStructure *structure = NULL;
+ GstMessage *message = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ m.expected_key = NULL;
+ m.value = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+ g_signal_connect(g_gst_renderer, "metadata-changed",
+ G_CALLBACK(metadata_changed_cb),
+ &m);
+
+#ifdef HAVE_GDKPIXBUF
+ mafw_extension_set_property_boolean(
+ MAFW_EXTENSION(g_gst_renderer),
+ MAFW_PROPERTY_GST_RENDERER_CURRENT_FRAME_ON_PAUSE,
+ TRUE);
+#endif
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_VIDEO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ MAFW_GST_RENDERER(g_gst_renderer)->worker->xid = 0x1;
+ bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
+ fail_if(bus == NULL, "No GstBus");
+
+ structure = gst_structure_new("prepare-xwindow-id", "width",
+ G_TYPE_INT, 64, "height", G_TYPE_INT, 32,
+ NULL);
+ message = gst_message_new_element(NULL, structure);
+ gst_bus_post(bus, message);
+
+ /* --- Pause --- */
+
+ reset_callback_info(&c);
+
+ m.expected_key = MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI;
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev", "Playing",
+ s.state);
+ }
+
+ if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
+ fail("Expected " MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI
+ ", but not received");
+ }
+
+ fail_if(m.value == NULL, "Metadata "
+ MAFW_METADATA_KEY_PAUSED_THUMBNAIL_URI " not received");
+
+ g_value_unset(m.value);
+ g_free(m.value);
+ m.value = NULL;
+ m.expected_key = NULL;
+
+ /* --- Resume --- */
+
+ reset_callback_info(&c);
+
+ g_debug("resume...");
+ mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "resuming", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ /* --- EOS --- */
+
+ if (wait_for_state(&s, Stopped, 3000) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Stop",
+ s.state);
+ }
+
+ g_free(objectid);
+}
+END_TEST
+
+START_TEST(test_media_art)
+{
+ RendererInfo s = {0, };;
+ CallbackInfo c = {0, };;
+ MetadataChangedInfo m;
+ gchar *objectid = NULL;
+ GstBus *bus = NULL;
+ GstMessage *message = NULL;
+ GstTagList *list = NULL;
+ GstBuffer *buffer = NULL;
+ guchar *image = NULL;
+ gchar *image_path = NULL;
+ gsize image_length;
+ GstCaps *caps = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ m.expected_key = NULL;
+ m.value = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "media-changed",
+ G_CALLBACK(media_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "playlist-changed",
+ G_CALLBACK(playlist_changed_cb),
+ NULL);
+ g_signal_connect(g_gst_renderer, "metadata-changed",
+ G_CALLBACK(metadata_changed_cb),
+ &m);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb,
+ &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ /* --- Pause --- */
+
+ reset_callback_info(&c);
+
+ g_debug("pause...");
+ mafw_renderer_pause(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "pausing", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Paused, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_prev", "Playing",
+ s.state);
+ }
+
+ /* Emit image */
+
+ bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
+ fail_if(bus == NULL, "No GstBus");
+
+ m.expected_key = MAFW_METADATA_KEY_RENDERER_ART_URI;
+
+ image_path = get_sample_clip_path(SAMPLE_IMAGE);
+ fail_if(!g_file_get_contents(image_path + 7, (gchar **) &image,
+ &image_length, NULL),
+ "Could not load test image");
+ g_free(image_path);
+
+ buffer = gst_buffer_new();
+ gst_buffer_set_data(buffer, image, image_length);
+ caps = gst_caps_new_simple("image/png", "image-type",
+ GST_TYPE_TAG_IMAGE_TYPE,
+ GST_TAG_IMAGE_TYPE_FRONT_COVER, NULL);
+ gst_buffer_set_caps(buffer, caps);
+ gst_caps_unref(caps);
+
+ list = gst_tag_list_new();
+ gst_tag_list_add(list, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, buffer,
+ NULL);
+
+ message = gst_message_new_tag(NULL, list);
+ gst_bus_post(bus, message);
+
+ /* --- Resume --- */
+
+ reset_callback_info(&c);
+
+ g_debug("resume...");
+ mafw_renderer_resume(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "resuming", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ if (wait_for_metadata(&m, wait_tout_val) == FALSE) {
+ fail("Expected " MAFW_METADATA_KEY_RENDERER_ART_URI
+ ", but not received");
+ }
+
+ fail_if(m.value == NULL, "Metadata "
+ MAFW_METADATA_KEY_RENDERER_ART_URI " not received");
+
+ g_value_unset(m.value);
+ g_free(m.value);
+ m.value = NULL;
+ m.expected_key = NULL;
+
+ /* --- EOS --- */
+
+ if (wait_for_state(&s, Stopped, 3000) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Stop",
+ s.state);
+ }
+
+ g_free(objectid);
+}
+END_TEST
+
+START_TEST(test_properties_management)
+{
+ RendererInfo s;
+ CallbackInfo c = {0, };;
+ PropertyChangedInfo p;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+ p.expected = NULL;
+ p.received = NULL;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "property-changed",
+ G_CALLBACK(property_changed_cb),
+ &p);
+
+ /* Wait for the volume manager to be initialized */
+
+ /* Volume */
+
+ p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
+
+ if (!wait_for_property(&p, wait_tout_val)) {
+ fail("No property %s received", p.expected);
+ }
+
+ fail_if(p.received == NULL, "No property %s received",
+ p.expected);
+ fail_if(p.received != NULL &&
+ g_value_get_uint(p.received) != 48,
+ "Property with value %d and %d expected",
+ g_value_get_uint(p.received), 48);
+
+ if (p.received != NULL) {
+ g_value_unset(p.received);
+ g_free(p.received);
+ p.received = NULL;
+ }
+ p.expected = NULL;
+
+ /* --- mute --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_MUTE;
+
+ mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, TRUE);
+
+ p.expected = MAFW_PROPERTY_RENDERER_MUTE;
+
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+ if (!wait_for_property(&p, wait_tout_val)) {
+ fail("No property %s received", p.expected);
+ }
+
+ fail_if(p.received == NULL, "No property %s received",
+ p.expected);
+ fail_if(p.received != NULL &&
+ g_value_get_boolean(p.received) != TRUE,
+ "Property with value %d and %d expected",
+ g_value_get_boolean(p.received), TRUE);
+#else
+ if (wait_for_property(&p, wait_tout_val)) {
+ fail("Property %s received and it should not have been",
+ p.expected);
+ }
+
+ fail_if(p.received != NULL,
+ "Property %s received and it should not have been",
+ p.expected);
+#endif
+
+ if (p.received != NULL) {
+ g_value_unset(p.received);
+ g_free(p.received);
+ p.received = NULL;
+ }
+ p.expected = NULL;
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+ fail_if(c.property_received != NULL &&
+ g_value_get_boolean(c.property_received) != TRUE,
+ "Property with value %d and %d expected",
+ g_value_get_boolean(c.property_received), TRUE);
+#else
+ fail_if(c.property_received != NULL &&
+ g_value_get_boolean(c.property_received) != FALSE,
+ "Property with value %d and %d expected",
+ g_value_get_boolean(c.property_received), FALSE);
+#endif
+
+ /* --- xid --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_XID;
+
+ mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, 50);
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_uint(c.property_received) != 50,
+ "Property with value %d and %d expected",
+ g_value_get_uint(c.property_received), 50);
+
+ /* --- error policy --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_ERROR_POLICY;
+
+ mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, 1);
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_uint(c.property_received) != 1,
+ "Property with value %d and %d expected",
+ g_value_get_uint(c.property_received), 1);
+
+ /* --- autopaint --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_AUTOPAINT;
+
+ mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, TRUE);
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_boolean(c.property_received) != TRUE,
+ "Property with value %d and %d expected",
+ g_value_get_boolean(c.property_received), TRUE);
+
+ /* --- colorkey --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_COLORKEY;
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_int(c.property_received) != -1,
+ "Property with value %d and %d expected",
+ g_value_get_int(c.property_received), -1);
+
+ /* --- current frame on pause --- */
+
+ reset_callback_info(&c);
+
+ c.property_expected = MAFW_PROPERTY_GST_RENDERER_CURRENT_FRAME_ON_PAUSE;
+
+ mafw_extension_set_property_boolean(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, TRUE);
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_boolean(c.property_received) != TRUE,
+ "Property with value %d and %d expected",
+ g_value_get_boolean(c.property_received), TRUE);
+
+ /* --- volume --- */
+
+ p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
+
+ mafw_extension_set_property_uint(MAFW_EXTENSION(g_gst_renderer),
+ p.expected, 50);
+
+ if (!wait_for_property(&p, wait_tout_val)) {
+ fail("No property %s received", p.expected);
+ }
+
+ fail_if(p.received == NULL, "No property %s received",
+ p.expected);
+ fail_if(p.received != NULL &&
+ g_value_get_uint(p.received) != 50,
+ "Property with value %d and %d expected",
+ g_value_get_uint(p.received), 50);
+
+ if (p.received != NULL) {
+ g_value_unset(p.received);
+ g_free(p.received);
+ p.received = NULL;
+ }
+ p.expected = NULL;
+
+ c.property_expected = MAFW_PROPERTY_RENDERER_VOLUME;
+
+ mafw_extension_get_property(MAFW_EXTENSION(g_gst_renderer),
+ c.property_expected, get_property_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "get_property", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ fail_if(c.property_received == NULL,
+ "No property %s received and expected", c.property_expected);
+ fail_if(c.property_received != NULL &&
+ g_value_get_uint(c.property_received) != 50,
+ "Property with value %d and %d expected",
+ g_value_get_uint(c.property_received), 50);
+
+#ifndef MAFW_GST_RENDERER_DISABLE_PULSE_VOLUME
+ /* Test reconnection to pulse */
+
+ pa_context_disconnect(pa_context_get_instance());
+
+ /* Wait for the volume manager to be reinitialized */
+
+ /* Volume */
+
+ p.expected = MAFW_PROPERTY_RENDERER_VOLUME;
+
+ if (!wait_for_property(&p, wait_tout_val)) {
+ fail("No property %s received", p.expected);
+ }
+
+ fail_if(p.received == NULL, "No property %s received",
+ p.expected);
+ fail_if(p.received != NULL &&
+ g_value_get_uint(p.received) != 48,
+ "Property with value %d and %d expected",
+ g_value_get_uint(p.received), 48);
+
+ if (p.received != NULL) {
+ g_value_unset(p.received);
+ g_free(p.received);
+ p.received = NULL;
+ }
+ p.expected = NULL;
+
+ reset_callback_info(&c);
+#endif
+}
+END_TEST
+
+START_TEST(test_buffering)
+{
+ RendererInfo s;
+ CallbackInfo c;
+ BufferingInfo b;
+ GstBus *bus = NULL;
+ GstMessage *message = NULL;
+
+ /* Initialize callback info */
+ c.err_msg = NULL;
+ c.error_signal_expected = FALSE;
+ c.error_signal_received = NULL;
+ c.property_expected = NULL;
+ c.property_received = NULL;
+ b.requested = FALSE;
+ b.received = FALSE;
+ b.value = 0.0;
+
+ /* Connect to renderer signals */
+ g_signal_connect(g_gst_renderer, "error",
+ G_CALLBACK(error_cb),
+ &c);
+ g_signal_connect(g_gst_renderer, "state-changed",
+ G_CALLBACK(state_changed_cb),
+ &s);
+ g_signal_connect(g_gst_renderer, "buffering-info",
+ G_CALLBACK(buffering_info_cb),
+ &b);
+
+ /* --- Get initial status --- */
+
+ reset_callback_info(&c);
+
+ g_debug("get status...");
+ mafw_renderer_get_status(g_gst_renderer, status_cb, &s);
+
+ /* --- Play object --- */
+
+ reset_callback_info(&c);
+
+ gchar *objectid = get_sample_clip_objectid(SAMPLE_AUDIO_CLIP);
+ g_debug("play_object... %s", objectid);
+ mafw_renderer_play_object(g_gst_renderer, objectid, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "playing an object", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Transitioning, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object",
+ "Transitioning", s.state);
+ }
+
+ if (wait_for_state(&s, Playing, wait_tout_val) == FALSE) {
+ fail(state_err_msg, "mafw_renderer_play_object", "Playing",
+ s.state);
+ }
+
+ g_free(objectid);
+
+ /* --- Buffering info --- */
+
+ b.requested = TRUE;
+
+ bus = MAFW_GST_RENDERER(g_gst_renderer)->worker->bus;
+ fail_if(bus == NULL, "No GstBus");
+
+ message = gst_message_new_buffering(NULL, 50);
+ gst_bus_post(bus, message);
+
+ if (wait_for_buffering(&b, wait_tout_val) == FALSE) {
+ fail("Expected buffering message but not received");
+ }
+
+ fail_if(b.value != 0.5, "Expected buffering 0.50 and received %1.2f",
+ b.value);
+
+ b.requested = FALSE;
+ b.received = FALSE;
+ b.value = 0;
+
+ /* --- Buffering info --- */
+
+ b.requested = TRUE;
+
+ message = gst_message_new_buffering(NULL, 100);
+ gst_bus_post(bus, message);
+
+ if (wait_for_buffering(&b, wait_tout_val) == FALSE) {
+ fail("Expected buffering message but not received");
+ }
+
+ fail_if(b.value != 1.0, "Expected buffering 1.00 and received %1.2f",
+ b.value);
+
+ b.requested = FALSE;
+ b.received = FALSE;
+ b.value = 0;
+
+ /* --- Stop --- */
+
+ reset_callback_info(&c);
+
+ g_debug("stop...");
+ mafw_renderer_stop(g_gst_renderer, playback_cb, &c);
+
+ if (wait_for_callback(&c, wait_tout_val)) {
+ if (c.error)
+ fail(callback_err_msg, "stopping", c.err_code,
+ c.err_msg);
+ } else {
+ fail(no_callback_msg);
+ }
+
+ if (wait_for_state(&s, Stopped, wait_tout_val) == FALSE) {
+ fail(state_err_msg,"mafw_renderer_stop", "Stopped", s.state);
+ }
+}
+END_TEST
+
+/*----------------------------------------------------------------------------
+ Suit creation
+ ----------------------------------------------------------------------------*/
+
+SRunner * configure_tests(void)
+{
+ SRunner *sr = NULL;
+ Suite *s = NULL;
+ const gchar *tout = g_getenv("WAIT_TIMEOUT");
+
+ if (!tout)
+ wait_tout_val = DEFAULT_WAIT_TOUT;
+ else
+ {
+ wait_tout_val = (gint)strtol(tout, NULL, 0);
+ if (wait_tout_val<=0)
+ wait_tout_val = DEFAULT_WAIT_TOUT;
+ }
+
+ checkmore_wants_dbus();
+ mafw_log_init(":error");
+ /* Create the suite */
+ s = suite_create("MafwGstRenderer");
+
+ /* Create test cases */
+ TCase *tc1 = tcase_create("Playback");
+
+ /* Create unit tests for test case "Playback" */
+ tcase_add_checked_fixture(tc1, fx_setup_dummy_gst_renderer,
+ fx_teardown_dummy_gst_renderer);
+if (1) tcase_add_test(tc1, test_basic_playback);
+if (1) tcase_add_test(tc1, test_playlist_playback);
+if (1) tcase_add_test(tc1, test_repeat_mode_playback);
+if (1) tcase_add_test(tc1, test_gst_renderer_mode);
+if (1) tcase_add_test(tc1, test_update_stats);
+if (1) tcase_add_test(tc1, test_play_state);
+if (1) tcase_add_test(tc1, test_pause_state);
+if (1) tcase_add_test(tc1, test_stop_state);
+if (1) tcase_add_test(tc1, test_transitioning_state);
+if (1) tcase_add_test(tc1, test_state_class);
+if (1) tcase_add_test(tc1, test_playlist_iterator);
+if (1) tcase_add_test(tc1, test_video);
+if (1) tcase_add_test(tc1, test_media_art);
+if (1) tcase_add_test(tc1, test_properties_management);
+if (1) tcase_add_test(tc1, test_buffering);
+
+ tcase_set_timeout(tc1, 0);
+
+ suite_add_tcase(s, tc1);
+
+ /* Create srunner object with the test suite */
+ sr = srunner_create(s);
+
+ return sr;
+}
+
+/* vi: set noexpandtab ts=8 sw=8 cino=t0,(0: */