context: when force-quantum, remove lock-quantum

If a node (or metadata) forces a quantum, remove any nodes that
requested a lock-quantum so that we can change the quantum to the new
forced one.

This makes it possible to run jack clients with node.lock-quantum while
still allowing them to change the quantum qith node.force-quantum.
This commit is contained in:
Wim Taymans 2022-02-08 15:36:54 +01:00
parent 0b637c3291
commit 9acae229ab

View file

@ -1068,7 +1068,7 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
struct pw_impl_node *n, *s, *target, *fallback; struct pw_impl_node *n, *s, *target, *fallback;
uint32_t max_quantum, min_quantum, def_quantum, lim_quantum, rate_quantum; uint32_t max_quantum, min_quantum, def_quantum, lim_quantum, rate_quantum;
uint32_t *rates, n_rates, def_rate; uint32_t *rates, n_rates, def_rate;
bool freewheel = false, global_force_rate, force_rate, global_force_quantum; bool freewheel = false, global_force_rate, force_rate, force_quantum, global_force_quantum;
pw_log_info("%p: busy:%d reason:%s", context, impl->recalc, reason); pw_log_info("%p: busy:%d reason:%s", context, impl->recalc, reason);
@ -1083,7 +1083,7 @@ again:
get_quantums(context, &def_quantum, &min_quantum, &max_quantum, &lim_quantum, &rate_quantum); get_quantums(context, &def_quantum, &min_quantum, &max_quantum, &lim_quantum, &rate_quantum);
rates = get_rates(context, &def_rate, &n_rates, &global_force_rate); rates = get_rates(context, &def_rate, &n_rates, &global_force_rate);
global_force_quantum = rate_quantum == 0; force_quantum = global_force_quantum = rate_quantum == 0;
force_rate = global_force_rate; force_rate = global_force_rate;
/* start from all drivers and group all nodes that are linked /* start from all drivers and group all nodes that are linked
@ -1183,6 +1183,7 @@ again:
def_quantum = min_quantum = max_quantum = s->force_quantum; def_quantum = min_quantum = max_quantum = s->force_quantum;
rate_quantum = 0; rate_quantum = 0;
quantum_stamp = s->stamp; quantum_stamp = s->stamp;
force_quantum = true;
} }
if (!global_force_rate && s->force_rate > 0 && if (!global_force_rate && s->force_rate > 0 &&
s->stamp > rate_stamp) { s->stamp > rate_stamp) {
@ -1213,6 +1214,8 @@ again:
running = !n->passive; running = !n->passive;
} }
if (force_quantum)
lock_quantum = false;
if (force_rate) if (force_rate)
lock_rate = false; lock_rate = false;