From 5ae75e1d2a08bbf7316c299eddbacf175617fee8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 19 Nov 2021 20:24:58 +0100 Subject: [PATCH] pulse-server: use STREAM_CAPTURE_SINK for monitor capture Make the pulseaudio layer set the PW_KEY_STREAM_CAPTURE_SINK property when a monitor device is selected as a source to make it easier for the session manager to find the right source. --- .../module-protocol-pulse/modules/module-echo-cancel.c | 2 ++ src/modules/module-protocol-pulse/modules/module-loopback.c | 2 ++ .../modules/module-simple-protocol-tcp.c | 4 ++++ src/modules/module-protocol-pulse/pulse-server.c | 2 ++ src/modules/module-protocol-simple.c | 2 ++ 5 files changed, 12 insertions(+) diff --git a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c index cd0762cbe..d30f5ef09 100644 --- a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c +++ b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c @@ -200,6 +200,8 @@ struct module *create_module_echo_cancel(struct impl *impl, const char *argument if (spa_strendswith(str, ".monitor")) { pw_properties_setf(source_props, PW_KEY_NODE_TARGET, "%.*s", (int)strlen(str)-8, str); + pw_properties_set(source_props, PW_KEY_STREAM_CAPTURE_SINK, + "true"); } else { pw_properties_set(source_props, PW_KEY_NODE_TARGET, str); } diff --git a/src/modules/module-protocol-pulse/modules/module-loopback.c b/src/modules/module-protocol-pulse/modules/module-loopback.c index 85d567e82..3b6a10324 100644 --- a/src/modules/module-protocol-pulse/modules/module-loopback.c +++ b/src/modules/module-protocol-pulse/modules/module-loopback.c @@ -175,6 +175,8 @@ struct module *create_module_loopback(struct impl *impl, const char *argument) if (spa_strendswith(str, ".monitor")) { pw_properties_setf(capture_props, PW_KEY_NODE_TARGET, "%.*s", (int)strlen(str)-8, str); + pw_properties_set(capture_props, PW_KEY_STREAM_CAPTURE_SINK, + "true"); } else { pw_properties_set(capture_props, PW_KEY_NODE_TARGET, str); } diff --git a/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c b/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c index 3b33d1ea3..421a78a64 100644 --- a/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c +++ b/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c @@ -82,6 +82,8 @@ static int module_simple_protocol_tcp_load(struct client *client, struct module fprintf(f, "capture.node=\"%s\" ", str); if ((str = pw_properties_get(data->module_props, "playback.node")) != NULL) fprintf(f, "playback.node=\"%s\" ", str); + if ((str = pw_properties_get(data->module_props, PW_KEY_STREAM_CAPTURE_SINK)) != NULL) + fprintf(f, PW_KEY_STREAM_CAPTURE_SINK"=\"%s\" ", str); fclose(f); data->mod = pw_context_load_module(impl->context, @@ -181,6 +183,8 @@ struct module *create_module_simple_protocol_tcp(struct impl *impl, const char * if (spa_strendswith(str, ".monitor")) { pw_properties_setf(module_props, "capture.node", "%.*s", (int)strlen(str)-8, str); + pw_properties_set(module_props, PW_KEY_STREAM_CAPTURE_SINK, + "true"); } else { pw_properties_set(module_props, "capture.node", str); } diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index b17cec31a..a047a2ea7 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -1817,6 +1817,8 @@ static int do_create_record_stream(struct client *client, uint32_t command, uint pw_properties_setf(props, PW_KEY_NODE_TARGET, "%.*s", (int)strlen(source_name)-8, source_name); + pw_properties_set(props, + PW_KEY_STREAM_CAPTURE_SINK, "true"); } else { pw_properties_set(props, PW_KEY_NODE_TARGET, source_name); diff --git a/src/modules/module-protocol-simple.c b/src/modules/module-protocol-simple.c index a3cefd0e6..31d0c21f8 100644 --- a/src/modules/module-protocol-simple.c +++ b/src/modules/module-protocol-simple.c @@ -388,6 +388,8 @@ static int create_streams(struct impl *impl, struct client *client) PW_KEY_NODE_GROUP, "pipewire.dummy", PW_KEY_NODE_LATENCY, DEFAULT_LATENCY, PW_KEY_NODE_TARGET, pw_properties_get(impl->props, "capture.node"), + PW_KEY_STREAM_CAPTURE_SINK, pw_properties_get(impl->props, + PW_KEY_STREAM_CAPTURE_SINK), PW_KEY_NODE_NETWORK, "true", NULL); if (props == NULL)