pulsesink: clear the PA mainloop if baseaudiosink failed to open the ring_buffer
authorPhilippe Normand <phil@base-art.net>
Tue, 17 Aug 2010 11:41:49 +0000 (13:41 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 4 Sep 2010 12:52:06 +0000 (14:52 +0200)
If the application requests a state-change and pulsesink fails to open
the ring_buffer device the mainloop attribute of the sink should be
cleaned up to avoid future state-change (NULL->READY) failures.

ext/pulse/pulsesink.c

index a8d019c..5ae22ae 100644 (file)
@@ -2501,6 +2501,15 @@ gst_pulsesink_change_state (GstElement * element, GstStateChange transition)
 
   ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
 
+  /* Clear the PA mainloop if baseaudiosink failed to open the ring_buffer */
+  if (ret == GST_STATE_CHANGE_FAILURE
+      && transition == GST_STATE_CHANGE_NULL_TO_READY) {
+    g_assert (pulsesink->mainloop);
+    pa_threaded_mainloop_stop (pulsesink->mainloop);
+    pa_threaded_mainloop_free (pulsesink->mainloop);
+    pulsesink->mainloop = NULL;
+  }
+
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       gst_element_post_message (element,