diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-08-24 14:10:41 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-08-24 14:10:41 +0300 |
commit | e416e79af81f08fdb321bf6974d8b73218a7f6f3 (patch) | |
tree | 910ae5bf883c675dfe1cbbdb51797722e09b628c | |
parent | c3619078732323044c52a4eb22ca83f790c4e046 (diff) |
player: Don't report spurious STOPPED state changes when doing transient changes there
-rw-r--r-- | gst-libs/gst/player/gstplayer.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/gst-libs/gst/player/gstplayer.c b/gst-libs/gst/player/gstplayer.c index 5906bbb85..fe63d120b 100644 --- a/gst-libs/gst/player/gstplayer.c +++ b/gst-libs/gst/player/gstplayer.c @@ -214,7 +214,7 @@ static void gst_player_constructed (GObject * object); static gpointer gst_player_main (gpointer data); static void gst_player_seek_internal_locked (GstPlayer * self); -static gboolean gst_player_stop_internal (gpointer user_data); +static void gst_player_stop_internal (GstPlayer * self, gboolean transient); static gboolean gst_player_pause_internal (gpointer user_data); static gboolean gst_player_play_internal (gpointer user_data); static gboolean gst_player_seek_internal (gpointer user_data); @@ -550,7 +550,7 @@ gst_player_set_uri_internal (gpointer user_data) { GstPlayer *self = user_data; - gst_player_stop_internal (self); + gst_player_stop_internal (self, FALSE); g_mutex_lock (&self->lock); @@ -592,7 +592,7 @@ gst_player_set_suburi_internal (gpointer user_data) target_state = self->target_state; position = gst_player_get_position (self); - gst_player_stop_internal (self); + gst_player_stop_internal (self, TRUE); g_mutex_lock (&self->lock); GST_DEBUG_OBJECT (self, "Changing SUBURI to '%s'", @@ -2791,7 +2791,7 @@ gst_player_play_internal (gpointer user_data) GST_SEEK_FLAG_FLUSH, 0); if (!ret) { GST_ERROR_OBJECT (self, "Seek to beginning failed"); - gst_player_stop_internal (self); + gst_player_stop_internal (self, TRUE); gst_player_play_internal (self); } } @@ -2862,7 +2862,7 @@ gst_player_pause_internal (gpointer user_data) GST_SEEK_FLAG_FLUSH, 0); if (!ret) { GST_ERROR_OBJECT (self, "Seek to beginning failed"); - gst_player_stop_internal (self); + gst_player_stop_internal (self, TRUE); gst_player_pause_internal (self); } } @@ -2889,12 +2889,10 @@ gst_player_pause (GstPlayer * self) gst_player_pause_internal, self, NULL); } -static gboolean -gst_player_stop_internal (gpointer user_data) +static void +gst_player_stop_internal (GstPlayer * self, gboolean transient) { - GstPlayer *self = GST_PLAYER (user_data); - - GST_DEBUG_OBJECT (self, "Stop"); + GST_DEBUG_OBJECT (self, "Stop (transient %d)", transient); tick_cb (self); remove_tick_source (self); @@ -2908,7 +2906,10 @@ gst_player_stop_internal (gpointer user_data) gst_bus_set_flushing (self->bus, TRUE); gst_element_set_state (self->playbin, GST_STATE_READY); gst_bus_set_flushing (self->bus, FALSE); - change_state (self, GST_PLAYER_STATE_STOPPED); + change_state (self, transient + && self->app_state != + GST_PLAYER_STATE_STOPPED ? GST_PLAYER_STATE_BUFFERING : + GST_PLAYER_STATE_STOPPED); self->buffering = 100; g_mutex_lock (&self->lock); if (self->media_info) { @@ -2929,10 +2930,19 @@ gst_player_stop_internal (gpointer user_data) self->last_seek_time = GST_CLOCK_TIME_NONE; self->rate = 1.0; g_mutex_unlock (&self->lock); +} + +static gboolean +gst_player_stop_internal_dispatch (gpointer user_data) +{ + GstPlayer *self = GST_PLAYER (user_data); + + gst_player_stop_internal (self, FALSE); return G_SOURCE_REMOVE; } + /** * gst_player_stop: * @player: #GstPlayer instance @@ -2950,7 +2960,7 @@ gst_player_stop (GstPlayer * self) g_mutex_unlock (&self->lock); g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT, - gst_player_stop_internal, self, NULL); + gst_player_stop_internal_dispatch, self, NULL); } /* Must be called with lock from main context, releases lock! */ |