[Telepathy-commits] [telepathy-stream-engine/master] Only start audio source when requested

Olivier Crête olivier.crete at collabora.co.uk
Tue Dec 9 17:35:28 PST 2008


---
 src/audiostream.c |   66 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/src/audiostream.c b/src/audiostream.c
index 50cfd71..53beb5d 100644
--- a/src/audiostream.c
+++ b/src/audiostream.c
@@ -59,6 +59,8 @@ struct _TpStreamEngineAudioStreamPrivate
   GstElement *bin;
 
   gulong src_pad_added_handler_id;
+  gulong request_resource_handler_id;
+  gulong free_resource_handler_id;
 
   GError *construction_error;
 
@@ -95,6 +97,15 @@ static void tp_stream_engine_audio_stream_get_property  (GObject *object,
 static void src_pad_added_cb (TfStream *stream, GstPad *pad,
     FsCodec *codec, gpointer user_data);
 
+static gboolean request_resource (TfStream *stream,
+    TpMediaStreamDirection dir,
+    TpStreamEngineAudioStream *self);
+static void free_resource (TfStream *stream,
+    TpMediaStreamDirection dir,
+    TpStreamEngineAudioStream *self);
+
+
+
 static void
 tp_stream_engine_audio_stream_init (TpStreamEngineAudioStream *self)
 {
@@ -169,7 +180,15 @@ tp_stream_engine_audio_stream_constructor (GType type,
   gst_object_unref (src_pad);
   gst_object_unref (sink_pad);
 
-  gst_element_set_state (self->priv->srcbin, GST_STATE_PLAYING);
+  gst_element_set_locked_state (self->priv->srcbin, TRUE);
+  gst_element_set_state (self->priv->srcbin, GST_STATE_PAUSED);
+
+  self->priv->request_resource_handler_id = g_signal_connect (
+      self->priv->stream, "request-resource", G_CALLBACK (request_resource),
+      self);
+  self->priv->free_resource_handler_id = g_signal_connect (
+      self->priv->stream, "free-resource", G_CALLBACK (free_resource),
+      self);
 
   self->priv->src_pad_added_handler_id = g_signal_connect (self->priv->stream,
       "src-pad-added", G_CALLBACK (src_pad_added_cb), self);
@@ -210,6 +229,20 @@ tp_stream_engine_audio_stream_dispose (GObject *object)
       self->priv->src_pad_added_handler_id = 0;
     }
 
+  if (self->priv->request_resource_handler_id)
+    {
+      g_signal_handler_disconnect (self->priv->stream,
+          self->priv->request_resource_handler_id);
+      self->priv->request_resource_handler_id = 0;
+    }
+
+  if (self->priv->free_resource_handler_id)
+    {
+      g_signal_handler_disconnect (self->priv->stream,
+          self->priv->free_resource_handler_id);
+      self->priv->free_resource_handler_id = 0;
+    }
+
   g_mutex_lock (self->priv->mutex);
   g_list_foreach (self->priv->sinkbins, free_sinkbin, self);
   g_list_free (self->priv->sinkbins);
@@ -218,7 +251,6 @@ tp_stream_engine_audio_stream_dispose (GObject *object)
 
   if (self->priv->srcbin)
     {
-      gst_element_set_locked_state (self->priv->srcbin, TRUE);
       gst_element_set_state (self->priv->srcbin, GST_STATE_NULL);
       gst_bin_remove (GST_BIN (self->priv->bin), self->priv->srcbin);
       self->priv->srcbin = NULL;
@@ -465,3 +497,33 @@ src_pad_added_cb (TfStream *stream, GstPad *pad, FsCodec *codec,
   goto error_finish;
 
 }
+
+static gboolean
+request_resource (TfStream *stream,
+    TpMediaStreamDirection dir,
+    TpStreamEngineAudioStream *self)
+{
+  GstStateChangeReturn ret;
+
+  if (!(dir & TP_MEDIA_STREAM_DIRECTION_SEND))
+    return TRUE;
+
+  ret = gst_element_set_state (self->priv->srcbin, GST_STATE_PLAYING);
+
+  if (ret == GST_STATE_CHANGE_FAILURE)
+    return FALSE;
+  else
+    return TRUE;
+}
+
+static void
+free_resource (TfStream *stream,
+    TpMediaStreamDirection dir,
+    TpStreamEngineAudioStream *self)
+
+{
+  if (!(dir & TP_MEDIA_STREAM_DIRECTION_SEND))
+    return;
+
+  gst_element_set_state (self->priv->srcbin, GST_STATE_PAUSED);
+}
-- 
1.5.6.5



More information about the Telepathy-commits mailing list