Sophie

Sophie

distrib > Mandriva > 2010.1 > i586 > media > main-testing-src > by-pkgid > 863d6bb7085bef9decfd3ec6b01c8cbe > files > 4

gstreamer0.10-plugins-good-0.10.22-1.1.4mdv2010.1.src.rpm

From a8103facc59b9dde07ee95d026c3fd2323e278bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian.droege@collabora.co.uk>
Date: Mon, 17 May 2010 17:17:01 +0200
Subject: pulse: Don't lock the mainloop in NULL

---
 ext/pulse/pulsesink.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++-
 ext/pulse/pulsesrc.c  |    9 ++++++++
 2 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/ext/pulse/pulsesink.c b/ext/pulse/pulsesink.c
index e39b672..8d5f0fe 100644
--- a/ext/pulse/pulsesink.c
+++ b/ext/pulse/pulsesink.c
@@ -1692,6 +1692,9 @@ gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume)
   GstPulseRingBuffer *pbuf;
   uint32_t idx;
 
+  if (!psink->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (psink->mainloop);
 
   GST_DEBUG_OBJECT (psink, "setting volume to %f", volume);
@@ -1720,6 +1723,14 @@ unlock:
   return;
 
   /* ERRORS */
+no_mainloop:
+  {
+    psink->volume = volume;
+    psink->volume_set = TRUE;
+
+    GST_DEBUG_OBJECT (psink, "we have no mainloop");
+    return;
+  }
 no_buffer:
   {
     psink->volume = volume;
@@ -1749,6 +1760,9 @@ gst_pulsesink_set_mute (GstPulseSink * psink, gboolean mute)
   GstPulseRingBuffer *pbuf;
   uint32_t idx;
 
+  if (!psink->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (psink->mainloop);
 
   GST_DEBUG_OBJECT (psink, "setting mute state to %d", mute);
@@ -1775,6 +1789,14 @@ unlock:
   return;
 
   /* ERRORS */
+no_mainloop:
+  {
+    psink->mute = mute;
+    psink->mute_set = TRUE;
+
+    GST_DEBUG_OBJECT (psink, "we have no mainloop");
+    return;
+  }
 no_buffer:
   {
     psink->mute = mute;
@@ -1833,6 +1855,9 @@ gst_pulsesink_get_volume (GstPulseSink * psink)
   gdouble v = DEFAULT_VOLUME;
   uint32_t idx;
 
+  if (!psink->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (psink->mainloop);
 
   pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
@@ -1852,9 +1877,9 @@ gst_pulsesink_get_volume (GstPulseSink * psink)
       goto unlock;
   }
 
+unlock:
   v = psink->volume;
 
-unlock:
   if (o)
     pa_operation_unref (o);
 
@@ -1868,6 +1893,12 @@ unlock:
   return v;
 
   /* ERRORS */
+no_mainloop:
+  {
+    v = psink->volume;
+    GST_DEBUG_OBJECT (psink, "we have no mainloop");
+    return v;
+  }
 no_buffer:
   {
     GST_DEBUG_OBJECT (psink, "we have no ringbuffer");
@@ -1895,6 +1926,9 @@ gst_pulsesink_get_mute (GstPulseSink * psink)
   uint32_t idx;
   gboolean mute = FALSE;
 
+  if (!psink->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (psink->mainloop);
   mute = psink->mute;
 
@@ -1924,6 +1958,12 @@ unlock:
   return mute;
 
   /* ERRORS */
+no_mainloop:
+  {
+    mute = psink->mute;
+    GST_DEBUG_OBJECT (psink, "we have no mainloop");
+    return mute;
+  }
 no_buffer:
   {
     GST_DEBUG_OBJECT (psink, "we have no ringbuffer");
@@ -1976,6 +2016,9 @@ gst_pulsesink_device_description (GstPulseSink * psink)
   pa_operation *o = NULL;
   gchar *t;
 
+  if (!psink->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (psink->mainloop);
   pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
   if (pbuf == NULL || pbuf->stream == NULL)
@@ -2002,6 +2045,11 @@ unlock:
   return t;
 
   /* ERRORS */
+no_mainloop:
+  {
+    GST_DEBUG_OBJECT (psink, "we have no mainloop");
+    return NULL;
+  }
 no_buffer:
   {
     GST_DEBUG_OBJECT (psink, "we have no ringbuffer");
diff --git a/ext/pulse/pulsesrc.c b/ext/pulse/pulsesrc.c
index b3126f4..2f1aacd 100644
--- a/ext/pulse/pulsesrc.c
+++ b/ext/pulse/pulsesrc.c
@@ -396,6 +396,9 @@ gst_pulsesrc_device_description (GstPulseSrc * pulsesrc)
   pa_operation *o = NULL;
   gchar *t;
 
+  if (!pulsesrc->mainloop)
+    goto no_mainloop;
+
   pa_threaded_mainloop_lock (pulsesrc->mainloop);
 
   if (!pulsesrc->stream)
@@ -429,6 +432,12 @@ unlock:
   pa_threaded_mainloop_unlock (pulsesrc->mainloop);
 
   return t;
+
+no_mainloop:
+  {
+    GST_DEBUG_OBJECT (pulsesrc, "have no mainloop");
+    return NULL;
+  }
 }
 
 static void
-- 
1.7.1