On 13.03.2018 18:40, Tanu Kaskinen wrote: > The alsa sink calls pa_sink_suspend() from the set_port() callback. > pa_sink_suspend() can only be called from the main thread, but the > set_port() callback was often called from the IO thread. That caused an > assertion to be hit in pa_sink_suspend() when switching ports. > > Another issue was that pa_sink_suspend() called the set_port() callback, > and if the callback calls pa_sink_suspend() again recursively, nothing > good can be expected from that, so the thread mismatch was not the only > problem. > > This patch moves the mixer syncing logic out of pa_sink/source_suspend() > to be handled internally by the alsa sink/source. This removes the > recursive pa_sink_suspend() call. This also removes the need to have the > mixer_dirty flag in pa_sink/source, so the flag and the > pa_sink/source_set_mixer_dirty() functions can be removed. > > This patch also changes the threading rules of set_port(). Previously it > was called sometimes from the main thread and sometimes from the IO > thread. Now it's always called from the main thread. When deferred > volumes are used, the alsa sink and source still have to update the > mixer from the IO thread when switching ports, but the thread > synchronization is now handled internally by the alsa sink and source. > The SET_PORT messages are not needed any more and can be removed. > > BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=104761 > --- > src/modules/alsa/alsa-sink.c | 94 +++++++++++++++++++++++++++++++++--------- > src/modules/alsa/alsa-source.c | 94 +++++++++++++++++++++++++++++++++--------- > src/pulsecore/sink.c | 52 +---------------------- > src/pulsecore/sink.h | 7 +--- > src/pulsecore/source.c | 52 +---------------------- > src/pulsecore/source.h | 7 +--- > 6 files changed, 156 insertions(+), 150 deletions(-) > LGTM