From 03a17df68cde26fb40ee498d869d2a1a0b3cf109 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 21 Jul 2021 05:03:54 +0200 Subject: [PATCH] Pulseaudio: tweak freewheel recovery Always cork stream before calling pa_stream_flush. --- .../backends/pulseaudio/pulseaudio_backend.cc | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/libs/backends/pulseaudio/pulseaudio_backend.cc b/libs/backends/pulseaudio/pulseaudio_backend.cc index 5d9ac8e7ac..c69c89592a 100644 --- a/libs/backends/pulseaudio/pulseaudio_backend.cc +++ b/libs/backends/pulseaudio/pulseaudio_backend.cc @@ -665,6 +665,9 @@ PulseAudioBackend::stop () _run = false; pa_threaded_mainloop_lock (p_mainloop); + if (pa_stream_is_corked (p_stream) == 0) { + cork_pulse (true); + } sync_pulse (pa_stream_flush (p_stream, stream_operation_cb, this)); if (pthread_join (_main_thread, &status)) { @@ -1019,23 +1022,32 @@ PulseAudioBackend::main_process_thread () _freewheel = _freewheeling; engine.freewheel_callback (_freewheel); - /* flush stream before freewheeling */ + if (_freewheel) { + assert (!pa_stream_is_corked (p_stream)); + if (!cork_pulse (true)) { + break; + } + } + + /* flush stream before and after freewheeling */ + assert (pa_stream_is_corked (p_stream)); pa_threaded_mainloop_lock (p_mainloop); _operation_succeeded = false; if (!sync_pulse (pa_stream_flush (p_stream, stream_operation_cb, this)) || !_operation_succeeded) { break; } - /* suspend output while freewheeling, re-anable after */ - if (!cork_pulse (_freewheel)) { - break; - } if (!_freewheel) { + if (!cork_pulse (false)) { + break; + } +#if 0 pa_threaded_mainloop_lock (p_mainloop); _operation_succeeded = false; if (!sync_pulse (pa_stream_drain (p_stream, stream_operation_cb, this)) || !_operation_succeeded) { break; } +#endif _dsp_load_calc.reset (); } }