From 52bc7451fdc88832a1efb642376219d8cc2f92bb Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 1 Jun 2023 18:32:22 +0200 Subject: [PATCH] filter: add support for TRIGGER --- src/pipewire/filter.c | 15 +++++++++++---- src/pipewire/filter.h | 5 +++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 61b84b28a..5ac7b1d83 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -151,6 +151,7 @@ struct filter { unsigned int warn_mlock:1; unsigned int process_rt:1; unsigned int driving:1; + unsigned int trigger:1; }; static int get_param_index(uint32_t id) @@ -1601,6 +1602,10 @@ pw_filter_connect(struct pw_filter *filter, pw_properties_set(filter->properties, PW_KEY_NODE_DRIVER, "true"); if ((pw_properties_get(filter->properties, PW_KEY_NODE_WANT_DRIVER) == NULL)) pw_properties_set(filter->properties, PW_KEY_NODE_WANT_DRIVER, "true"); + if (flags & PW_FILTER_FLAG_TRIGGER) { + pw_properties_set(filter->properties, PW_KEY_NODE_TRIGGER, "true"); + impl->trigger = true; + } if (filter->core == NULL) { filter->core = pw_context_connect(impl->context, @@ -2049,12 +2054,14 @@ int pw_filter_trigger_process(struct pw_filter *filter) pw_log_trace_fp("%p: driving:%d", impl, impl->driving); - if (!impl->driving) { - res = pw_loop_invoke(impl->main_loop, - do_trigger_request_process, 1, NULL, 0, false, impl); - } else { + if (impl->trigger) { + pw_impl_node_trigger(filter->node); + } else if (impl->driving) { res = pw_loop_invoke(impl->data_loop, do_trigger_process, 1, NULL, 0, false, impl); + } else { + res = pw_loop_invoke(impl->main_loop, + do_trigger_request_process, 1, NULL, 0, false, impl); } return res; } diff --git a/src/pipewire/filter.h b/src/pipewire/filter.h index 20da64fa9..fc06a8168 100644 --- a/src/pipewire/filter.h +++ b/src/pipewire/filter.h @@ -104,6 +104,11 @@ enum pw_filter_flags { PW_FILTER_FLAG_CUSTOM_LATENCY = (1 << 3), /**< don't call the default latency algorithm * but emit the param_changed event for the * ports when Latency params are received. */ + PW_FILTER_FLAG_TRIGGER = (1 << 4), /**< the filter will not be scheduled + * automatically but _trigger_process() + * needs to be called. This can be used + * when the filter depends on processing + * of other filters. */ }; enum pw_filter_port_flags {