mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
node: add node.lock-quantum property
The graph will not switch quantums when there is an active node with the node.lock-quantum property set to true. It can be used to stop certain jack clients from crashing when the quantum changes.
This commit is contained in:
parent
9f2d6d6d28
commit
7bec96640c
4 changed files with 10 additions and 2 deletions
|
|
@ -1112,7 +1112,7 @@ again:
|
||||||
|
|
||||||
/* assign final quantum and set state for followers and drivers */
|
/* assign final quantum and set state for followers and drivers */
|
||||||
spa_list_for_each(n, &context->driver_list, driver_link) {
|
spa_list_for_each(n, &context->driver_list, driver_link) {
|
||||||
bool running = false;
|
bool running = false, lock_quantum = false;
|
||||||
uint32_t quantum = 0;
|
uint32_t quantum = 0;
|
||||||
|
|
||||||
if (!n->driving || n->exported)
|
if (!n->driving || n->exported)
|
||||||
|
|
@ -1121,6 +1121,8 @@ again:
|
||||||
/* collect quantum and count active nodes */
|
/* collect quantum and count active nodes */
|
||||||
spa_list_for_each(s, &n->follower_list, follower_link) {
|
spa_list_for_each(s, &n->follower_list, follower_link) {
|
||||||
|
|
||||||
|
lock_quantum |= s->lock_quantum;
|
||||||
|
|
||||||
if (s->quantum_size > 0) {
|
if (s->quantum_size > 0) {
|
||||||
if (quantum == 0 || s->quantum_size < quantum)
|
if (quantum == 0 || s->quantum_size < quantum)
|
||||||
quantum = s->quantum_size;
|
quantum = s->quantum_size;
|
||||||
|
|
@ -1147,7 +1149,7 @@ again:
|
||||||
|
|
||||||
n->rt.position->clock.rate = SPA_FRACTION(1, def_rate);
|
n->rt.position->clock.rate = SPA_FRACTION(1, def_rate);
|
||||||
}
|
}
|
||||||
if (quantum != n->rt.position->clock.duration) {
|
if (quantum != n->rt.position->clock.duration && !lock_quantum) {
|
||||||
pw_log_info("(%s-%u) new quantum:%"PRIu64"->%u",
|
pw_log_info("(%s-%u) new quantum:%"PRIu64"->%u",
|
||||||
n->name, n->info.id,
|
n->name, n->info.id,
|
||||||
n->rt.position->clock.duration,
|
n->rt.position->clock.duration,
|
||||||
|
|
|
||||||
|
|
@ -914,6 +914,8 @@ static void check_properties(struct pw_impl_node *node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
str = pw_properties_get(node->properties, PW_KEY_NODE_LOCK_QUANTUM);
|
||||||
|
node->lock_quantum = str ? pw_properties_parse_bool(str) : false;
|
||||||
|
|
||||||
pw_log_debug(NAME" %p: driver:%d recalc:%s active:%d", node, node->driver,
|
pw_log_debug(NAME" %p: driver:%d recalc:%s active:%d", node, node->driver,
|
||||||
recalc_reason, node->active);
|
recalc_reason, node->active);
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,9 @@ extern "C" {
|
||||||
* a fraction. Ex: 128/48000 */
|
* a fraction. Ex: 128/48000 */
|
||||||
#define PW_KEY_NODE_MAX_LATENCY "node.max-latency" /**< the maximum supported latency of the
|
#define PW_KEY_NODE_MAX_LATENCY "node.max-latency" /**< the maximum supported latency of the
|
||||||
* node as a fraction. Ex: 1024/48000 */
|
* node as a fraction. Ex: 1024/48000 */
|
||||||
|
#define PW_KEY_NODE_LOCK_QUANTUM "node.lock-quantum" /**< don't change quantum when this node
|
||||||
|
* is active */
|
||||||
|
|
||||||
#define PW_KEY_NODE_DONT_RECONNECT "node.dont-reconnect" /**< don't reconnect this node */
|
#define PW_KEY_NODE_DONT_RECONNECT "node.dont-reconnect" /**< don't reconnect this node */
|
||||||
#define PW_KEY_NODE_ALWAYS_PROCESS "node.always-process" /**< process even when unlinked */
|
#define PW_KEY_NODE_ALWAYS_PROCESS "node.always-process" /**< process even when unlinked */
|
||||||
#define PW_KEY_NODE_WANT_DRIVER "node.want-driver" /**< the node wants to be grouped with a driver
|
#define PW_KEY_NODE_WANT_DRIVER "node.want-driver" /**< the node wants to be grouped with a driver
|
||||||
|
|
|
||||||
|
|
@ -677,6 +677,7 @@ struct pw_impl_node {
|
||||||
unsigned int freewheel:1; /**< if this is the freewheel driver */
|
unsigned int freewheel:1; /**< if this is the freewheel driver */
|
||||||
unsigned int loopchecked:1; /**< for feedback loop checking */
|
unsigned int loopchecked:1; /**< for feedback loop checking */
|
||||||
unsigned int always_process:1; /**< this node wants to always be processing, even when idle */
|
unsigned int always_process:1; /**< this node wants to always be processing, even when idle */
|
||||||
|
unsigned int lock_quantum:1; /**< don't change graph quantum */
|
||||||
|
|
||||||
uint32_t port_user_data_size; /**< extra size for port user data */
|
uint32_t port_user_data_size; /**< extra size for port user data */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue