mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
link: improve state handling
This commit is contained in:
parent
7a0a150337
commit
f4672cbe99
1 changed files with 34 additions and 30 deletions
|
|
@ -66,6 +66,25 @@ struct resource_data {
|
|||
|
||||
/** \endcond */
|
||||
|
||||
static void debug_link(struct pw_link *link)
|
||||
{
|
||||
struct pw_node *in = link->input->node, *out = link->output->node;
|
||||
|
||||
pw_log_debug("link %p: %d %d %d out %d %d %d , %d %d %d in %d %d %d", link,
|
||||
out->n_used_input_links,
|
||||
out->n_ready_input_links,
|
||||
out->idle_used_input_links,
|
||||
out->n_used_output_links,
|
||||
out->n_ready_output_links,
|
||||
out->idle_used_output_links,
|
||||
in->n_used_input_links,
|
||||
in->n_ready_input_links,
|
||||
in->idle_used_input_links,
|
||||
in->n_used_output_links,
|
||||
in->n_ready_output_links,
|
||||
in->idle_used_output_links);
|
||||
}
|
||||
|
||||
static void pw_link_update_state(struct pw_link *link, enum pw_link_state state, char *error)
|
||||
{
|
||||
enum pw_link_state old = link->state;
|
||||
|
|
@ -88,9 +107,7 @@ static void pw_link_update_state(struct pw_link *link, enum pw_link_state state,
|
|||
|
||||
pw_link_events_state_changed(link, old, state, error);
|
||||
|
||||
pw_log_debug("link %p: %d %d %d %d", link,
|
||||
out->n_ready_output_links, out->n_used_output_links,
|
||||
in->n_ready_input_links, in->n_used_input_links);
|
||||
debug_link(link);
|
||||
|
||||
if (old != PW_LINK_STATE_PAUSED && state == PW_LINK_STATE_PAUSED) {
|
||||
if (++out->n_ready_output_links == out->n_used_output_links)
|
||||
|
|
@ -1019,9 +1036,12 @@ int pw_link_prepare(struct pw_link *this)
|
|||
this->input->node->n_used_input_links++;
|
||||
|
||||
if (impl->passive) {
|
||||
this->input->node->idle_used_input_links++;
|
||||
this->output->node->idle_used_output_links++;
|
||||
this->input->node->idle_used_input_links++;
|
||||
}
|
||||
|
||||
debug_link(this);
|
||||
|
||||
pw_work_queue_add(impl->work,
|
||||
this, -EBUSY, (pw_work_func_t) check_states, this);
|
||||
|
||||
|
|
@ -1079,21 +1099,13 @@ int pw_link_deactivate(struct pw_link *this)
|
|||
output_node->idle_used_output_links--;
|
||||
}
|
||||
|
||||
pw_log_debug("link %p: in %d %d, out %d %d, %d %d %d %d", this,
|
||||
input_node->n_used_input_links,
|
||||
input_node->n_used_output_links,
|
||||
output_node->n_used_input_links,
|
||||
output_node->n_used_output_links,
|
||||
input_node->idle_used_input_links,
|
||||
input_node->idle_used_output_links,
|
||||
output_node->idle_used_input_links,
|
||||
output_node->idle_used_output_links);
|
||||
debug_link(this);
|
||||
|
||||
if (input_node->n_used_input_links <= input_node->idle_used_input_links &&
|
||||
input_node->n_used_output_links <= input_node->idle_used_output_links &&
|
||||
input_node->info.state > PW_NODE_STATE_IDLE) {
|
||||
pw_node_update_state(input_node, PW_NODE_STATE_IDLE, NULL);
|
||||
pw_log_debug("port %p: state %d -> %d", this->input,
|
||||
pw_node_set_state(input_node, PW_NODE_STATE_IDLE);
|
||||
pw_log_debug("port %p: input state %d -> %d", this->input,
|
||||
this->input->state, PW_PORT_STATE_PAUSED);
|
||||
}
|
||||
this->rt.in_mix.state = PW_PORT_STATE_CONFIGURE;
|
||||
|
|
@ -1101,8 +1113,8 @@ int pw_link_deactivate(struct pw_link *this)
|
|||
if (output_node->n_used_input_links <= output_node->idle_used_input_links &&
|
||||
output_node->n_used_output_links <= output_node->idle_used_output_links &&
|
||||
output_node->info.state > PW_NODE_STATE_IDLE) {
|
||||
pw_node_update_state(output_node, PW_NODE_STATE_IDLE, NULL);
|
||||
pw_log_debug("port %p: state %d -> %d", this->output,
|
||||
pw_node_set_state(output_node, PW_NODE_STATE_IDLE);
|
||||
pw_log_debug("port %p: output state %d -> %d", this->output,
|
||||
this->output->state, PW_PORT_STATE_PAUSED);
|
||||
}
|
||||
this->rt.out_mix.state = PW_PORT_STATE_CONFIGURE;
|
||||
|
|
@ -1253,7 +1265,7 @@ struct pw_link *pw_link_new(struct pw_core *core,
|
|||
|
||||
this = &impl->this;
|
||||
this->feedback = pw_link_is_feedback(input_node, output_node);
|
||||
pw_log_debug("link %p: new feedback %d", this, this->feedback);
|
||||
pw_log_debug("link %p: new %p -> %p", this, input, output);
|
||||
|
||||
if (user_data_size > 0)
|
||||
this->user_data = SPA_MEMBER(impl, sizeof(struct impl), void);
|
||||
|
|
@ -1284,8 +1296,8 @@ struct pw_link *pw_link_new(struct pw_core *core,
|
|||
|
||||
input_node->live = output_node->live;
|
||||
|
||||
pw_log_debug("link %p: output node %p live %d",
|
||||
this, output_node, output_node->live);
|
||||
pw_log_debug("link %p: output node %p live %d, passive %d, feedback %d",
|
||||
this, output_node, output_node->live, impl->passive, this->feedback);
|
||||
|
||||
spa_list_append(&output->links, &this->output_link);
|
||||
spa_list_append(&input->links, &this->input_link);
|
||||
|
|
@ -1380,19 +1392,11 @@ int pw_link_register(struct pw_link *link,
|
|||
link->info.id = link->global->id;
|
||||
pw_global_register(link->global, owner, parent);
|
||||
|
||||
pw_log_debug("link %p: in %d %d, out %d %d, %d %d %d %d", link,
|
||||
input_node->n_used_input_links,
|
||||
input_node->n_used_output_links,
|
||||
output_node->n_used_input_links,
|
||||
output_node->n_used_output_links,
|
||||
input_node->idle_used_input_links,
|
||||
input_node->idle_used_output_links,
|
||||
output_node->idle_used_input_links,
|
||||
output_node->idle_used_output_links);
|
||||
debug_link(link);
|
||||
|
||||
if ((input_node->n_used_input_links >= input_node->idle_used_input_links ||
|
||||
output_node->n_used_output_links >= output_node->idle_used_output_links) &&
|
||||
input_node->active && output_node->active && !impl->passive)
|
||||
input_node->active && output_node->active)
|
||||
pw_link_prepare(link);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue