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 */