diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 7241cb344..bd914fd22 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -2111,7 +2111,7 @@ int pw_filter_trigger_process(struct pw_filter *filter) pw_log_trace_fp("%p: driving:%d", impl, filter->node->driving); if (impl->trigger) { - pw_impl_node_trigger(filter->node); + res = pw_impl_node_trigger(filter->node); } else if (filter->node->driving) { res = pw_loop_invoke(impl->data_loop, do_trigger_process, 1, NULL, 0, false, impl); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index a34b4b6d4..2f233cb57 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -1523,8 +1523,7 @@ int pw_impl_node_trigger(struct pw_impl_node *node) { uint64_t nsec = get_time_ns(node->rt.target.system); struct pw_node_target *t = &node->rt.target; - t->trigger(t, nsec); - return 0; + return t->trigger(t, nsec); } static void node_on_fd_events(struct spa_source *source) diff --git a/src/pipewire/private.h b/src/pipewire/private.h index bb181b617..477e5adbe 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -539,7 +539,7 @@ struct pw_node_target { struct pw_node_activation *activation; struct spa_system *system; int fd; - void (*trigger)(struct pw_node_target *t, uint64_t nsec); + int (*trigger)(struct pw_node_target *t, uint64_t nsec); unsigned int active:1; unsigned int added:1; }; @@ -653,44 +653,53 @@ static inline uint64_t get_time_ns(struct spa_system *system) /* called from data-loop decrement the dependency counter of the target and when * there are no more dependencies, trigger the node. */ -static inline void trigger_target_v1(struct pw_node_target *t, uint64_t nsec) +static inline int trigger_target_v1(struct pw_node_target *t, uint64_t nsec) { struct pw_node_activation *a = t->activation; struct pw_node_activation_state *state = &a->state[0]; int32_t pending = SPA_ATOMIC_DEC(state->pending); + int res = pending == 0, r; pw_log_trace_fp("%p: (%s-%u) state:%p pending:%d/%d", t->node, t->name, t->id, state, pending, state->required); - if (pending == 0) { - if (SPA_ATOMIC_CAS(a->status, + if (res) { + if (SPA_LIKELY(SPA_ATOMIC_CAS(a->status, PW_NODE_ACTIVATION_NOT_TRIGGERED, - PW_NODE_ACTIVATION_TRIGGERED)) { + PW_NODE_ACTIVATION_TRIGGERED))) { a->signal_time = nsec; - if (SPA_UNLIKELY(spa_system_eventfd_write(t->system, t->fd, 1) < 0)) - pw_log_warn("%p: write failed %m", t->node); + if (SPA_UNLIKELY((r = spa_system_eventfd_write(t->system, t->fd, 1)) < 0)) { + pw_log_warn("%p: write failed %s", t->node, spa_strerror(r)); + res = r; + } } else { pw_log_trace_fp("%p: (%s-%u) not ready %d", t->node, t->name, t->id, a->status); + res = -EIO; } } + return res; } -static inline void trigger_target_v0(struct pw_node_target *t, uint64_t nsec) +static inline int trigger_target_v0(struct pw_node_target *t, uint64_t nsec) { struct pw_node_activation *a = t->activation; struct pw_node_activation_state *state = &a->state[0]; int32_t pending = SPA_ATOMIC_DEC(state->pending); + int res = pending == 0, r; pw_log_trace_fp("%p: (%s-%u) state:%p pending:%d/%d", t->node, t->name, t->id, state, pending, state->required); - if (pending == 0) { + if (res) { SPA_ATOMIC_STORE(a->status, PW_NODE_ACTIVATION_TRIGGERED); a->signal_time = nsec; - if (SPA_UNLIKELY(spa_system_eventfd_write(t->system, t->fd, 1) < 0)) - pw_log_warn("%p: write failed %m", t->node); + if (SPA_UNLIKELY((r = spa_system_eventfd_write(t->system, t->fd, 1)) < 0)) { + res = r; + pw_log_warn("%p: write failed %s", t->node, spa_strerror(r)); + } } + return res; } struct pw_node_peer { diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 377bab71a..25731cb25 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -2579,7 +2579,7 @@ int pw_stream_trigger_process(struct pw_stream *stream) impl->using_trigger = true; if (impl->trigger) { - pw_impl_node_trigger(stream->node); + res = pw_impl_node_trigger(stream->node); } else if (stream->node->driving) { res = pw_loop_invoke(impl->data_loop, do_trigger_driver, 1, NULL, 0, false, impl);