[farsight2/master] Add sink pad and valve to FsMsnSession

Olivier Crête olivier.crete at collabora.co.uk
Tue Jul 14 09:50:28 PDT 2009


---
 gst/fsmsnconference/fs-msn-session.c |   65 +++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 1 deletions(-)

diff --git a/gst/fsmsnconference/fs-msn-session.c b/gst/fsmsnconference/fs-msn-session.c
index 382465d..eb790eb 100644
--- a/gst/fsmsnconference/fs-msn-session.c
+++ b/gst/fsmsnconference/fs-msn-session.c
@@ -71,6 +71,9 @@ struct _FsMsnSessionPrivate
 
   GError *construction_error;
 
+  GstPad *media_sink_pad;
+  GstElement *valve;
+
   gboolean disposed;
 };
 
@@ -155,6 +158,20 @@ fs_msn_session_init (FsMsnSession *self)
 }
 
 static void
+stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
+{
+  if (*element == NULL)
+    return;
+
+  gst_element_set_locked_state (*element, TRUE);
+  gst_element_set_state (*element, GST_STATE_NULL);
+  gst_bin_remove (conf, *element);
+  if (unref)
+    gst_object_unref (*element);
+  *element = NULL;
+}
+
+static void
 fs_msn_session_dispose (GObject *object)
 {
   FsMsnSession *self = FS_MSN_SESSION (object);
@@ -166,7 +183,10 @@ fs_msn_session_dispose (GObject *object)
 
   conferencebin = GST_BIN (self->priv->conference);
 
-  FS_MSN_SESSION_UNLOCK (self);
+  stop_and_remove (conferencebin, &self->priv->valve, TRUE);
+
+  if (self->priv->media_sink_pad)
+    gst_pad_set_active (self->priv->media_sink_pad, FALSE);
 
   /* MAKE sure dispose does not run twice. */
   self->priv->disposed = TRUE;
@@ -237,6 +257,49 @@ fs_msn_session_set_property (GObject *object,
 static void
 fs_msn_session_constructed (GObject *object)
 {
+  FsMsnSession *self = FS_MSN_SESSION (object);
+  GstPad *pad;
+
+  self->priv->valve = gst_element_factory_make ("fsvalve", NULL);
+
+  if (!self->priv->valve)
+  {
+    self->priv->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION, "Could not make sink valve");
+    return;
+  }
+
+  if (!gst_bin_add (GST_BIN (self->priv->conference), self->priv->valve))
+  {
+    self->priv->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION, "Could not add valve to conference");
+    return;
+  }
+
+  pad = gst_element_get_static_pad (self->priv->valve, "sink");
+  self->priv->media_sink_pad = gst_ghost_pad_new ("sink1", pad);
+  gst_object_unref (pad);
+
+  if (!pad)
+  {
+    self->priv->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION, "Could not create sink ghost pad");
+    return;
+  }
+
+  gst_pad_set_active (self->priv->media_sink_pad, TRUE);
+  if (!gst_element_add_pad (GST_ELEMENT (self->priv->conference),
+          self->priv->media_sink_pad))
+  {
+    self->priv->construction_error = g_error_new (FS_ERROR,
+        FS_ERROR_CONSTRUCTION, "Could not add sink pad to conference");
+    gst_object_unref (self->priv->media_sink_pad);
+    self->priv->media_sink_pad = NULL;
+    return;
+  }
+
+  gst_element_sync_state_with_parent (self->priv->valve);
+
   GST_CALL_PARENT (G_OBJECT_CLASS, constructed, (object));
 }
 
-- 
1.5.6.5




More information about the farsight-commits mailing list