summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wood <michael.g.wood@linux.intel.com>2012-03-26 18:37:38 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2012-04-27 14:24:28 +0100
commite36ee1777f2f1f104c30b1791a14da4a94f07c49 (patch)
treeecba0b3aa4c8cdea476db7b45f461947395912b6
parent5de930bc5751be5b1896cb8a428928434c171be8 (diff)
downloadclutter-gst-e36ee1777f2f1f104c30b1791a14da4a94f07c49.tar.gz
player: Add a "in-seek" property
This can be used when we need to keep external controllers in sync with the current progress without having to poll for the progress. For example in Mpris player: http://www.mpris.org/2.1/spec/Player_Node.html#Method:Seek
-rw-r--r--clutter-gst/clutter-gst-player.c77
-rw-r--r--clutter-gst/clutter-gst-player.h5
2 files changed, 77 insertions, 5 deletions
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c
index b5aa2e3..e156032 100644
--- a/clutter-gst/clutter-gst-player.c
+++ b/clutter-gst/clutter-gst-player.c
@@ -115,7 +115,8 @@ enum
PROP_AUDIO_STREAMS,
PROP_AUDIO_STREAM,
PROP_SUBTITLE_TRACKS,
- PROP_SUBTITLE_TRACK
+ PROP_SUBTITLE_TRACK,
+ PROP_IN_SEEK
};
struct _ClutterGstPlayerIfacePrivate
@@ -576,6 +577,17 @@ set_uri (ClutterGstPlayer *player,
}
static void
+set_in_seek (ClutterGstPlayer *player,
+ gboolean seeking)
+{
+ ClutterGstPlayerPrivate *priv = PLAYER_GET_PRIVATE (player);
+
+ priv->in_seek = seeking;
+ g_object_notify (G_OBJECT (player), "in-seek");
+}
+
+
+static void
set_playing (ClutterGstPlayer *player,
gboolean playing)
{
@@ -593,7 +605,7 @@ set_playing (ClutterGstPlayer *player,
if (priv->uri)
{
- priv->in_seek = FALSE;
+ set_in_seek (player, FALSE);
gst_element_set_state (priv->pipeline, priv->target_state);
}
@@ -685,7 +697,8 @@ set_progress (ClutterGstPlayer *player,
position,
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
- priv->in_seek = TRUE;
+ set_in_seek (player, TRUE);
+
priv->stacked_progress = 0.0;
CLUTTER_GST_NOTE (MEDIA, "set progress (seeked): %.02f", progress);
@@ -1177,7 +1190,7 @@ bus_message_async_done_cb (GstBus *bus,
{
g_object_notify (G_OBJECT (player), "progress");
- priv->in_seek = FALSE;
+ set_in_seek (player, FALSE);
if (priv->stacked_progress)
{
@@ -1520,6 +1533,10 @@ clutter_gst_player_get_property (GObject *object,
}
break;
+ case PROP_IN_SEEK:
+ g_value_set_boolean (value, priv->in_seek);
+ break;
+
default:
iface_priv = PLAYER_GET_CLASS_PRIVATE (object);
iface_priv->get_property (object, property_id, value, pspec);
@@ -1593,6 +1610,8 @@ clutter_gst_player_class_init (GObjectClass *object_class)
PROP_SUBTITLE_TRACKS, "subtitle-tracks");
g_object_class_override_property (object_class,
PROP_SUBTITLE_TRACK, "subtitle-track");
+ g_object_class_override_property (object_class,
+ PROP_IN_SEEK, "in-seek");
}
static GstElement *
@@ -1891,6 +1910,17 @@ clutter_gst_player_get_idle_impl (ClutterGstPlayer *player)
return priv->is_idle;
}
+static gboolean
+clutter_gst_player_get_in_seek_impl (ClutterGstPlayer *player)
+{
+ ClutterGstPlayerPrivate *priv;
+
+ priv = PLAYER_GET_PRIVATE (player);
+
+ return priv->in_seek;
+}
+
+
/**/
#if defined (CLUTTER_WINDOWING_X11) && defined (HAVE_HW_DECODER_SUPPORT)
@@ -1969,6 +1999,7 @@ clutter_gst_player_init (ClutterGstPlayer *player)
iface->get_subtitle_track = clutter_gst_player_get_subtitle_track_impl;
iface->set_subtitle_track = clutter_gst_player_set_subtitle_track_impl;
iface->get_idle = clutter_gst_player_get_idle_impl;
+ iface->get_in_seek = clutter_gst_player_get_in_seek_impl;
priv = g_slice_new0 (ClutterGstPlayerPrivate);
PLAYER_SET_PRIVATE (player, priv);
@@ -2204,6 +2235,22 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
CLUTTER_GST_PARAM_READWRITE);
g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:in-seek:
+ *
+ * Whether or not the stream is being seeked.
+ *
+ * Since: 1.6
+ */
+ pspec = g_param_spec_boolean ("in-seek",
+ "In seek mode",
+ "If currently seeking",
+ FALSE,
+ CLUTTER_GST_PARAM_READABLE);
+ g_object_interface_install_property (iface, pspec);
+
+
/* Signals */
/**
@@ -2563,3 +2610,25 @@ clutter_gst_player_get_idle (ClutterGstPlayer *player)
return iface->get_idle (player);
}
+
+/**
+ * clutter_gst_player_get_in_seek:
+ * @player: a #ClutterGstPlayer
+ *
+ * Whether the player is seeking.
+ *
+ * Return value: TRUE if the player is seeking, FALSE otherwise.
+ *
+ * Since: 1.6
+ */
+gboolean
+clutter_gst_player_get_in_seek (ClutterGstPlayer *player)
+{
+ ClutterGstPlayerIface *iface;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), FALSE);
+
+ iface = CLUTTER_GST_PLAYER_GET_INTERFACE (player);
+
+ return iface->get_in_seek (player);
+}
diff --git a/clutter-gst/clutter-gst-player.h b/clutter-gst/clutter-gst-player.h
index 1d1fad5..2a7cdf3 100644
--- a/clutter-gst/clutter-gst-player.h
+++ b/clutter-gst/clutter-gst-player.h
@@ -108,7 +108,8 @@ struct _ClutterGstPlayerIface
gboolean (*get_idle) (ClutterGstPlayer *player);
- void (* _iface_reserved15) (void);
+ gboolean (*get_in_seek) (ClutterGstPlayer *player);
+
void (* _iface_reserved16) (void);
void (* _iface_reserved17) (void);
void (* _iface_reserved18) (void);
@@ -178,6 +179,8 @@ void clutter_gst_player_set_subtitle_track (ClutterGstPlay
gboolean clutter_gst_player_get_idle (ClutterGstPlayer *player);
+gboolean clutter_gst_player_get_in_seek (ClutterGstPlayer *player);
+
G_END_DECLS
#endif /* __CLUTTER_GST_PLAYER_H__ */