[gthumb] media viewer: update the ui in an idle callback to avoid threading problems
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] media viewer: update the ui in an idle callback to avoid threading problems
- Date: Sat, 22 Dec 2012 16:08:24 +0000 (UTC)
commit 52fa16bfc3bf6c4a5e05d3685478a8c0f13401ee
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Dec 13 12:04:37 2012 +0100
media viewer: update the ui in an idle callback to avoid threading problems
extensions/gstreamer_tools/gth-media-viewer-page.c | 95 ++++++++++++--------
1 files changed, 58 insertions(+), 37 deletions(-)
---
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c b/extensions/gstreamer_tools/gth-media-viewer-page.c
index ba7cd88..f173ad8 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -65,7 +65,7 @@ struct _GthMediaViewerPagePrivate {
gboolean has_video;
gboolean has_audio;
gulong update_progress_id;
- guint set_to_pause_id;
+ gulong update_volume_id;
gdouble rate;
GtkWidget *mediabar;
GtkWidget *fullscreen_toolbar;
@@ -611,13 +611,18 @@ play_faster_button_clicked_cb (GtkButton *button,
}
-static void
+static gboolean
update_volume_from_playbin (GthMediaViewerPage *self)
{
double volume;
+ if (self->priv->update_volume_id != 0) {
+ g_source_remove (self->priv->update_volume_id);
+ self->priv->update_volume_id = 0;
+ }
+
if ((self->priv->builder == NULL) || (self->priv->playbin == NULL))
- return;
+ return FALSE;
g_object_get (self->priv->playbin, "volume", &volume, NULL);
@@ -637,6 +642,8 @@ update_volume_from_playbin (GthMediaViewerPage *self)
g_signal_handlers_block_by_func (GET_WIDGET ("volume_togglebutton"), volume_togglebutton_toggled_cb, self);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("volume_togglebutton")), volume == 0.0);
g_signal_handlers_unblock_by_func (GET_WIDGET ("volume_togglebutton"), volume_togglebutton_toggled_cb, self);
+
+ return FALSE;
}
@@ -821,7 +828,7 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
gtk_widget_show (self->priv->area_box);
gth_browser_set_viewer_widget (browser, self->priv->area_box);
- gtk_widget_realize (self->priv->area_box);
+ gtk_widget_realize (self->priv->area);
gth_viewer_page_focus (GTH_VIEWER_PAGE (self));
}
@@ -877,6 +884,11 @@ gth_media_viewer_page_real_deactivate (GthViewerPage *base)
self->priv->update_progress_id = 0;
}
+ if (self->priv->update_volume_id != 0) {
+ g_source_remove (self->priv->update_volume_id);
+ self->priv->update_volume_id = 0;
+ }
+
if (self->priv->playbin != NULL) {
save_volume (self);
gst_element_set_state (self->priv->playbin, GST_STATE_NULL);
@@ -1021,6 +1033,11 @@ bus_message_cb (GstBus *bus,
break;
}
+ case GST_MESSAGE_DURATION_CHANGED:
+ self->priv->duration = 0;
+ update_current_position_bar (self);
+ break;
+
case GST_MESSAGE_EOS:
reset_player_state (self);
break;
@@ -1028,13 +1045,13 @@ bus_message_cb (GstBus *bus,
case GST_MESSAGE_BUFFERING: {
int percent = 0;
gst_message_parse_buffering (message, &percent);
- /* g_print ("Buffering (%%%u percent done)", percent); */
+ gst_element_set_state(self->priv->playbin, (percent == 100) ? GST_STATE_PLAYING : GST_STATE_PAUSED);
break;
+ }
case GST_MESSAGE_ERROR:
gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), self->priv->file_data, FALSE);
break;
- }
default:
break;
@@ -1047,7 +1064,10 @@ playbin_notify_volume_cb (GObject *playbin,
GParamSpec *pspec,
gpointer user_data)
{
- update_volume_from_playbin ((GthMediaViewerPage *) user_data);
+ GthMediaViewerPage *self = user_data;
+
+ if (self->priv->update_volume_id == 0)
+ self->priv->update_volume_id = g_idle_add ((GSourceFunc) update_volume_from_playbin, user_data);
}
@@ -1069,14 +1089,34 @@ create_playbin (GthMediaViewerPage *self)
NULL);
g_object_unref (settings);
- g_signal_connect (self->priv->playbin, "notify::volume", G_CALLBACK (playbin_notify_volume_cb), self);
-
bus = gst_pipeline_get_bus (GST_PIPELINE (self->priv->playbin));
gst_bus_enable_sync_message_emission (bus);
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) set_playbin_window, self, NULL);
gst_bus_add_signal_watch (bus);
- g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), self);
+ g_signal_connect (self->priv->playbin,
+ "notify::volume",
+ G_CALLBACK (playbin_notify_volume_cb),
+ self);
+ g_signal_connect (bus,
+ "message",
+ G_CALLBACK (bus_message_cb),
+ self);
+}
+
+
+static void
+_gth_media_viewer_page_set_uri (GthMediaViewerPage *self,
+ const char *uri,
+ GstState state)
+{
+ g_return_if_fail (self->priv->playbin != NULL);
+
+ gst_element_set_state (self->priv->playbin, GST_STATE_NULL);
+
+ g_object_set (G_OBJECT (self->priv->playbin), "uri", uri, NULL);
+ gst_element_set_state (self->priv->playbin, GST_STATE_READY);
+ gst_element_set_state (self->priv->playbin, state);
}
@@ -1102,8 +1142,7 @@ gth_media_viewer_page_real_show (GthViewerPage *base)
char *uri;
uri = g_file_get_uri (self->priv->file_data->file);
- g_object_set (G_OBJECT (self->priv->playbin), "uri", uri, NULL);
- gst_element_set_state (self->priv->playbin, GST_STATE_PLAYING);
+ _gth_media_viewer_page_set_uri (self, uri, GST_STATE_PLAYING);
g_free (uri);
}
@@ -1139,19 +1178,6 @@ gth_media_viewer_page_real_can_view (GthViewerPage *base,
}
-static gboolean
-set_to_paused (gpointer user_data)
-{
- GthMediaViewerPage *self = user_data;
-
- self->priv->set_to_pause_id = 0;
- if (self->priv->playbin != NULL)
- gst_element_set_state (self->priv->playbin, self->priv->visible ? GST_STATE_PLAYING : GST_STATE_READY);
-
- return FALSE;
-}
-
-
static void
gth_media_viewer_page_real_view (GthViewerPage *base,
GthFileData *file_data)
@@ -1199,13 +1225,8 @@ gth_media_viewer_page_real_view (GthViewerPage *base,
if (self->priv->playbin == NULL)
return;
- gst_element_set_state (self->priv->playbin, GST_STATE_NULL);
uri = g_file_get_uri (self->priv->file_data->file);
- g_object_set (G_OBJECT (self->priv->playbin), "uri", uri, NULL);
-
- if (self->priv->set_to_pause_id != 0)
- g_source_remove (self->priv->set_to_pause_id);
- self->priv->set_to_pause_id = gdk_threads_add_idle (set_to_paused, self);
+ _gth_media_viewer_page_set_uri (self, uri, self->priv->visible ? GST_STATE_PLAYING : GST_STATE_PAUSED);
g_free (uri);
}
@@ -1380,16 +1401,16 @@ gth_media_viewer_page_finalize (GObject *obj)
self = GTH_MEDIA_VIEWER_PAGE (obj);
- if (self->priv->set_to_pause_id != 0) {
- g_source_remove (self->priv->set_to_pause_id);
- self->priv->set_to_pause_id = 0;
- }
-
if (self->priv->update_progress_id != 0) {
g_source_remove (self->priv->update_progress_id);
self->priv->update_progress_id = 0;
}
+ if (self->priv->update_volume_id != 0) {
+ g_source_remove (self->priv->update_volume_id);
+ self->priv->update_volume_id = 0;
+ }
+
if (self->priv->playbin != NULL) {
save_volume (self);
gst_element_set_state (self->priv->playbin, GST_STATE_NULL);
@@ -1443,7 +1464,7 @@ gth_media_viewer_page_init (GthMediaViewerPage *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_MEDIA_VIEWER_PAGE, GthMediaViewerPagePrivate);
self->priv->update_progress_id = 0;
- self->priv->set_to_pause_id = 0;
+ self->priv->update_volume_id = 0;
self->priv->video_window_xid = 0;
self->priv->xwin_assigned = FALSE;
self->priv->has_video = FALSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]