diff options
author | Michael Wood <michael.g.wood@linux.intel.com> | 2012-03-26 18:37:38 +0100 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2012-04-27 14:24:28 +0100 |
commit | e36ee1777f2f1f104c30b1791a14da4a94f07c49 (patch) | |
tree | ecba0b3aa4c8cdea476db7b45f461947395912b6 | |
parent | 5de930bc5751be5b1896cb8a428928434c171be8 (diff) | |
download | clutter-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.c | 77 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-player.h | 5 |
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__ */ |