link: improve state handling

This commit is contained in:
Wim Taymans 2018-09-26 10:52:11 +02:00
parent 7a0a150337
commit f4672cbe99

View file

@ -66,6 +66,25 @@ struct resource_data {
/** \endcond */ /** \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) static void pw_link_update_state(struct pw_link *link, enum pw_link_state state, char *error)
{ {
enum pw_link_state old = link->state; 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_link_events_state_changed(link, old, state, error);
pw_log_debug("link %p: %d %d %d %d", link, debug_link(link);
out->n_ready_output_links, out->n_used_output_links,
in->n_ready_input_links, in->n_used_input_links);
if (old != PW_LINK_STATE_PAUSED && state == PW_LINK_STATE_PAUSED) { if (old != PW_LINK_STATE_PAUSED && state == PW_LINK_STATE_PAUSED) {
if (++out->n_ready_output_links == out->n_used_output_links) 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++; this->input->node->n_used_input_links++;
if (impl->passive) { if (impl->passive) {
this->input->node->idle_used_input_links++;
this->output->node->idle_used_output_links++; this->output->node->idle_used_output_links++;
this->input->node->idle_used_input_links++;
} }
debug_link(this);
pw_work_queue_add(impl->work, pw_work_queue_add(impl->work,
this, -EBUSY, (pw_work_func_t) check_states, this); 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--; output_node->idle_used_output_links--;
} }
pw_log_debug("link %p: in %d %d, out %d %d, %d %d %d %d", this, debug_link(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);
if (input_node->n_used_input_links <= input_node->idle_used_input_links && 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->n_used_output_links <= input_node->idle_used_output_links &&
input_node->info.state > PW_NODE_STATE_IDLE) { input_node->info.state > PW_NODE_STATE_IDLE) {
pw_node_update_state(input_node, PW_NODE_STATE_IDLE, NULL); pw_node_set_state(input_node, PW_NODE_STATE_IDLE);
pw_log_debug("port %p: state %d -> %d", this->input, pw_log_debug("port %p: input state %d -> %d", this->input,
this->input->state, PW_PORT_STATE_PAUSED); this->input->state, PW_PORT_STATE_PAUSED);
} }
this->rt.in_mix.state = PW_PORT_STATE_CONFIGURE; 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 && 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->n_used_output_links <= output_node->idle_used_output_links &&
output_node->info.state > PW_NODE_STATE_IDLE) { output_node->info.state > PW_NODE_STATE_IDLE) {
pw_node_update_state(output_node, PW_NODE_STATE_IDLE, NULL); pw_node_set_state(output_node, PW_NODE_STATE_IDLE);
pw_log_debug("port %p: state %d -> %d", this->output, pw_log_debug("port %p: output state %d -> %d", this->output,
this->output->state, PW_PORT_STATE_PAUSED); this->output->state, PW_PORT_STATE_PAUSED);
} }
this->rt.out_mix.state = PW_PORT_STATE_CONFIGURE; 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 = &impl->this;
this->feedback = pw_link_is_feedback(input_node, output_node); 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) if (user_data_size > 0)
this->user_data = SPA_MEMBER(impl, sizeof(struct impl), void); 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; input_node->live = output_node->live;
pw_log_debug("link %p: output node %p live %d", pw_log_debug("link %p: output node %p live %d, passive %d, feedback %d",
this, output_node, output_node->live); this, output_node, output_node->live, impl->passive, this->feedback);
spa_list_append(&output->links, &this->output_link); spa_list_append(&output->links, &this->output_link);
spa_list_append(&input->links, &this->input_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; link->info.id = link->global->id;
pw_global_register(link->global, owner, parent); pw_global_register(link->global, owner, parent);
pw_log_debug("link %p: in %d %d, out %d %d, %d %d %d %d", link, debug_link(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);
if ((input_node->n_used_input_links >= input_node->idle_used_input_links || 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) && 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); pw_link_prepare(link);
return 0; return 0;