diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index b5be01562..d09311024 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -1189,6 +1189,20 @@ static inline int process_node(void *data) return 0; } +int pw_impl_node_trigger(struct pw_impl_node *node) +{ + struct pw_node_activation *a = node->rt.activation; + struct pw_node_activation_state *state = &a->state[0]; + + if (pw_node_activation_state_dec(state, 1)) { + uint64_t nsec = get_time_ns(node->data_system); + a->status = PW_NODE_ACTIVATION_TRIGGERED; + a->signal_time = nsec; + node_signal_func(node); + } + return 0; +} + static void node_on_fd_events(struct spa_source *source) { struct pw_impl_node *this = source->data; diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 64b256d4f..50c25e377 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1267,6 +1267,8 @@ int pw_impl_node_update_ports(struct pw_impl_node *node); int pw_impl_node_set_driver(struct pw_impl_node *node, struct pw_impl_node *driver); +int pw_impl_node_trigger(struct pw_impl_node *node); + /** Prepare a link * Starts the negotiation of formats and buffers on \a link */ int pw_impl_link_prepare(struct pw_impl_link *link); diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 065e52c73..98b8550e9 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2433,7 +2433,7 @@ bool pw_stream_is_driving(struct pw_stream *stream) } static int -do_trigger_process(struct spa_loop *loop, +do_trigger_driver(struct spa_loop *loop, bool async, uint32_t seq, const void *data, size_t size, void *user_data) { struct stream *impl = user_data; @@ -2473,15 +2473,16 @@ int pw_stream_trigger_process(struct pw_stream *stream) /* flag to check for old or new behaviour */ impl->using_trigger = true; - if (!impl->driving && !impl->trigger) { - res = pw_loop_invoke(impl->main_loop, - do_trigger_request_process, 1, NULL, 0, false, impl); - } else { + if (impl->trigger) { + pw_impl_node_trigger(stream->node); + } else if (impl->driving) { if (!impl->process_rt) call_process(impl); - res = pw_loop_invoke(impl->data_loop, - do_trigger_process, 1, NULL, 0, false, impl); + do_trigger_driver, 1, NULL, 0, false, impl); + } else { + res = pw_loop_invoke(impl->main_loop, + do_trigger_request_process, 1, NULL, 0, false, impl); } return res; }