From 917d865ea83db62d43e281f47b71bee9eb7987ed Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 30 Mar 2023 16:39:32 +0200 Subject: [PATCH] stream: invoke RequestProcess in the main loop pw_stream_trigger_process() can be called from any thread but the RequestProcess event always needs to be scheduled in the main-loop. --- src/pipewire/filter.c | 7 +++++-- src/pipewire/stream.c | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 4b574c3a5..c44cf5b4c 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -1958,8 +1958,10 @@ do_trigger_process(struct spa_loop *loop, return spa_node_call_ready(&impl->callbacks, res); } -static int trigger_request_process(struct filter *impl) +static int do_trigger_request_process(struct spa_loop *loop, + bool async, uint32_t seq, const void *data, size_t size, void *user_data) { + struct filter *impl = user_data; uint8_t buffer[1024]; struct spa_pod_builder b = { 0 }; @@ -1979,7 +1981,8 @@ int pw_filter_trigger_process(struct pw_filter *filter) pw_log_trace_fp("%p", impl); if (!impl->driving) { - res = trigger_request_process(impl); + res = pw_loop_invoke(impl->context->main_loop, + do_trigger_request_process, 1, NULL, 0, false, impl); } else { res = pw_loop_invoke(impl->context->data_loop, do_trigger_process, 1, NULL, 0, false, impl); diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 5fda0a185..68bf0a353 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2389,8 +2389,10 @@ do_trigger_process(struct spa_loop *loop, return spa_node_call_ready(&impl->callbacks, res); } -static int trigger_request_process(struct stream *impl) +static int do_trigger_request_process(struct spa_loop *loop, + bool async, uint32_t seq, const void *data, size_t size, void *user_data) { + struct stream *impl = user_data; uint8_t buffer[1024]; struct spa_pod_builder b = { 0 }; @@ -2413,7 +2415,8 @@ int pw_stream_trigger_process(struct pw_stream *stream) impl->using_trigger = true; if (!impl->driving && !impl->trigger) { - res = trigger_request_process(impl); + res = pw_loop_invoke(impl->context->main_loop, + do_trigger_request_process, 1, NULL, 0, false, impl); } else { if (!impl->process_rt) call_process(impl);