From c4971d17c46972c739d16e702f77eddbe5b30507 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 29 Jun 2021 13:49:55 +0200 Subject: [PATCH] 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. --- src/modules/module-echo-cancel.c | 35 +++++++++++-------- src/modules/module-filter-chain.c | 3 ++ src/modules/module-loopback.c | 3 ++ .../modules/module-combine-sink.c | 2 ++ src/pipewire/keys.h | 2 ++ 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/modules/module-echo-cancel.c b/src/modules/module-echo-cancel.c index 976edf352..d01e3b88e 100644 --- a/src/modules/module-echo-cancel.c +++ b/src/modules/module-echo-cancel.c @@ -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); diff --git a/src/modules/module-filter-chain.c b/src/modules/module-filter-chain.c index 3803a71a2..ef3488dfa 100644 --- a/src/modules/module-filter-chain.c +++ b/src/modules/module-filter-chain.c @@ -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); diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c index d379398df..9dd312d86 100644 --- a/src/modules/module-loopback.c +++ b/src/modules/module-loopback.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-combine-sink.c b/src/modules/module-protocol-pulse/modules/module-combine-sink.c index 4b3a2c3e2..a8528b8f3 100644 --- a/src/modules/module-protocol-pulse/modules/module-combine-sink.c +++ b/src/modules/module-protocol-pulse/modules/module-combine-sink.c @@ -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); diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index baa4e165f..82c91e9b1 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -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 */