diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2009-02-03 17:03:46 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2009-02-03 17:03:46 +0800 |
commit | 8434204f195dd82108656ec2a4f62efd0c12bc8f (patch) | |
tree | e8b5f2eda0ac0cf388cb365fd9aa031d062ad414 | |
parent | 2690df7f5e8837b7240ed75d456894f36c77a8b9 (diff) | |
download | gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar.gz gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar.bz2 gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar.lz gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar.xz gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.tar.zst gsoc2013-empathy-8434204f195dd82108656ec2a4f62efd0c12bc8f.zip |
stop the pipeline and unref everything when the window goes away
Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
svn path=/trunk/; revision=2399
-rw-r--r-- | src/empathy-call-window.c | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 66c1e1c6d..34f129225 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -70,6 +70,9 @@ struct _EmpathyCallWindowPriv static void empathy_call_window_realized_cb (GtkWidget *widget, EmpathyCallWindow *window); +static gboolean empathy_call_window_delete_cb (GtkWidget *widget, + GdkEvent*event, EmpathyCallWindow *window); + static void empathy_call_window_init (EmpathyCallWindow *self) { @@ -87,23 +90,22 @@ empathy_call_window_init (EmpathyCallWindow *self) priv->video_output = empathy_video_widget_new (bus); priv->video_tee = gst_element_factory_make ("tee", NULL); - priv->video_input = empathy_video_src_new (); + gst_object_ref (priv->video_tee); + gst_object_sink (priv->video_tee); + priv->video_preview = empathy_video_widget_new (bus); + priv->video_input = empathy_video_src_new (); + gst_object_ref (priv->video_input); + gst_object_sink (priv->video_input); + priv->audio_input = empathy_audio_src_new (); - priv->audio_output = empathy_audio_sink_new (); + gst_object_ref (priv->audio_input); + gst_object_sink (priv->audio_input); -/* - gst_bin_add_many (GST_BIN (priv->pipeline), - empathy_gtk_widget_get_element ( - EMPATHY_GST_GTK_WIDGET (priv->video_preview)), - empathy_gtk_widget_get_element ( - EMPATHY_GST_GTK_WIDGET (priv->video_output)), - priv->video_input, - priv->audio_input, - priv->audio_output, - NULL); - */ + priv->audio_output = empathy_audio_sink_new (); + gst_object_ref (priv->audio_output); + gst_object_sink (priv->audio_output); g_object_unref (bus); @@ -114,6 +116,9 @@ empathy_call_window_init (EmpathyCallWindow *self) g_signal_connect (G_OBJECT (self), "realize", G_CALLBACK (empathy_call_window_realized_cb), self); + + g_signal_connect (G_OBJECT (self), "delete-event", + G_CALLBACK (empathy_call_window_delete_cb), self); } static void empathy_call_window_dispose (GObject *object); @@ -192,8 +197,27 @@ empathy_call_window_dispose (GObject *object) priv->handler = NULL; - /* release any references held by the object here */ + if (priv->pipeline != NULL) + g_object_unref (priv->pipeline); + priv->pipeline = NULL; + if (priv->video_input != NULL) + g_object_unref (priv->video_input); + priv->video_input = NULL; + + if (priv->audio_input != NULL) + g_object_unref (priv->audio_input); + priv->audio_input = NULL; + + if (priv->audio_output != NULL) + g_object_unref (priv->audio_output); + priv->audio_output = NULL; + + if (priv->video_tee != NULL) + g_object_unref (priv->video_tee); + priv->video_tee = NULL; + + /* release any references held by the object here */ if (G_OBJECT_CLASS (empathy_call_window_parent_class)->dispose) G_OBJECT_CLASS (empathy_call_window_parent_class)->dispose (object); } @@ -247,6 +271,7 @@ empathy_call_window_src_added_cb (EmpathyCallHandler *handler, { case TP_MEDIA_STREAM_TYPE_AUDIO: element = priv->audio_output; + g_object_ref (element); break; case TP_MEDIA_STREAM_TYPE_VIDEO: element = @@ -325,3 +350,13 @@ empathy_call_window_realized_cb (GtkWidget *widget, EmpathyCallWindow *window) g_object_unref (bus); } +static gboolean +empathy_call_window_delete_cb (GtkWidget *widget, GdkEvent*event, + EmpathyCallWindow *window) +{ + EmpathyCallWindowPriv *priv = GET_PRIV (window); + + gst_element_set_state (priv->pipeline, GST_STATE_NULL); + + return FALSE; +} |