[clutter-gst] Do not use deprecated ClutterMedia.



commit 18388f75f1bb182a3351ae20c9adf26e1fca76d5
Author: Andre Moreira Magalhaes (andrunko) <andre magalhaes collabora co uk>
Date:   Wed Aug 22 13:14:03 2012 -0300

    Do not use deprecated ClutterMedia.
    
    Merge ClutterMedia with ClutterGstPlayer.

 README                                |    6 +-
 build/autotools/Makefile.am.release   |    2 +-
 clutter-gst.doap                      |    7 +-
 clutter-gst/clutter-gst-player.c      |  517 +++++++++++++++++++++++++++++++--
 clutter-gst/clutter-gst-player.h      |   58 +++-
 clutter-gst/clutter-gst-video-actor.c |   17 -
 clutter-gst/clutter-gst-video-sink.c  |    2 +-
 doc/reference/clutter-gst-docs.sgml   |    2 +-
 examples/video-player.c               |   22 +-
 tests/test-start-stop.c               |   26 +-
 10 files changed, 578 insertions(+), 81 deletions(-)
---
diff --git a/README b/README
index fa90160..7525b7f 100644
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ Clutter-GStreamer README
 
 Clutter-Gst is an integration library for using GStreamer with Clutter.
 It provides a GStreamer sink to upload frames to GL and an actor that
-implements the ClutterMedia interface using playbin2.
+implements the ClutterGstPlayer interface using playbin.
 
 Clutter is an open source software library for creating fast, visually
 rich and animated graphical user interfaces. It uses OpenGL for drawing
@@ -20,8 +20,8 @@ installing new plug-ins.
 Clutter-GStreamer requires:
 
   GLib >= 2.18.0
-  Clutter >= 1.4.0
-  GStreamer >= 0.10.20
+  Clutter >= 1.6.0
+  GStreamer >= 0.11.0
 
 Copyright (C) 2006, 2007, 2008  OpenedHand
 Copyright (C) 2009, 2010, 2011 Intel Corporation
diff --git a/build/autotools/Makefile.am.release b/build/autotools/Makefile.am.release
index f7077e6..fb39101 100644
--- a/build/autotools/Makefile.am.release
+++ b/build/autotools/Makefile.am.release
@@ -81,7 +81,7 @@ release-message: $(sha256_file)
        @echo ""
        @echo "Clutter-Gst is an integration library for using GStreamer with Clutter."
        @echo "It provides a GStreamer sink to upload frames to GL and an actor that"
-       @echo "implements the ClutterMedia interface using playbin2."
+       @echo "implements the ClutterGstPlayer interface using playbin."
        @echo ""
        @echo "Clutter-gst depends on:"
        @echo ""
diff --git a/clutter-gst.doap b/clutter-gst.doap
index 8c7a317..9e6e7c5 100644
--- a/clutter-gst.doap
+++ b/clutter-gst.doap
@@ -11,11 +11,8 @@
 
   <shortdesc xml:lang="en">A GStreamer integration library for Clutter</shortdesc>
 
-  <description xml:lang="en">Clutter-Gst is a gstreamer based clutter actor
-    implementing the ClutterMedia interface. It provides video playback on a
-    clutter texture.
-    The library can also be used for its cluttersink Gstreamer element to build
-    more complex pipelines.</description>
+  <description xml:lang="en">Clutter-Gst is an integration library for using
+    GStreamer with Clutter.</description>
 
        <homepage rdf:resource="http://clutter-project.org"; />
        <license rdf:resource="http://usefulinc.com/doap/licenses/lgpl"; />
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c
index 25a10e6..a9c508b 100644
--- a/clutter-gst/clutter-gst-player.c
+++ b/clutter-gst/clutter-gst-player.c
@@ -7,8 +7,13 @@
  *
  * Authored By Damien Lespiau    <damien lespiau intel com>
  *             Lionel Landwerlin <lionel g landwerlin linux intel com>
+ *             Matthew Allum     <mallum openedhand com>
+ *             Emmanuele Bassi   <ebassi linux intel com>
+ *             Andre Moreira Magalhaes <andre magalhaes collabora co uk>
  *
- * Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2006 OpenedHand
+ * Copyright (C) 2009-2011 Intel Corporation
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -34,11 +39,6 @@
  *  sources. Contrary to most interfaces, you don't need to implement
  *  #ClutterGstPlayer. It already provides an implementation/logic
  *  leaving you only tweak a few properties to get the desired behavior.
- *
- * #ClutterGstPlayer extends and implements #ClutterMedia to create
- * enhanced player.
- *
- * #ClutterMedia is available since Clutter 0.2
  */
 
 #ifdef HAVE_CONFIG_H
@@ -66,9 +66,7 @@
 
 typedef ClutterGstPlayerIface       ClutterGstPlayerInterface;
 
-G_DEFINE_INTERFACE_WITH_CODE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJECT,
-                              g_type_interface_add_prerequisite (g_define_type_id,
-                                                                 CLUTTER_TYPE_MEDIA))
+G_DEFINE_INTERFACE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJECT)
 
 #define PLAYER_GET_PRIVATE(player)                              \
   (g_object_get_qdata (G_OBJECT (player),                       \
@@ -88,7 +86,9 @@ G_DEFINE_INTERFACE_WITH_CODE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJEC
 
 enum
 {
-  DOWNLOAD_BUFFERING,
+  EOS_SIGNAL,
+  ERROR_SIGNAL, /* can't be called 'ERROR' otherwise it clashes with wingdi.h */
+  DOWNLOAD_BUFFERING_SIGNAL,
 
   LAST_SIGNAL
 };
@@ -97,7 +97,7 @@ enum
 {
   PROP_0,
 
-  /* ClutterMedia properties */
+  /* ClutterGstPlayer properties */
   PROP_URI,
   PROP_PLAYING,
   PROP_PROGRESS,
@@ -107,8 +107,6 @@ enum
   PROP_CAN_SEEK,
   PROP_BUFFER_FILL,
   PROP_DURATION,
-
-  /* ClutterGstPlayer properties */
   PROP_IDLE,
   PROP_USER_AGENT,
   PROP_SEEK_FLAGS,
@@ -850,7 +848,7 @@ player_buffering_timeout (gpointer data)
   start_d = (gdouble) start / GST_FORMAT_PERCENT_MAX;
   stop_d = (gdouble) stop / GST_FORMAT_PERCENT_MAX;
 
-  g_signal_emit (player, signals[DOWNLOAD_BUFFERING], 0, start_d, stop_d);
+  g_signal_emit (player, signals[DOWNLOAD_BUFFERING_SIGNAL], 0, start_d, stop_d);
 
   /* handle the "virtual stream buffer" and the associated pipeline state.
    * We pause the pipeline until 2s of content is buffered. With the current
@@ -915,7 +913,7 @@ bus_message_error_cb (GstBus           *bus,
   gst_element_set_state (priv->pipeline, GST_STATE_NULL);
 
   gst_message_parse_error (message, &error, NULL);
-  g_signal_emit_by_name (player, "error", error);
+  g_signal_emit (player, signals[ERROR_SIGNAL], 0, error);
   g_error_free (error);
 
   priv->is_idle = TRUE;
@@ -944,7 +942,7 @@ bus_message_eos_cb (GstBus           *bus,
 
   gst_element_set_state (priv->pipeline, GST_STATE_READY);
 
-  g_signal_emit_by_name (player, "eos");
+  g_signal_emit (player, signals[EOS_SIGNAL], 0);
   g_object_notify (G_OBJECT (player), "progress");
 
   gst_element_get_state (priv->pipeline, &state, &pending, 0);
@@ -1565,7 +1563,7 @@ clutter_gst_player_class_init (GObjectClass *object_class)
   object_class->set_property = clutter_gst_player_set_property;
   object_class->get_property = clutter_gst_player_get_property;
 
-  /* Override ClutterMedia's properties */
+  /* Override ClutterGstPlayer's properties */
   g_object_class_override_property (object_class,
                                     PROP_URI, "uri");
   g_object_class_override_property (object_class,
@@ -1586,7 +1584,6 @@ clutter_gst_player_class_init (GObjectClass *object_class)
   g_object_class_override_property (object_class,
                                     PROP_BUFFER_FILL, "buffer-fill");
 
-  /* Override ClutterGstPlayer's properties */
   g_object_class_override_property (object_class,
                                     PROP_IDLE, "idle");
   g_object_class_override_property (object_class,
@@ -2146,6 +2143,127 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
   GParamSpec *pspec;
 
   /**
+   * ClutterGstPlayer:uri:
+   *
+   * The location of a media file, expressed as a valid URI.
+   */
+  pspec = g_param_spec_string ("uri",
+                               "URI",
+                               "URI of a media file",
+                               NULL,
+                               CLUTTER_GST_PARAM_READWRITE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:playing:
+   *
+   * Whether the #ClutterGstPlayer actor is playing.
+   */
+  pspec = g_param_spec_boolean ("playing",
+                                "Playing",
+                                "Whether the player is playing",
+                                FALSE,
+                                CLUTTER_GST_PARAM_READWRITE |
+                                G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:progress:
+   *
+   * The current progress of the playback, as a normalized
+   * value between 0.0 and 1.0.
+   */
+  pspec = g_param_spec_double ("progress",
+                               "Progress",
+                               "Current progress of the playback",
+                               0.0, 1.0, 0.0,
+                               CLUTTER_GST_PARAM_READWRITE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:subtitle-uri:
+   *
+   * The location of a subtitle file, expressed as a valid URI.
+   */
+  pspec = g_param_spec_string ("subtitle-uri",
+                               "Subtitle URI",
+                               "URI of a subtitle file",
+                               NULL,
+                               CLUTTER_GST_PARAM_READWRITE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:subtitle-font-name:
+   *
+   * The font used to display subtitles. The font description has to
+   * follow the same grammar as the one recognized by
+   * pango_font_description_from_string().
+   */
+  pspec = g_param_spec_string ("subtitle-font-name",
+                               "Subtitle Font Name",
+                               "The font used to display subtitles",
+                               NULL,
+                               CLUTTER_GST_PARAM_READWRITE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:audio-volume:
+   *
+   * The volume of the audio, as a normalized value between
+   * 0.0 and 1.0.
+   */
+  pspec = g_param_spec_double ("audio-volume",
+                               "Audio Volume",
+                               "The volume of the audio",
+                               0.0, 1.0, 0.5,
+                               CLUTTER_GST_PARAM_READWRITE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:can-seek:
+   *
+   * Whether the current stream is seekable.
+   */
+  pspec = g_param_spec_boolean ("can-seek",
+                                "Can Seek",
+                                "Whether the current stream is seekable",
+                                FALSE,
+                                CLUTTER_GST_PARAM_READABLE |
+                                G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:buffer-fill:
+   *
+   * The fill level of the buffer for the current stream,
+   * as a value between 0.0 and 1.0.
+   */
+  pspec = g_param_spec_double ("buffer-fill",
+                               "Buffer Fill",
+                               "The fill level of the buffer",
+                               0.0, 1.0, 0.0,
+                               CLUTTER_GST_PARAM_READABLE |
+                               G_PARAM_DEPRECATED);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
+   * ClutterGstPlayer:duration:
+   *
+   * The duration of the current stream, in seconds
+   */
+  pspec = g_param_spec_double ("duration",
+                               "Duration",
+                               "The duration of the stream, in seconds",
+                               0, G_MAXDOUBLE, 0,
+                               CLUTTER_GST_PARAM_READABLE);
+  g_object_interface_install_property (iface, pspec);
+
+  /**
    * ClutterGstPlayer:idle:
    *
    * Whether the #ClutterGstPlayer is in idle mode.
@@ -2247,6 +2365,37 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
   /* Signals */
 
   /**
+   * ClutterGstPlayer::eos:
+   * @media: the #ClutterGstPlayer instance that received the signal
+   *
+   * The ::eos signal is emitted each time the media stream ends.
+   */
+  signals[EOS_SIGNAL] =
+    g_signal_new ("eos",
+                  CLUTTER_GST_TYPE_PLAYER,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (ClutterGstPlayerIface, eos),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+  /**
+   * ClutterGstPlayer::error:
+   * @media: the #ClutterGstPlayer instance that received the signal
+   * @error: the #GError
+   *
+   * The ::error signal is emitted each time an error occurred.
+   */
+  signals[ERROR_SIGNAL] =
+    g_signal_new ("error",
+                  CLUTTER_GST_TYPE_PLAYER,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (ClutterGstPlayerIface, error),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__BOXED,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_ERROR);
+
+  /**
    * ClutterGstPlayer::download-buffering:
    * @player: the #ClutterGstPlayer instance that received the signal
    * @start: start position of the buffering
@@ -2257,7 +2406,7 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
    *
    * Since: 1.4
    */
-  signals[DOWNLOAD_BUFFERING] =
+  signals[DOWNLOAD_BUFFERING_SIGNAL] =
     g_signal_new ("download-buffering",
                   CLUTTER_GST_TYPE_PLAYER,
                   G_SIGNAL_RUN_LAST,
@@ -2303,6 +2452,122 @@ clutter_gst_player_get_pipeline (ClutterGstPlayer *player)
 }
 
 /**
+ * clutter_gst_player_set_uri:
+ * @player: a #ClutterGstPlayer
+ * @uri: the URI of the media stream
+ *
+ * Sets the URI of @player to @uri.
+ */
+void
+clutter_gst_player_set_uri (ClutterGstPlayer *player,
+                            const gchar      *uri)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "uri", uri, NULL);
+}
+
+/**
+ * clutter_gst_player_get_uri:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the URI from @player.
+ *
+ * Return value: the URI of the media stream. Use g_free()
+ *   to free the returned string
+ */
+gchar *
+clutter_gst_player_get_uri (ClutterGstPlayer *player)
+{
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+  g_object_get (G_OBJECT (player), "uri", &retval, NULL);
+
+  return retval;
+}
+
+/**
+ * clutter_gst_player_set_filename:
+ * @player: a #ClutterGstPlayer
+ * @filename: A filename
+ *
+ * Sets the source of @player using a file path.
+ */
+void
+clutter_gst_player_set_filename (ClutterGstPlayer *player,
+                                 const gchar      *filename)
+{
+  gchar *uri;
+  GError *uri_error = NULL;
+
+  if (!g_path_is_absolute (filename))
+    {
+      gchar *abs_path;
+
+      abs_path = g_build_filename (g_get_current_dir (), filename, NULL);
+      uri = g_filename_to_uri (abs_path, NULL, &uri_error);
+      g_free (abs_path);
+    }
+  else
+    uri = g_filename_to_uri (filename, NULL, &uri_error);
+
+  if (uri_error)
+    {
+      g_signal_emit (player, signals[ERROR_SIGNAL], 0, uri_error);
+      g_error_free (uri_error);
+      return;
+    }
+
+  clutter_gst_player_set_uri (player, uri);
+
+  g_free (uri);
+}
+
+/**
+ * clutter_gst_player_set_playing:
+ * @player: a #ClutterGstPlayer
+ * @playing: %TRUE to start playing
+ *
+ * Starts or stops playing of @player.
+ *
+ * The implementation might be asynchronous, so the way to know whether
+ * the actual playing state of the @player is to use the #GObject::notify
+ * signal on the #ClutterGstPlayer:playing property and then retrieve the
+ * current state with clutter_gst_player_is_playing(). ClutterGstVideoActor
+ * in clutter-gst is an example of such an asynchronous implementation.
+ */
+void
+clutter_gst_player_set_playing (ClutterGstPlayer *player,
+                                gboolean          playing)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "playing", playing, NULL);
+}
+
+/**
+ * clutter_gst_player_is_playing:
+ * @player: A #ClutterGstPlayer object
+ *
+ * Retrieves the playing status of @player.
+ *
+ * Return value: %TRUE if playing, %FALSE if stopped.
+ */
+gboolean
+clutter_gst_player_is_playing (ClutterGstPlayer *player)
+{
+  gboolean is_playing = FALSE;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), FALSE);
+
+  g_object_get (G_OBJECT (player), "playing", &is_playing, NULL);
+
+  return is_playing;
+}
+
+/**
  * clutter_gst_player_get_user_agent:
  * @player: a #ClutterGstPlayer
  *
@@ -2439,6 +2704,62 @@ clutter_gst_player_set_buffering_mode (ClutterGstPlayer        *player,
 }
 
 /**
+ * clutter_gst_player_get_buffer_fill:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the amount of the stream that is buffered.
+ *
+ * Return value: the fill level, between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_buffer_fill (ClutterGstPlayer *player)
+{
+  gdouble retval = 0.0;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+  g_object_get (G_OBJECT (player), "buffer-fill", &retval, NULL);
+
+  return retval;
+}
+
+/**
+ * clutter_gst_player_set_audio_volume:
+ * @player: a #ClutterGstPlayer
+ * @volume: the volume as a double between 0.0 and 1.0
+ *
+ * Sets the playback volume of @player to @volume.
+ */
+void
+clutter_gst_player_set_audio_volume (ClutterGstPlayer *player,
+                                     gdouble           volume)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "audio-volume", volume, NULL);
+}
+
+/**
+ * clutter_gst_player_get_audio_volume:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the playback volume of @player.
+ *
+ * Return value: The playback volume between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_audio_volume (ClutterGstPlayer *player)
+{
+  gdouble retval = 0.0;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0.0);
+
+  g_object_get (G_OBJECT (player), "audio-volume", &retval, NULL);
+
+  return retval;
+}
+
+/**
  * clutter_gst_player_get_audio_streams:
  * @player: a #ClutterGstPlayer
  *
@@ -2510,6 +2831,87 @@ clutter_gst_player_set_audio_stream (ClutterGstPlayer *player,
 }
 
 /**
+ * clutter_gst_player_set_subtitle_uri:
+ * @player: a #ClutterGstPlayer
+ * @uri: the URI of a subtitle file
+ *
+ * Sets the location of a subtitle file to display while playing @player.
+ */
+void
+clutter_gst_player_set_subtitle_uri (ClutterGstPlayer *player,
+                                     const char       *uri)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "subtitle-uri", uri, NULL);
+}
+
+/**
+ * clutter_gst_player_get_subtitle_uri:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the URI of the subtitle file in use.
+ *
+ * Return value: the URI of the subtitle file. Use g_free()
+ *   to free the returned string
+ */
+gchar *
+clutter_gst_player_get_subtitle_uri (ClutterGstPlayer *player)
+{
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+  g_object_get (G_OBJECT (player), "subtitle-uri", &retval, NULL);
+
+  return retval;
+}
+
+/**
+ * clutter_gst_player_set_subtitle_font_name:
+ * @player: a #ClutterGstPlayer
+ * @font_name: a font name, or %NULL to set the default font name
+ *
+ * Sets the font used by the subtitle renderer. The @font_name string must be
+ * either %NULL, which means that the default font name of the underlying
+ * implementation will be used; or must follow the grammar recognized by
+ * pango_font_description_from_string() like:
+ *
+ * |[
+ *   clutter_gst_player_set_subtitle_font_name (player, "Sans 24pt");
+ * ]|
+ */
+void
+clutter_gst_player_set_subtitle_font_name (ClutterGstPlayer *player,
+                                      const char   *font_name)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "subtitle-font-name", font_name, NULL);
+}
+
+/**
+ * clutter_gst_player_get_subtitle_font_name:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the font name currently used.
+ *
+ * Return value: a string containing the font name. Use g_free()
+ *   to free the returned string
+ */
+gchar *
+clutter_gst_player_get_subtitle_font_name (ClutterGstPlayer *player)
+{
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+  g_object_get (G_OBJECT (player), "subtitle-font-name", &retval, NULL);
+
+  return retval;
+}
+
+/**
  * clutter_gst_player_get_subtitle_tracks:
  * @player: a #ClutterGstPlayer
  *
@@ -2605,6 +3007,26 @@ clutter_gst_player_get_idle (ClutterGstPlayer *player)
 }
 
 /**
+ * clutter_gst_player_get_can_seek:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves whether @player is seekable or not.
+ *
+ * Return value: %TRUE if @player can seek, %FALSE otherwise.
+ */
+gboolean
+clutter_gst_player_get_can_seek (ClutterGstPlayer *player)
+{
+  gboolean retval = FALSE;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), FALSE);
+
+  g_object_get (G_OBJECT (player), "can-seek", &retval, NULL);
+
+  return retval;
+}
+
+/**
  * clutter_gst_player_get_in_seek:
  * @player: a #ClutterGstPlayer
  *
@@ -2625,3 +3047,60 @@ clutter_gst_player_get_in_seek (ClutterGstPlayer *player)
 
   return iface->get_in_seek (player);
 }
+
+/**
+ * clutter_gst_player_set_progress:
+ * @player: a #ClutterGstPlayer
+ * @progress: the progress of the playback, between 0.0 and 1.0
+ *
+ * Sets the playback progress of @player. The @progress is
+ * a normalized value between 0.0 (begin) and 1.0 (end).
+ */
+void
+clutter_gst_player_set_progress (ClutterGstPlayer *player,
+                                 gdouble           progress)
+{
+  g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+  g_object_set (G_OBJECT (player), "progress", progress, NULL);
+}
+
+/**
+ * clutter_gst_player_get_progress:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the playback progress of @player.
+ *
+ * Return value: the playback progress, between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_progress (ClutterGstPlayer *player)
+{
+  gdouble retval = 0.0;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+  g_object_get (G_OBJECT (player), "progress", &retval, NULL);
+
+  return retval;
+}
+
+/**
+ * clutter_gst_player_get_duration:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the duration of the media stream that @player represents.
+ *
+ * Return value: the duration of the media stream, in seconds
+ */
+gdouble
+clutter_gst_player_get_duration (ClutterGstPlayer *player)
+{
+  gdouble retval = 0;
+
+  g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+  g_object_get (G_OBJECT (player), "duration", &retval, NULL);
+
+  return retval;
+}
diff --git a/clutter-gst/clutter-gst-player.h b/clutter-gst/clutter-gst-player.h
index 02d45cb..1ab9ff1 100644
--- a/clutter-gst/clutter-gst-player.h
+++ b/clutter-gst/clutter-gst-player.h
@@ -7,8 +7,14 @@
  *
  * Authored By Damien Lespiau    <damien lespiau intel com>
  *             Lionel Landwerlin <lionel g landwerlin linux intel com>
+ *             Matthew Allum     <mallum openedhand com>
+ *             Emmanuele Bassi   <ebassi linux intel com>
+ *             Andre Moreira Magalhaes <andre magalhaes collabora co uk>
  *
+ * Copyright (C) 2006 OpenedHand
+ * Copyright (C) 2009-2011 Intel Corporation
  * Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -135,8 +141,10 @@ struct _ClutterGstPlayerIface
   void (* download_buffering)  (ClutterGstPlayer *player,
                                 gdouble           start,
                                 gdouble           stop);
-  void (* _clutter_reserved2)  (void);
-  void (* _clutter_reserved3)  (void);
+  void (* eos)                 (ClutterGstPlayer *player);
+  void (* error)               (ClutterGstPlayer *player,
+                                const GError *error);
+
   void (* _clutter_reserved4)  (void);
   void (* _clutter_reserved5)  (void);
   void (* _clutter_reserved6)  (void);
@@ -151,27 +159,50 @@ GType clutter_gst_player_get_type (void) G_GNUC_CONST;
 void                      clutter_gst_player_class_init          (GObjectClass *object_class);
 
 gboolean                  clutter_gst_player_init                (ClutterGstPlayer        *player);
-void                      clutter_gst_player_deinit               (ClutterGstPlayer *player);
+void                      clutter_gst_player_deinit              (ClutterGstPlayer        *player);
+
+GstElement *              clutter_gst_player_get_pipeline        (ClutterGstPlayer        *player);
+
+void                      clutter_gst_player_set_uri             (ClutterGstPlayer        *player,
+                                                                  const gchar             *uri);
+gchar *                   clutter_gst_player_get_uri             (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_filename        (ClutterGstPlayer        *player,
+                                                                  const gchar             *filename);
 
-GstElement *             clutter_gst_player_get_pipeline        (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_playing         (ClutterGstPlayer        *player,
+                                                                  gboolean                 playing);
+gboolean                  clutter_gst_player_is_playing          (ClutterGstPlayer        *player);
 
-gchar *                          clutter_gst_player_get_user_agent      (ClutterGstPlayer        *player);
-void                     clutter_gst_player_set_user_agent      (ClutterGstPlayer        *player,
+
+gchar *                   clutter_gst_player_get_user_agent      (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_user_agent      (ClutterGstPlayer        *player,
                                                                   const gchar             *user_agent);
 
-ClutterGstSeekFlags      clutter_gst_player_get_seek_flags      (ClutterGstPlayer        *player);
-void                     clutter_gst_player_set_seek_flags      (ClutterGstPlayer        *player,
+ClutterGstSeekFlags       clutter_gst_player_get_seek_flags      (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_seek_flags      (ClutterGstPlayer        *player,
                                                                   ClutterGstSeekFlags      flags);
 
-ClutterGstBufferingMode          clutter_gst_player_get_buffering_mode  (ClutterGstPlayer        *player);
-void                     clutter_gst_player_set_buffering_mode  (ClutterGstPlayer        *player,
+ClutterGstBufferingMode   clutter_gst_player_get_buffering_mode  (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_buffering_mode  (ClutterGstPlayer        *player,
                                                                   ClutterGstBufferingMode  mode);
+gdouble                   clutter_gst_player_get_buffer_fill     (ClutterGstPlayer        *player);
 
+void                      clutter_gst_player_set_audio_volume    (ClutterGstPlayer        *player,
+                                                                  gdouble                  volume);
+gdouble                   clutter_gst_player_get_audio_volume    (ClutterGstPlayer        *player);
 GList *                   clutter_gst_player_get_audio_streams   (ClutterGstPlayer        *player);
 gint                      clutter_gst_player_get_audio_stream    (ClutterGstPlayer        *player);
 void                      clutter_gst_player_set_audio_stream    (ClutterGstPlayer        *player,
                                                                   gint                     index_);
 
+void                      clutter_gst_player_set_subtitle_uri    (ClutterGstPlayer        *player,
+                                                                  const gchar             *uri);
+gchar *                   clutter_gst_player_get_subtitle_uri    (ClutterGstPlayer        *player);
+void                      clutter_gst_player_set_subtitle_font_name
+                                                                 (ClutterGstPlayer        *player,
+                                                                  const char              *font_name);
+gchar *                   clutter_gst_player_get_subtitle_font_name
+                                                                 (ClutterGstPlayer        *player);
 GList *                   clutter_gst_player_get_subtitle_tracks (ClutterGstPlayer       *player);
 gint                      clutter_gst_player_get_subtitle_track  (ClutterGstPlayer       *player);
 void                      clutter_gst_player_set_subtitle_track  (ClutterGstPlayer       *player,
@@ -179,8 +210,15 @@ void                      clutter_gst_player_set_subtitle_track  (ClutterGstPlay
 
 gboolean                  clutter_gst_player_get_idle            (ClutterGstPlayer        *player);
 
+gboolean                  clutter_gst_player_get_can_seek        (ClutterGstPlayer        *player);
 gboolean                  clutter_gst_player_get_in_seek         (ClutterGstPlayer        *player);
 
+
+void                      clutter_gst_player_set_progress        (ClutterGstPlayer        *player,
+                                                                  gdouble                  progress);
+gdouble                   clutter_gst_player_get_progress        (ClutterGstPlayer        *player);
+gdouble                   clutter_gst_player_get_duration        (ClutterGstPlayer        *player);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_GST_PLAYER_H__ */
diff --git a/clutter-gst/clutter-gst-video-actor.c b/clutter-gst/clutter-gst-video-actor.c
index baf7609..242ef4a 100644
--- a/clutter-gst/clutter-gst-video-actor.c
+++ b/clutter-gst/clutter-gst-video-actor.c
@@ -56,36 +56,19 @@
 #include "clutter-gst-player.h"
 #include "clutter-gst-private.h"
 
-/*
- * FIXME:
- * - Remove implementation of ClutterMedia which requires updating ClutterGstPlayer.
- */
-
 struct _ClutterGstVideoActorPrivate
 {
 };
 
-static void clutter_gst_video_actor_media_init (ClutterMediaIface *iface);
 static void clutter_gst_video_actor_player_init (ClutterGstPlayerIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (ClutterGstVideoActor,
                          clutter_gst_video_actor,
                          CLUTTER_GST_TYPE_ACTOR,
-                         G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_MEDIA,
-                                                clutter_gst_video_actor_media_init)
                          G_IMPLEMENT_INTERFACE (CLUTTER_GST_TYPE_PLAYER,
                                                 clutter_gst_video_actor_player_init));
 
 /*
- * ClutterMedia implementation
- */
-
-static void
-clutter_gst_video_actor_media_init (ClutterMediaIface *iface)
-{
-}
-
-/*
  * ClutterGstPlayer implementation
  */
 
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index 2264841..7894209 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -1583,7 +1583,7 @@ clutter_gst_video_sink_class_init (ClutterGstVideoSinkClass * klass)
    *
    * This is the actor the video is decoded into. It can be any
    * #ClutterGstActor, however Cluter-Gst has a handy subclass,
-   * #ClutterGstVideoActor, that implements the #ClutterMedia
+   * #ClutterGstVideoActor, that implements the #ClutterGstPlayer
    * interface.
    */
   pspec = g_param_spec_object ("actor",
diff --git a/doc/reference/clutter-gst-docs.sgml b/doc/reference/clutter-gst-docs.sgml
index 80fe1f7..b350bda 100644
--- a/doc/reference/clutter-gst-docs.sgml
+++ b/doc/reference/clutter-gst-docs.sgml
@@ -48,7 +48,7 @@
   <chapter>
     <title>Clutter Gst Overview</title>
 
-    <para>Clutter-GStreamer provides a ClutterMedia interface implementation
+    <para>Clutter-GStreamer provides a player interface implementation
     using GStreamer for basic video and audio playback.</para>
 
   </chapter>
diff --git a/examples/video-player.c b/examples/video-player.c
index af29d2c..11645f8 100644
--- a/examples/video-player.c
+++ b/examples/video-player.c
@@ -163,7 +163,7 @@ toggle_pause_state (VideoApp *app)
 
   if (app->paused)
     {
-      clutter_media_set_playing (CLUTTER_MEDIA(app->vactor),
+      clutter_gst_player_set_playing (CLUTTER_GST_PLAYER(app->vactor),
                                  TRUE);
       app->paused = FALSE;
       clutter_actor_hide (app->control_play);
@@ -171,7 +171,7 @@ toggle_pause_state (VideoApp *app)
     }
   else
     {
-      clutter_media_set_playing (CLUTTER_MEDIA(app->vactor),
+      clutter_gst_player_set_playing (CLUTTER_GST_PLAYER(app->vactor),
                                  FALSE);
       app->paused = TRUE;
       clutter_actor_hide (app->control_pause);
@@ -232,7 +232,7 @@ input_cb (ClutterStage *stage,
 
               progress = (gdouble) dist / SEEK_W;
 
-              clutter_media_set_progress (CLUTTER_MEDIA (app->vactor),
+              clutter_gst_player_set_progress (CLUTTER_GST_PLAYER (app->vactor),
                                           progress);
             }
         }
@@ -370,8 +370,8 @@ tick (GObject      *object,
       GParamSpec   *pspec,
       VideoApp     *app)
 {
-  ClutterMedia *vactor = CLUTTER_MEDIA (object);
-  gdouble progress = clutter_media_get_progress (vactor);
+  ClutterGstPlayer *vactor = CLUTTER_GST_PLAYER (object);
+  gdouble progress = clutter_gst_player_get_progress (vactor);
 
   clutter_actor_set_size (app->control_seekbar,
                           progress * SEEK_W,
@@ -379,13 +379,13 @@ tick (GObject      *object,
 }
 
 static void
-on_video_actor_eos (ClutterMedia *media,
-                      VideoApp     *app)
+on_video_actor_eos (ClutterGstPlayer *player,
+                    VideoApp         *app)
 {
   if (opt_loop)
     {
-      clutter_media_set_progress (media, 0.0);
-      clutter_media_set_playing (media, TRUE);
+      clutter_gst_player_set_progress (player, 0.0);
+      clutter_gst_player_set_playing (player, TRUE);
     }
 }
 
@@ -509,7 +509,7 @@ main (int argc, char *argv[])
                           G_CALLBACK (size_change), app);
 
   /* Load up out video actor */
-  clutter_media_set_filename (CLUTTER_MEDIA (app->vactor), argv[1]);
+  clutter_gst_player_set_filename (CLUTTER_GST_PLAYER (app->vactor), argv[1]);
 
   /* Set up things so that a visualisation is played if there's no video */
   pipe = clutter_gst_player_get_pipeline (CLUTTER_GST_PLAYER (app->vactor));
@@ -605,7 +605,7 @@ main (int argc, char *argv[])
                     "notify::progress", G_CALLBACK (tick),
                     app);
 
-  clutter_media_set_playing (CLUTTER_MEDIA (app->vactor), TRUE);
+  clutter_gst_player_set_playing (CLUTTER_GST_PLAYER (app->vactor), TRUE);
 
   clutter_actor_show (stage);
 
diff --git a/tests/test-start-stop.c b/tests/test-start-stop.c
index d969c39..5908e4e 100644
--- a/tests/test-start-stop.c
+++ b/tests/test-start-stop.c
@@ -66,7 +66,7 @@ size_change (ClutterActor   *actor,
 }
 
 void
-on_error (ClutterMedia *media)
+on_error (ClutterGstPlayer *player)
 {
   g_print ("error\n");
   clutter_main_quit ();
@@ -76,17 +76,17 @@ gboolean
 test (gpointer data)
 {
   static int count = 1;
-  static ClutterMedia *media = NULL;
+  static ClutterGstPlayer *player = NULL;
   static char *uri[2] = {NULL, NULL};
   const char *playing_uri = NULL;
 
   /* Check until we get video playing */
-  if (!clutter_media_get_playing (CLUTTER_MEDIA (data)))
+  if (!clutter_gst_player_is_playing (CLUTTER_GST_PLAYER (data)))
     return TRUE;
 
-  if (CLUTTER_MEDIA (data) != media)
+  if (CLUTTER_GST_PLAYER (data) != player)
     {
-      media = CLUTTER_MEDIA (data);
+      player = CLUTTER_GST_PLAYER (data);
       count = 1;
       g_free(uri[0]);
       uri[0] = NULL;
@@ -94,25 +94,25 @@ test (gpointer data)
       uri[1] = NULL;
     }
 
-  clutter_media_set_filename (media, video_files[count & 1]);
+  clutter_gst_player_set_filename (player, video_files[count & 1]);
   g_print ("playing %s\n", video_files[count & 1]);
 
   if (uri[count & 1] == NULL)
     {
-      uri[count & 1] = g_strdup (clutter_media_get_uri (media));
+      uri[count & 1] = g_strdup (clutter_gst_player_get_uri (player));
       g_assert (uri[count & 1] != NULL);
     }
 
   /* See if it's still playing */
-  g_assert (clutter_media_get_playing (media));
+  g_assert (clutter_gst_player_is_playing (player));
 
   /* See if it's already change to play correct file */
-  playing_uri = clutter_media_get_uri (media);
+  playing_uri = clutter_gst_player_get_uri (player);
   g_assert_cmpstr (playing_uri, ==, uri[count & 1]);
 
   if (count ++ > 10)
     {
-      clutter_media_set_playing (media, FALSE);
+      clutter_gst_player_set_playing (player, FALSE);
       clutter_main_quit ();
       return FALSE;
     }
@@ -156,9 +156,9 @@ main (int argc, char *argv[])
                     G_CALLBACK(on_error),
                     stage);
   g_timeout_add (5000, test, video);
-  clutter_media_set_filename (CLUTTER_MEDIA(video), video_files[0]);
-  clutter_media_set_audio_volume (CLUTTER_MEDIA(video), 0.5);
-  clutter_media_set_playing (CLUTTER_MEDIA(video), TRUE);
+  clutter_gst_player_set_filename (CLUTTER_GST_PLAYER (video), video_files[0]);
+  clutter_gst_player_set_audio_volume (CLUTTER_GST_PLAYER (video), 0.5);
+  clutter_gst_player_set_playing (CLUTTER_GST_PLAYER (video), TRUE);
 
   clutter_actor_add_child (stage, video);
   clutter_actor_show (stage);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]