[pulseaudio-tickets] [PulseAudio] #166: Various asserts in pulseaudio that result in mplayer crash
PulseAudio
trac-noreply at tango.0pointer.de
Thu Dec 13 23:28:27 PST 2007
#166: Various asserts in pulseaudio that result in mplayer crash
-----------------------+----------------------------------------------------
Reporter: Stax | Owner: lennart
Type: defect | Status: new
Priority: normal | Milestone:
Component: libpulse | Severity: major
Resolution: | Keywords:
-----------------------+----------------------------------------------------
Comment (by Frank Mehnert):
There is a bug in the ao_pulse.c code in the mplayer repository. The
`pa_stream_write()` call has to be protected by the mainloop lock from the
mainloop. The reason is that `pa_stream_write()` is not called from a
mainloop callback. However, I'm not entirely sure about pa_stream_trigger.
Perhaps the main developers could have a short note here. The attached
patch works fine for me:
{{{
--- ao_pulse.c (revision 25386)
+++ ao_pulse.c (working copy)
@@ -251,11 +251,16 @@
/** Play the specified data to the pulseaudio server */
static int play(void* data, int len, int flags) {
if (len) {
- if (pa_stream_write(stream, data, len, NULL, 0, PA_SEEK_RELATIVE)
< 0) {
+ int rc;
+ pa_threaded_mainloop_lock(mainloop);
+ rc = pa_stream_write(stream, data, len, NULL, 0,
PA_SEEK_RELATIVE);
+ pa_threaded_mainloop_unlock(mainloop);
+ if (rc < 0) {
GENERIC_ERR_MSG(context, "pa_stream_write() failed");
return -1;
}
} else {
+ pa_threaded_mainloop_lock(mainloop);
pa_operation *o = pa_stream_trigger(stream, NULL, NULL);
if (!o) {
GENERIC_ERR_MSG(context, "pa_stream_trigger() failed");
@@ -263,6 +268,7 @@
}
/* We don't wait for this operation to complete */
pa_operation_unref(o);
+ pa_threaded_mainloop_unlock(mainloop);
}
return len;
}
}}}
--
Ticket URL: <http://www.pulseaudio.org/ticket/166#comment:2>
PulseAudio <http://pulseaudio.org/>
The PulseAudio Sound Server
More information about the pulseaudio-bugs
mailing list