mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-11 13:30:07 -05:00
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:
parent
953876bd58
commit
bcec0ad103
3 changed files with 24 additions and 7 deletions
|
|
@ -1189,6 +1189,20 @@ static inline int process_node(void *data)
|
||||||
return 0;
|
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)
|
static void node_on_fd_events(struct spa_source *source)
|
||||||
{
|
{
|
||||||
struct pw_impl_node *this = source->data;
|
struct pw_impl_node *this = source->data;
|
||||||
|
|
|
||||||
|
|
@ -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_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
|
/** Prepare a link
|
||||||
* Starts the negotiation of formats and buffers on \a link */
|
* Starts the negotiation of formats and buffers on \a link */
|
||||||
int pw_impl_link_prepare(struct pw_impl_link *link);
|
int pw_impl_link_prepare(struct pw_impl_link *link);
|
||||||
|
|
|
||||||
|
|
@ -2433,7 +2433,7 @@ bool pw_stream_is_driving(struct pw_stream *stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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)
|
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||||
{
|
{
|
||||||
struct stream *impl = 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 */
|
/* flag to check for old or new behaviour */
|
||||||
impl->using_trigger = true;
|
impl->using_trigger = true;
|
||||||
|
|
||||||
if (!impl->driving && !impl->trigger) {
|
if (impl->trigger) {
|
||||||
res = pw_loop_invoke(impl->main_loop,
|
pw_impl_node_trigger(stream->node);
|
||||||
do_trigger_request_process, 1, NULL, 0, false, impl);
|
} else if (impl->driving) {
|
||||||
} else {
|
|
||||||
if (!impl->process_rt)
|
if (!impl->process_rt)
|
||||||
call_process(impl);
|
call_process(impl);
|
||||||
|
|
||||||
res = pw_loop_invoke(impl->data_loop,
|
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;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue