From 242e530aeb100c5665990ec722a1d7085503c19e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 2 Oct 2024 16:17:17 +0200 Subject: [PATCH] stream: add pw_stream_emit_event() Make a function to emit an event from a stream. Use this function internally to emit the RequestProcess. Make the RequestProcess event construction a little more efficient. --- src/pipewire/filter.c | 23 +++++++++++++---------- src/pipewire/filter.h | 5 +++++ src/pipewire/stream.c | 23 +++++++++++++---------- src/pipewire/stream.h | 5 +++++ 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 4d878f584..f21a161d5 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -2081,20 +2081,23 @@ do_trigger_process(struct spa_loop *loop, return spa_node_call_ready(&impl->callbacks, res); } -static int do_trigger_request_process(struct spa_loop *loop, +static int do_emit_event(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 }; - - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - spa_node_emit_event(&impl->hooks, - spa_pod_builder_add_object(&b, - SPA_TYPE_EVENT_Node, SPA_NODE_EVENT_RequestProcess)); + const struct spa_event *event = data; + spa_node_emit_event(&impl->hooks, event); return 0; } +SPA_EXPORT +int pw_filter_emit_event(struct pw_filter *filter, const struct spa_event *event) +{ + struct filter *impl = SPA_CONTAINER_OF(filter, struct filter, this); + return pw_loop_invoke(impl->main_loop, + do_emit_event, 1, event, SPA_POD_SIZE(&event->pod), false, impl); +} + SPA_EXPORT int pw_filter_trigger_process(struct pw_filter *filter) { @@ -2109,8 +2112,8 @@ int pw_filter_trigger_process(struct pw_filter *filter) 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); + pw_filter_emit_event(filter, + &SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess)); } return res; } diff --git a/src/pipewire/filter.h b/src/pipewire/filter.h index 674ef4b7e..15e318d09 100644 --- a/src/pipewire/filter.h +++ b/src/pipewire/filter.h @@ -29,6 +29,7 @@ struct pw_filter; #include #include #include +#include #include #include @@ -250,6 +251,10 @@ bool pw_filter_is_driving(struct pw_filter *filter); * be scheduled and process() will be called. Since 0.3.66 */ int pw_filter_trigger_process(struct pw_filter *filter); +/** Emit an event from this filter. + * Since 1.2.6 */ +int pw_filter_emit_event(struct pw_filter *filter, const struct spa_event *event); + /** * \} */ diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 27169d28f..6e58d6df4 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2546,20 +2546,23 @@ do_trigger_driver(struct spa_loop *loop, return spa_node_call_ready(&impl->callbacks, res); } -static int do_trigger_request_process(struct spa_loop *loop, +static int do_emit_event(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 }; - - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - spa_node_emit_event(&impl->hooks, - spa_pod_builder_add_object(&b, - SPA_TYPE_EVENT_Node, SPA_NODE_EVENT_RequestProcess)); + const struct spa_event *event = data; + spa_node_emit_event(&impl->hooks, event); return 0; } +SPA_EXPORT +int pw_stream_emit_event(struct pw_stream *stream, const struct spa_event *event) +{ + struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); + return pw_loop_invoke(impl->main_loop, + do_emit_event, 1, event, SPA_POD_SIZE(&event->pod), false, impl); +} + SPA_EXPORT int pw_stream_trigger_process(struct pw_stream *stream) { @@ -2577,8 +2580,8 @@ int pw_stream_trigger_process(struct pw_stream *stream) res = pw_loop_invoke(impl->data_loop, 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); + pw_stream_emit_event(stream, + &SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess)); } return res; } diff --git a/src/pipewire/stream.h b/src/pipewire/stream.h index 876a26c46..f90917ccb 100644 --- a/src/pipewire/stream.h +++ b/src/pipewire/stream.h @@ -229,6 +229,7 @@ struct pw_stream; #include #include #include +#include /** \enum pw_stream_state The state of a stream */ enum pw_stream_state { @@ -622,6 +623,10 @@ bool pw_stream_is_driving(struct pw_stream *stream); * Since 0.3.34 */ int pw_stream_trigger_process(struct pw_stream *stream); +/** Emit an event from this stream. + * Since 1.2.6 */ +int pw_stream_emit_event(struct pw_stream *stream, const struct spa_event *event); + /** * \} */