keys: add node.link-group property

The node.link-group property marks streams that are internally linked
together in some way. It is used to relate the input and output streams
of some of the module streams.
This commit is contained in:
Wim Taymans 2021-06-29 13:49:55 +02:00
parent 6a0cf77985
commit c4971d17c4
5 changed files with 31 additions and 14 deletions

View file

@ -83,6 +83,7 @@
* - \ref PW_KEY_NODE_NAME
* - \ref PW_KEY_NODE_DESCRIPTION
* - \ref PW_KEY_NODE_GROUP
* - \ref PW_KEY_NODE_LINK_GROUP
* - \ref PW_KEY_NODE_VIRTUAL
* - \ref PW_KEY_NODE_LATENCY
* - \ref PW_KEY_REMOTE_NAME
@ -566,13 +567,16 @@ static int setup_streams(struct impl *impl)
uint8_t buffer[1024];
struct spa_pod_builder b;
struct pw_properties *props;
const char *str;
props = pw_properties_new(
PW_KEY_NODE_NAME, "echo-cancel-capture",
PW_KEY_NODE_VIRTUAL, "true",
NULL);
pw_properties_setf(props,
PW_KEY_NODE_GROUP, "echo-cancel-%u", impl->id);
if ((str = pw_properties_get(impl->source_props, PW_KEY_NODE_GROUP)) != NULL)
pw_properties_set(props, PW_KEY_NODE_GROUP, str);
if ((str = pw_properties_get(impl->source_props, PW_KEY_NODE_LINK_GROUP)) != NULL)
pw_properties_set(props, PW_KEY_NODE_LINK_GROUP, str);
if (impl->aec_info->latency)
pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec_info->latency);
@ -595,22 +599,14 @@ static int setup_streams(struct impl *impl)
&impl->source_listener,
&source_events, impl);
impl->sink = pw_stream_new(impl->core,
"echo-cancel sink", impl->sink_props);
impl->sink_props = NULL;
if (impl->sink == NULL)
return -errno;
pw_stream_add_listener(impl->sink,
&impl->sink_listener,
&sink_events, impl);
props = pw_properties_new(
PW_KEY_NODE_NAME, "echo-cancel-playback",
PW_KEY_NODE_VIRTUAL, "true",
NULL);
pw_properties_setf(props,
PW_KEY_NODE_GROUP, "echo-cancel-%u", impl->id);
if ((str = pw_properties_get(impl->sink_props, PW_KEY_NODE_GROUP)) != NULL)
pw_properties_set(props, PW_KEY_NODE_GROUP, str);
if ((str = pw_properties_get(impl->sink_props, PW_KEY_NODE_LINK_GROUP)) != NULL)
pw_properties_set(props, PW_KEY_NODE_LINK_GROUP, str);
if (impl->aec_info->latency)
pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec_info->latency);
@ -623,6 +619,16 @@ static int setup_streams(struct impl *impl)
&impl->playback_listener,
&playback_events, impl);
impl->sink = pw_stream_new(impl->core,
"echo-cancel sink", impl->sink_props);
impl->sink_props = NULL;
if (impl->sink == NULL)
return -errno;
pw_stream_add_listener(impl->sink,
&impl->sink_listener,
&sink_events, impl);
n_params = 0;
spa_pod_builder_init(&b, buffer, sizeof(buffer));
params[n_params++] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat,
@ -922,6 +928,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
copy_props(impl, props, PW_KEY_NODE_NAME);
copy_props(impl, props, PW_KEY_NODE_DESCRIPTION);
copy_props(impl, props, PW_KEY_NODE_GROUP);
copy_props(impl, props, PW_KEY_NODE_LINK_GROUP);
copy_props(impl, props, PW_KEY_NODE_VIRTUAL);
copy_props(impl, props, PW_KEY_NODE_LATENCY);

View file

@ -1758,6 +1758,8 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
if (pw_properties_get(props, PW_KEY_NODE_GROUP) == NULL)
pw_properties_setf(props, PW_KEY_NODE_GROUP, "filter-chain-%u", id);
if (pw_properties_get(props, PW_KEY_NODE_LINK_GROUP) == NULL)
pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "filter-chain-%u", id);
if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL)
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
@ -1772,6 +1774,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
copy_props(impl, props, PW_KEY_NODE_NAME);
copy_props(impl, props, PW_KEY_NODE_DESCRIPTION);
copy_props(impl, props, PW_KEY_NODE_GROUP);
copy_props(impl, props, PW_KEY_NODE_LINK_GROUP);
copy_props(impl, props, PW_KEY_NODE_LATENCY);
copy_props(impl, props, PW_KEY_NODE_VIRTUAL);
copy_props(impl, props, PW_KEY_MEDIA_NAME);

View file

@ -426,6 +426,8 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
if (pw_properties_get(props, PW_KEY_NODE_GROUP) == NULL)
pw_properties_setf(props, PW_KEY_NODE_GROUP, "loopback-%u", id);
if (pw_properties_get(props, PW_KEY_NODE_LINK_GROUP) == NULL)
pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "loopback-%u", id);
if (pw_properties_get(props, PW_KEY_NODE_VIRTUAL) == NULL)
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
@ -440,6 +442,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
copy_props(impl, props, PW_KEY_NODE_NAME);
copy_props(impl, props, PW_KEY_NODE_DESCRIPTION);
copy_props(impl, props, PW_KEY_NODE_GROUP);
copy_props(impl, props, PW_KEY_NODE_LINK_GROUP);
copy_props(impl, props, PW_KEY_NODE_LATENCY);
copy_props(impl, props, PW_KEY_NODE_VIRTUAL);

View file

@ -247,6 +247,7 @@ static void manager_added(void *d, struct pw_manager_object *o)
props = pw_properties_new(NULL, NULL);
pw_properties_set(props, PW_KEY_NODE_TARGET, sink_name);
pw_properties_setf(props, PW_KEY_NODE_GROUP, "combine_sink-%u", data->module->idx);
pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "combine_sink-%u", data->module->idx);
pw_properties_set(props, PW_KEY_NODE_DONT_RECONNECT, "true");
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
pw_properties_set(props, PW_KEY_NODE_PASSIVE, "true");
@ -330,6 +331,7 @@ static int module_combine_sink_load(struct client *client, struct module *module
pw_properties_set(props, PW_KEY_NODE_DESCRIPTION, data->sink_name);
pw_properties_set(props, PW_KEY_MEDIA_CLASS, "Audio/Sink");
pw_properties_setf(props, PW_KEY_NODE_GROUP, "combine_sink-%u", data->module->idx);
pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "combine_sink-%u", data->module->idx);
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
data->sink = pw_stream_new(data->core, data->sink_name, props);

View file

@ -162,6 +162,8 @@ extern "C" {
#define PW_KEY_NODE_PASSIVE "node.passive" /**< indicate that a node wants passive links
* on output/input/all ports when the value is
* "out"/"in"/"true" respectively */
#define PW_KEY_NODE_LINK_GROUP "node.link-group" /**< the node is internally linked to
* nodes with the same link-group */
/** Port keys */
#define PW_KEY_PORT_ID "port.id" /**< port id */