From 7529e7c47cb87cdbeca9546f8ae4143c4e0086e2 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 31 Aug 2021 16:06:04 +0200 Subject: [PATCH] stream: add trigger_done event It is emited after the graph cycle that was started with trigger_process() completed. --- src/examples/video-play-pull.c | 8 ++++++++ src/examples/video-src.c | 7 +++++++ src/pipewire/private.h | 1 + src/pipewire/stream.c | 23 +++++++++++++++++++++++ src/pipewire/stream.h | 5 ++++- 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/examples/video-play-pull.c b/src/examples/video-play-pull.c index 27694fdf3..6c8b0e17c 100644 --- a/src/examples/video-play-pull.c +++ b/src/examples/video-play-pull.c @@ -287,6 +287,13 @@ on_stream_io_changed(void *_data, uint32_t id, void *area, uint32_t size) } } +static void +on_trigger_done(void *_data) +{ + struct data *data = _data; + pw_log_trace("%p trigger done", data); +} + static void on_timeout(void *userdata, uint64_t expirations) { struct data *data = userdata; @@ -424,6 +431,7 @@ static const struct pw_stream_events stream_events = { .io_changed = on_stream_io_changed, .param_changed = on_stream_param_changed, .process = on_process, + .trigger_done = on_trigger_done, }; static int build_format(struct data *data, struct spa_pod_builder *b, const struct spa_pod **params) diff --git a/src/examples/video-src.c b/src/examples/video-src.c index 7457ade84..fc95e1605 100644 --- a/src/examples/video-src.c +++ b/src/examples/video-src.c @@ -275,11 +275,18 @@ on_stream_param_changed(void *_data, uint32_t id, const struct spa_pod *param) pw_stream_update_params(stream, params, 5); } +static void +on_trigger_done(void *_data) +{ + pw_log_trace("trigger done"); +} + static const struct pw_stream_events stream_events = { PW_VERSION_STREAM_EVENTS, .process = on_process, .state_changed = on_stream_state_changed, .param_changed = on_stream_param_changed, + .trigger_done = on_trigger_done, }; static void do_quit(void *userdata, int signal_number) diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 4ad7c538b..a9033eba6 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1004,6 +1004,7 @@ struct pw_core { #define pw_stream_emit_drained(s) pw_stream_emit(s, drained,0) #define pw_stream_emit_control_info(s,i,c) pw_stream_emit(s, control_info, 0, i, c) #define pw_stream_emit_command(s,c) pw_stream_emit(s, command,1,c) +#define pw_stream_emit_trigger_done(s) pw_stream_emit(s, trigger_done,2) struct pw_stream { diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 16357e12f..13ebd95c4 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -418,6 +418,23 @@ static void call_drained(struct stream *impl) do_call_drained, 1, NULL, 0, false, impl); } +static int +do_call_trigger_done(struct spa_loop *loop, + bool async, uint32_t seq, const void *data, size_t size, void *user_data) +{ + struct stream *impl = user_data; + struct pw_stream *stream = &impl->this; + pw_log_trace("%p: trigger_done", stream); + pw_stream_emit_trigger_done(stream); + return 0; +} + +static void call_trigger_done(struct stream *impl) +{ + pw_loop_invoke(impl->context->main_loop, + do_call_trigger_done, 1, NULL, 0, false, impl); +} + static int do_set_position(struct spa_loop *loop, bool async, uint32_t seq, const void *data, size_t size, void *user_data) @@ -940,6 +957,9 @@ static int impl_node_process_input(void *object) io->buffer_id = b ? b->id : SPA_ID_INVALID; io->status = SPA_STATUS_NEED_DATA; } + if (impl->driving && impl->using_trigger) + call_trigger_done(impl); + return SPA_STATUS_NEED_DATA | SPA_STATUS_HAVE_DATA; } @@ -1004,6 +1024,9 @@ again: pw_log_trace("%p: res %d", stream, res); + if (impl->driving && impl->using_trigger && res != SPA_STATUS_HAVE_DATA) + call_trigger_done(impl); + return res; } diff --git a/src/pipewire/stream.h b/src/pipewire/stream.h index fe74a74a5..5404ee90a 100644 --- a/src/pipewire/stream.h +++ b/src/pipewire/stream.h @@ -210,7 +210,7 @@ struct pw_time { /** Events for a stream. These events are always called from the mainloop * unless explicitly documented otherwise. */ struct pw_stream_events { -#define PW_VERSION_STREAM_EVENTS 1 +#define PW_VERSION_STREAM_EVENTS 2 uint32_t version; void (*destroy) (void *data); @@ -242,6 +242,9 @@ struct pw_stream_events { /** A command notify, Since 0.3.39:1 */ void (*command) (void *data, const struct spa_command *command); + + /** a trigger_process completed. Since version 0.3.40:2 */ + void (*trigger_done) (void *data); }; /** Convert a stream state to a readable string */