mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-08 13:30:08 -05:00
context: improve states
Don't try to IDLE a suspended node. Don't try to start an inactive node.
This commit is contained in:
parent
ea9a016797
commit
68268a0116
1 changed files with 17 additions and 15 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue