X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=mafw-gst-subtitles-renderer%2Ftests%2Fmafw-test-player.c;fp=mafw-gst-subtitles-renderer%2Ftests%2Fmafw-test-player.c;h=a3406721e5a09cc179d288a7a97d0c54d92faa87;hb=be2c98fb83895d10ac44af7b9a9c3e00ca54bf49;hp=0000000000000000000000000000000000000000;hpb=c2bbb2bb3bead80144e2dda3ccd40599e4a2b48d;p=mafwsubrenderer 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 index 0000000..a340672 --- /dev/null +++ b/mafw-gst-subtitles-renderer/tests/mafw-test-player.c @@ -0,0 +1,312 @@ +/* + * This file is a part of MAFW + * + * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved. + * + * Contact: Visa Smolander + * + * 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 +#include +#include +#include +#include +#include + +#include "mafw-gst-renderer.h" +#include +#include + +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 \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; +}