[telepathy-stream-engine/master] Unlock mutex when changing element states
Olivier Crête
olivier.crete at collabora.co.uk
Wed Oct 21 06:59:22 PDT 2009
---
src/tp-stream-engine.c | 27 +++++++++++++++++++++++++--
1 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/src/tp-stream-engine.c b/src/tp-stream-engine.c
index dd30bc9..902217f 100644
--- a/src/tp-stream-engine.c
+++ b/src/tp-stream-engine.c
@@ -153,6 +153,7 @@ struct _TpStreamEnginePrivate
GList *output_sinks;
GList *preview_sinks;
+ guint audio_streams_generation;
GList *audio_streams;
TpStreamEngineVideoPreview *preview;
@@ -616,6 +617,7 @@ stream_closed (TfStream *stream, gpointer user_data)
g_mutex_lock (self->priv->mutex);
self->priv->audio_streams = g_list_remove (self->priv->audio_streams,
sestream);
+ self->priv->audio_streams_generation++;
g_mutex_unlock (self->priv->mutex);
}
@@ -813,6 +815,7 @@ channel_stream_created (TfChannel *chan G_GNUC_UNUSED,
g_mutex_lock (self->priv->mutex);
self->priv->audio_streams = g_list_prepend (self->priv->audio_streams,
audiostream);
+ self->priv->audio_streams_generation++;
g_mutex_unlock (self->priv->mutex);
g_object_get (audiostream, "src", &src, NULL);
@@ -1021,14 +1024,24 @@ restart_pipeline (gpointer data)
g_assert (ret != GST_STATE_CHANGE_FAILURE);
g_mutex_lock (self->priv->mutex);
+ try_stop_again:
for (item = self->priv->audio_streams; item ; item = item->next)
{
+ TpStreamEngineAudioStream *as = g_object_ref (item->data);
+ guint gen = self->priv->audio_streams_generation;
+
+ g_mutex_unlock (self->priv->mutex);
if (!tp_stream_engine_audio_stream_set_playing (
TP_STREAM_ENGINE_AUDIO_STREAM (item->data), FALSE))
{
- g_mutex_unlock (self->priv->mutex);
+ g_object_unref (as);
goto fail;
}
+ g_object_unref (as);
+
+ g_mutex_lock (self->priv->mutex);
+ if (gen != self->priv->audio_streams_generation)
+ goto try_stop_again;
}
g_mutex_unlock (self->priv->mutex);
@@ -1043,14 +1056,24 @@ restart_pipeline (gpointer data)
}
g_mutex_lock (self->priv->mutex);
+ try_start_again:
for (item = self->priv->audio_streams; item ; item = item->next)
{
+ TpStreamEngineAudioStream *as = g_object_ref (item->data);
+ guint gen = self->priv->audio_streams_generation;
+
+ g_mutex_unlock (self->priv->mutex);
if (!tp_stream_engine_audio_stream_set_playing (
TP_STREAM_ENGINE_AUDIO_STREAM (item->data), TRUE))
{
- g_mutex_unlock (self->priv->mutex);
+ g_object_unref (as);
goto fail;
}
+ g_object_unref (as);
+
+ g_mutex_lock (self->priv->mutex);
+ if (gen != self->priv->audio_streams_generation)
+ goto try_start_again;
}
g_mutex_unlock (self->priv->mutex);
--
1.5.6.5
More information about the telepathy-commits
mailing list