context: improve states

Don't try to IDLE a suspended node.
Don't try to start an inactive node.
This commit is contained in:
Wim Taymans 2020-04-28 11:42:45 +02:00
parent ea9a016797
commit 68268a0116

View file

@ -738,6 +738,16 @@ error:
return res; return res;
} }
static int ensure_state(struct pw_impl_node *node, bool running)
{
enum pw_node_state state = node->info.state;
if (node->active && running)
state = PW_NODE_STATE_RUNNING;
else if (state > PW_NODE_STATE_IDLE)
state = PW_NODE_STATE_IDLE;
return pw_impl_node_set_state(node, state);
}
static int collect_nodes(struct pw_impl_node *driver) static int collect_nodes(struct pw_impl_node *driver)
{ {
struct spa_list queue; struct spa_list queue;
@ -849,15 +859,14 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
pw_impl_node_set_driver(n, t); pw_impl_node_set_driver(n, t);
if (t == NULL) if (t == NULL)
pw_impl_node_set_state(n, PW_NODE_STATE_IDLE); ensure_state(n, false);
} }
n->visited = false; n->visited = false;
} }
/* assign final quantum and set state for followers and master */ /* assign final quantum and set state for followers and master */
spa_list_for_each(n, &context->driver_list, driver_link) { spa_list_for_each(n, &context->driver_list, driver_link) {
enum pw_node_state state; bool running = false;
uint32_t n_active = 0;
uint32_t max_quantum = 0; uint32_t max_quantum = 0;
uint32_t min_quantum = 0; uint32_t min_quantum = 0;
uint32_t quantum; uint32_t quantum;
@ -870,7 +879,7 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
if (s == n) if (s == n)
continue; continue;
if (s->active) if (s->active)
n_active++; running = true;
if (s->quantum_size > 0) { if (s->quantum_size > 0) {
if (min_quantum == 0 || s->quantum_size < min_quantum) if (min_quantum == 0 || s->quantum_size < min_quantum)
min_quantum = s->quantum_size; min_quantum = s->quantum_size;
@ -893,24 +902,17 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
n->rt.position->clock.duration = quantum; n->rt.position->clock.duration = quantum;
} }
pw_log_debug(NAME" %p: master %p n_active:%d quantum:%u '%s'", context, n, pw_log_debug(NAME" %p: master %p running:%d quantum:%u '%s'", context, n,
n_active, quantum, n->name); running, quantum, n->name);
state = n->info.state;
if (n_active > 0)
state = PW_NODE_STATE_RUNNING;
else if (state > PW_NODE_STATE_IDLE)
state = PW_NODE_STATE_IDLE;
spa_list_for_each(s, &n->follower_list, follower_link) { spa_list_for_each(s, &n->follower_list, follower_link) {
if (s == n) if (s == n)
continue; continue;
pw_log_debug(NAME" %p: follower %p: active:%d '%s'", pw_log_debug(NAME" %p: follower %p: active:%d '%s'",
context, s, s->active, s->name); context, s, s->active, s->name);
if (s->active) ensure_state(s, running);
pw_impl_node_set_state(s, state);
} }
pw_impl_node_set_state(n, state); ensure_state(n, running);
} }
impl->recalc = false; impl->recalc = false;
return 0; return 0;