From 7031471807fb55fceed25aaa92855789398337a1 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 20 Apr 2021 21:05:59 +0200 Subject: [PATCH] pulse-server: add property to make virtual nodes Make a property to mark virtual nodes and use it to hide the client id from the sink-input/source-output info in pulse-server. --- src/modules/module-protocol-pulse/manager.c | 10 ++++++++++ src/modules/module-protocol-pulse/manager.h | 1 + src/modules/module-protocol-pulse/pulse-server.c | 6 ++++-- src/pipewire/keys.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/modules/module-protocol-pulse/manager.c b/src/modules/module-protocol-pulse/manager.c index be50147b8..8aff48a4b 100644 --- a/src/modules/module-protocol-pulse/manager.c +++ b/src/modules/module-protocol-pulse/manager.c @@ -856,6 +856,16 @@ bool pw_manager_object_is_monitor(struct pw_manager_object *o) (strcmp(str, "Audio/Sink") == 0); } +bool pw_manager_object_is_virtual(struct pw_manager_object *o) +{ + const char *str; + struct pw_node_info *info; + return strcmp(o->type, PW_TYPE_INTERFACE_Node) == 0 && + (info = o->info) != NULL && info->props != NULL && + (str = spa_dict_lookup(info->props, PW_KEY_NODE_VIRTUAL)) != NULL && + pw_properties_parse_bool(str); +} + bool pw_manager_object_is_source_or_monitor(struct pw_manager_object *o) { return pw_manager_object_is_source(o) || pw_manager_object_is_monitor(o); diff --git a/src/modules/module-protocol-pulse/manager.h b/src/modules/module-protocol-pulse/manager.h index 67af4f835..ba7bc17f6 100644 --- a/src/modules/module-protocol-pulse/manager.h +++ b/src/modules/module-protocol-pulse/manager.h @@ -117,6 +117,7 @@ bool pw_manager_object_is_card(struct pw_manager_object *o); bool pw_manager_object_is_sink(struct pw_manager_object *o); bool pw_manager_object_is_source(struct pw_manager_object *o); bool pw_manager_object_is_monitor(struct pw_manager_object *o); +bool pw_manager_object_is_virtual(struct pw_manager_object *o); bool pw_manager_object_is_source_or_monitor(struct pw_manager_object *o); bool pw_manager_object_is_sink_input(struct pw_manager_object *o); bool pw_manager_object_is_source_output(struct pw_manager_object *o); diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 07df01f9a..02df1eae1 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -4166,7 +4166,8 @@ static int fill_sink_input_info(struct client *client, struct message *m, if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) module_id = (uint32_t)atoi(str); - if ((str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) + if (!pw_manager_object_is_virtual(o) && + (str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) client_id = (uint32_t)atoi(str); collect_device_info(o, NULL, &dev_info); @@ -4236,7 +4237,8 @@ static int fill_source_output_info(struct client *client, struct message *m, if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) module_id = (uint32_t)atoi(str); - if ((str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) + if (!pw_manager_object_is_virtual(o) && + (str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) client_id = (uint32_t)atoi(str); collect_device_info(o, NULL, &dev_info); diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index 481be53fe..de365449a 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -152,6 +152,8 @@ extern "C" { #define PW_KEY_NODE_DRIVER "node.driver" /**< node can drive the graph */ #define PW_KEY_NODE_STREAM "node.stream" /**< node is a stream, the server side should * add a converter */ +#define PW_KEY_NODE_VIRTUAL "node.virtual" /**< the node is some sort of virtual + * object */ /** Port keys */ #define PW_KEY_PORT_ID "port.id" /**< port id */ #define PW_KEY_PORT_NAME "port.name" /**< port name */