paaudio: properly disconnect streams in fini_*

Currently this needs a workaround due to bug #247 in pulseaudio.

Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-id: c81019d550d9c3518185d3d08bd463ae3ccdc392.1566168923.git.DirtY.iCE.hu@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Kővágó, Zoltán 2019-08-19 01:06:53 +02:00 committed by Gerd Hoffmann
parent 8a435f7478
commit 8692bf7d97

View file

@ -685,6 +685,27 @@ static int qpa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
return -1;
}
static void qpa_simple_disconnect(PAConnection *c, pa_stream *stream)
{
int err;
pa_threaded_mainloop_lock(c->mainloop);
/*
* wait until actually connects. workaround pa bug #247
* https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/247
*/
while (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
pa_threaded_mainloop_wait(c->mainloop);
}
err = pa_stream_disconnect(stream);
if (err != 0) {
dolog("Failed to disconnect! err=%d\n", err);
}
pa_stream_unref(stream);
pa_threaded_mainloop_unlock(c->mainloop);
}
static void qpa_fini_out (HWVoiceOut *hw)
{
void *ret;
@ -696,7 +717,7 @@ static void qpa_fini_out (HWVoiceOut *hw)
audio_pt_join(&pa->pt, &ret, __func__);
if (pa->stream) {
pa_stream_unref (pa->stream);
qpa_simple_disconnect(pa->g->conn, pa->stream);
pa->stream = NULL;
}
@ -716,7 +737,7 @@ static void qpa_fini_in (HWVoiceIn *hw)
audio_pt_join(&pa->pt, &ret, __func__);
if (pa->stream) {
pa_stream_unref (pa->stream);
qpa_simple_disconnect(pa->g->conn, pa->stream);
pa->stream = NULL;
}