impl-node: implement pw_impl_node_trigger

The trigger operation decrements the activation count on a node and
signals the eventfd when 0.

Implement pw_stream_trigger_process() with this new function.
Make the 3 types of trigger operations on a stream more explicit.

trigger:       -> do node_trigger()
driver/driving -> start graph with ready callback
other:         -> emit request trigger event.
This commit is contained in:
Wim Taymans 2023-05-02 14:32:21 +02:00
parent 953876bd58
commit bcec0ad103
3 changed files with 24 additions and 7 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;
}