[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