Source tree moved to mafw-gst-subtitles-renderer directory.
[mafwsubrenderer] / mafw-gst-subtitles-renderer / tests / mafw-test-player.c
diff --git a/mafw-gst-subtitles-renderer/tests/mafw-test-player.c b/mafw-gst-subtitles-renderer/tests/mafw-test-player.c
new file mode 100644 (file)
index 0000000..a340672
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * 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
+ *
+ */
+
+/*
+ * test.c
+ *
+ * Test of the playback system
+ *
+ * Copyright (C) 2007 Nokia Corporation
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <termios.h>
+
+#include "mafw-gst-renderer.h"
+#include <libmafw/mafw-metadata.h>
+#include <libmafw/mafw-registry.h>
+
+MafwGstRenderer *gst_renderer;
+GMainLoop *loop;
+static struct termios tio_orig;
+guint seek_delta = 2;
+gfloat volume = 0.7;
+gboolean muted = FALSE;
+
+
+/**
+ *@time: how long to wait, in microsecs
+ *
+ */
+int kbhit (int time) {
+       fd_set rfds;
+       struct timeval tv;
+       int retval;
+       char c;
+
+       FD_ZERO (&rfds);
+       FD_SET (0, &rfds);
+
+       /* Wait up to 'time' microseconds. */
+       tv.tv_sec=time / 1000;
+       tv.tv_usec = (time % 1000)*1000;
+
+       retval=select (1, &rfds, NULL, NULL, &tv);
+       if(retval < 1) return -1;
+       retval = read (0, &c, 1);
+       if (retval < 1) return -1;
+       return (int) c;
+}
+
+
+/**
+ *
+ *
+ */
+static void raw_kb_enable (void) {
+       struct termios tio_new;
+       tcgetattr(0, &tio_orig);
+       
+       tio_new = tio_orig;
+       tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
+       tio_new.c_cc[VMIN] = 1;
+       tio_new.c_cc[VTIME] = 0;
+       tcsetattr (0, TCSANOW, &tio_new);
+}
+
+static void raw_kb_disable (void)
+{
+       tcsetattr (0,TCSANOW, &tio_orig);
+}
+
+static void get_position_cb(MafwRenderer* self, gint position, gpointer user_data,
+                           const GError* error)
+{
+       guint* rpos = (guint*) user_data;
+       g_return_if_fail(rpos != NULL);
+
+       *rpos = position;
+}
+
+/**
+ *
+ *
+ */
+static gboolean idle_cb (gpointer data)
+{
+       gboolean ret = TRUE;
+       GError *error = NULL;
+
+       int c = kbhit (0);
+       if (c == -1) {
+               usleep (10 * 1000);
+               return TRUE;
+       }
+
+       printf ("c = %d\n", c);
+       /* '.' key */
+       if (c == 46) {
+               printf ("Seeking %d seconds forward\n", seek_delta);
+               gint pos = 0;
+
+               mafw_gst_renderer_get_position(MAFW_RENDERER(gst_renderer),
+                                            get_position_cb, &pos);
+
+               printf ("  Position before seek: %d\n", pos);
+               pos += seek_delta;
+               mafw_gst_renderer_set_position(MAFW_RENDERER(gst_renderer), pos,
+                                            NULL, NULL);
+
+               mafw_gst_renderer_get_position(MAFW_RENDERER(gst_renderer),
+                                            get_position_cb, &pos);
+
+               printf ("  Position after seek: %d\n", pos);
+       }
+       /* ',' key */
+       else if (c == 44) {
+               printf ("Seeking %d seconds backwards\n", seek_delta);
+               gint pos = 0;
+
+               mafw_gst_renderer_get_position(MAFW_RENDERER(gst_renderer),
+                                            get_position_cb, &pos);
+
+               printf ("  Position before seek: %d\n", pos);
+               pos -= seek_delta;
+               mafw_gst_renderer_set_position(MAFW_RENDERER(gst_renderer), pos,
+                                            NULL, NULL);
+
+               mafw_gst_renderer_get_position(MAFW_RENDERER(gst_renderer),
+                                            get_position_cb, &pos);
+
+               printf ("  Position after seek: %d\n", pos);
+       }
+       /* '' (space) key */
+       else if (c == 32) {
+               if (gst_renderer->current_state == Playing) {
+                       printf ("Pausing...\n");
+                       mafw_gst_renderer_pause(MAFW_RENDERER (gst_renderer), NULL, NULL);
+               }
+               else if (gst_renderer->current_state == Paused) {
+                       printf ("Resuming...\n");
+                       mafw_gst_renderer_resume(MAFW_RENDERER (gst_renderer), NULL, NULL);
+               }
+       }
+       /* 'p' key */
+       else if (c == 112) {
+               printf ("Playing...\n");
+               mafw_gst_renderer_play (MAFW_RENDERER (gst_renderer), NULL, NULL);
+       }
+       /* 's' key */
+       else if (c == 115) {
+               printf ("Stopping\n");
+               mafw_gst_renderer_stop (MAFW_RENDERER (gst_renderer), NULL, NULL);
+       }
+       /* 'g' key */
+       else if (c == 103) {
+               printf ("Getting position\n");
+               gint pos = 0;
+
+               mafw_gst_renderer_get_position(MAFW_RENDERER(gst_renderer),
+                                            get_position_cb, &pos);
+
+               printf ("Current position: %d\n", pos);
+       }
+       /* '+' key */
+       else if (c == 43) {
+               volume += 0.1;
+               printf ("Increasing volume to %lf\n", volume);
+               mafw_extension_set_property_float(MAFW_EXTENSION(gst_renderer),
+                                            "volume", volume);
+       }
+       /* '-' key */
+       else if (c == 45) {
+               volume -= 0.1;
+               printf ("Decreasing volume to %lf\n", volume);
+               mafw_extension_set_property_float(MAFW_EXTENSION(gst_renderer),
+                                            "volume", volume);
+       }
+       /* 'm' key */
+       else if (c == 109) {
+               muted = !muted;
+               printf ("(Un)Muting...\n");
+               mafw_extension_set_property_boolean(MAFW_EXTENSION(gst_renderer),
+                                              "mute", muted);
+       }
+       /* '?' key */
+       else if (c == 63) {
+               printf ("COMMANDS:\n" \
+                       "    s\t\tStop\n" \
+                       "    p\t\tPlay\n" \
+                       "    space\tPause/Resume\n" \
+                       "    +\t\tVolume up\n" \
+                       "    -\t\tVolume down\n" \
+                       "    m\t\tMute/Unmute\n" \
+                       "    .\t\tSeek forward 2 sec\n" \
+                       "    ,\t\tSeek backwards 2 sec\n" \
+                       "    q\t\tQuit\n");
+       }
+       /* 'q' key */
+       else if (c == 113) {
+               printf ("QUIT\n");
+               mafw_gst_renderer_stop (MAFW_RENDERER (gst_renderer), NULL, NULL);
+               raw_kb_disable ();
+               g_main_loop_quit (loop);
+               ret = FALSE;
+       }
+       if (error) {
+               printf ("Error occured during the operation\n");
+               g_error_free (error);
+       }
+       return ret;
+}
+
+
+/**
+ *
+ *
+ */
+static void metadata_changed (MafwGstRenderer *gst_renderer,
+                             GHashTable *metadata,
+                             gpointer user_data)
+{
+       g_print("Metadata changed:\n");
+       mafw_metadata_print (metadata, NULL);
+}
+
+
+/**
+ *
+ *
+ */
+static void buffering_cb (MafwGstRenderer *gst_renderer,
+                         gfloat percentage,
+                         gpointer user_data)
+{
+       g_print("Buffering: %f\n", percentage);
+}
+
+static void play_uri_cb(MafwRenderer* renderer, gpointer user_data, const GError* error)
+{
+       if (error != NULL) {
+               printf("Unable to play: %s\n", error->message);
+               exit(1);
+       }
+}
+
+/**
+ *
+ *
+ */
+gint main(gint argc, gchar ** argv)
+{
+       MafwRegistry *registry;
+       
+       g_type_init();
+       gst_init (&argc, &argv);
+
+       if (argc != 2) {
+               g_print("Usage: mafw-test-player <media-uri>\n");
+               exit(1);
+       }
+
+       raw_kb_enable();
+       
+       registry = MAFW_REGISTRY(mafw_registry_get_instance());
+       gst_renderer = MAFW_GST_RENDERER(mafw_gst_renderer_new(registry));
+       g_signal_connect (G_OBJECT (gst_renderer),
+                         "metadata_changed",
+                         G_CALLBACK (metadata_changed),
+                         gst_renderer);
+
+       g_signal_connect (G_OBJECT (gst_renderer),
+                         "buffering_info",
+                         G_CALLBACK (buffering_cb),
+                         gst_renderer);
+
+       mafw_renderer_play_uri(MAFW_RENDERER (gst_renderer), argv[1], play_uri_cb,
+                           NULL);
+       
+       loop = mafw_gst_renderer_get_loop(gst_renderer);
+
+       g_idle_add (idle_cb, NULL);
+       g_main_loop_run (loop);
+
+       g_object_unref (G_OBJECT (gst_renderer));
+       return 0;
+}