ext/pulse/pulsesink.c: Don't wait for the pulse mainloop when destroying the stream.

Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream):
Don't wait for the pulse mainloop when destroying the stream.
Fixes a deadlock when the pulsedaemon goes away while pulsesink
is PLAYING. Fixes bug #556986.
This commit is contained in:
Sebastian Dröge 2009-01-05 17:31:13 +00:00
parent d576b9fdbe
commit 67cc69ad52
2 changed files with 11 additions and 7 deletions

View file

@ -1,3 +1,10 @@
2009-01-05 Sebastian Dröge <sebastian.droege@collabora.co.uk>
* ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream):
Don't wait for the pulse mainloop when destroying the stream.
Fixes a deadlock when the pulsedaemon goes away while pulsesink
is PLAYING. Fixes bug #556986.
2009-01-05 Sebastian Dröge <sebastian.droege@collabora.co.uk> 2009-01-05 Sebastian Dröge <sebastian.droege@collabora.co.uk>
Patch by: Sascha Hauer <s dot hauer at pengutronix dot de> Patch by: Sascha Hauer <s dot hauer at pengutronix dot de>

View file

@ -279,7 +279,6 @@ gst_pulsesink_destroy_stream (GstPulseSink * pulsesink)
{ {
if (pulsesink->stream) { if (pulsesink->stream) {
pa_stream_disconnect (pulsesink->stream); pa_stream_disconnect (pulsesink->stream);
pa_threaded_mainloop_wait (pulsesink->mainloop);
pa_stream_unref (pulsesink->stream); pa_stream_unref (pulsesink->stream);
pulsesink->stream = NULL; pulsesink->stream = NULL;
} }
@ -588,16 +587,14 @@ gst_pulsesink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
if (!pulsesink->context if (!pulsesink->context
|| pa_context_get_state (pulsesink->context) != PA_CONTEXT_READY) { || pa_context_get_state (pulsesink->context) != PA_CONTEXT_READY) {
GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, ("Bad context state: %s", GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, ("Bad context state: %s",
pulsesink-> pulsesink->context ? pa_strerror (pa_context_errno (pulsesink->
context ? pa_strerror (pa_context_errno (pulsesink->context)) : context)) : NULL), (NULL));
NULL), (NULL));
goto unlock_and_fail; goto unlock_and_fail;
} }
if (!(pulsesink->stream = pa_stream_new (pulsesink->context, if (!(pulsesink->stream = pa_stream_new (pulsesink->context,
pulsesink-> pulsesink->stream_name ? pulsesink->
stream_name ? pulsesink->stream_name : "Playback Stream", stream_name : "Playback Stream", &pulsesink->sample_spec,
&pulsesink->sample_spec,
gst_pulse_gst_to_channel_map (&channel_map, spec)))) { gst_pulse_gst_to_channel_map (&channel_map, spec)))) {
GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED,
("Failed to create stream: %s", ("Failed to create stream: %s",