node: add node.sync-group and node.sync

node.sync-group can contain a list of strings. When a node in the graph
sets node.sync = true, it will be scheduled with all of the other nodes with
common node.sync-group strings. By default all nodes are placed in
group.sync.0 except the freewheel and dummy driver.

Use this to ensure that all nodes are grouped under the same driver
(that is not the freewheel and dummy driver) as soon as the transport is
started so that the transport is visible to all nodes from the same
sync-groups. We also don't deactive the sync-group anymore for the node,
even if the transport is stopped, to avoid driver changes and transport
jumps.

When the node that activated the sync/transport is destroyed, things are
restored to their original state. Note that this is different from JACK
where starting the transport outlives the application and always needs
to be explicitly stopped again. We can't really do this (by default) because
it leaves the graph in an unnatural state with all devices in sync.

The reason for the node.sync-group is that it is possible to still have N
different subgraphs with a separate transports by manually specifying
the node.sync-group.

It's also slightly different from the node.group, that is always active.
The sync-group is something you only want to enable in specific cases
because it groups drivers together and enables adaptive resampling etc.

It's also possible to place this option in the jack.conf file to
automatically sync all devices and apps as soon as a jack app is started.

Fixes #3850
This commit is contained in:
Wim Taymans 2024-02-29 17:49:46 +01:00
parent d063ab7322
commit 06f63f489a
6 changed files with 63 additions and 8 deletions

View file

@ -6803,6 +6803,7 @@ static int transport_update(struct client* c, int active)
pw_log_info("%p: transport %d", c, active);
pw_thread_loop_lock(c->context.loop);
pw_properties_set(c->props, PW_KEY_NODE_SYNC, "true");
pw_properties_set(c->props, PW_KEY_NODE_TRANSPORT,
active ? "true" : "false");