diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index 687848dfb..5512199af 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -121,6 +121,13 @@ static void *create_object(void *_data, pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", d->this->global->id); + client = resource ? pw_resource_get_client(resource): NULL; + + if (client) { + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", + client->global->id); + } + slave = NULL; str = pw_properties_get(properties, "adapt.slave.node"); if (str != NULL) { @@ -164,8 +171,6 @@ static void *create_object(void *_data, pw_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd); - client = resource ? pw_resource_get_client(resource): NULL; - pw_node_register(adapter, NULL); if (client) { diff --git a/src/modules/module-client-device.c b/src/modules/module-client-device.c index c710fc1f3..052484eb3 100644 --- a/src/modules/module-client-device.c +++ b/src/modules/module-client-device.c @@ -63,6 +63,8 @@ static void *create_object(void *_data, struct pw_properties *properties, uint32_t new_id) { + struct factory_data *data = _data; + struct pw_factory *this = data->this; void *result; struct pw_resource *device_resource; struct pw_client *client = pw_resource_get_client(resource); @@ -74,18 +76,33 @@ static void *create_object(void *_data, goto error_resource; } + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) { + res = -errno; + goto error_properties; + } + + pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", + pw_global_get_id(pw_factory_get_global(this))); + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", + pw_global_get_id(pw_client_get_global(client))); + result = pw_client_device_new(device_resource, properties); if (result == NULL) { res = -errno; goto error_device; } - return result; error_resource: pw_log_error("can't create resource: %s", spa_strerror(res)); pw_resource_error(resource, res, "can't create resource: %s", spa_strerror(res)); goto error_exit; +error_properties: + pw_log_error("can't create properties: %s", spa_strerror(res)); + pw_resource_error(resource, res, "can't create properties: %s", spa_strerror(res)); + goto error_exit_free; error_device: pw_log_error("can't create device: %s", spa_strerror(res)); pw_resource_error(resource, res, "can't create device: %s", spa_strerror(res)); diff --git a/src/modules/spa/module-device-factory.c b/src/modules/spa/module-device-factory.c index 2eb0c4557..5ec13c772 100644 --- a/src/modules/spa/module-device-factory.c +++ b/src/modules/spa/module-device-factory.c @@ -85,6 +85,7 @@ static void *create_object(void *_data, struct pw_device *device; const char *factory_name; struct device_data *nd; + struct pw_client *client; int res; if (properties == NULL) @@ -94,6 +95,16 @@ static void *create_object(void *_data, if (factory_name == NULL) goto error_properties; + pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", + pw_global_get_id(pw_factory_get_global(data->this))); + + client = resource ? pw_resource_get_client(resource) : NULL; + + if (client) { + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", + pw_global_get_id(pw_client_get_global(client))); + } + device = pw_spa_device_load(core, factory_name, 0, @@ -110,12 +121,12 @@ static void *create_object(void *_data, pw_device_add_listener(device, &nd->device_listener, &device_events, nd); - if (resource) + if (client) { pw_global_bind(pw_device_get_global(device), - pw_resource_get_client(resource), - PW_PERM_RWX, - version, new_id); - + client, + PW_PERM_RWX, version, + new_id); + } return device; error_properties: diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c index 5f111fff2..1db58c330 100644 --- a/src/modules/spa/module-node-factory.c +++ b/src/modules/spa/module-node-factory.c @@ -104,6 +104,7 @@ static void *create_object(void *_data, const char *factory_name; struct node_data *nd; int res; + struct pw_client *client; if (properties == NULL) goto error_properties; @@ -112,9 +113,16 @@ static void *create_object(void *_data, if (factory_name == NULL) goto error_properties; + client = resource ? pw_resource_get_client(resource) : NULL; + pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", pw_global_get_id(pw_factory_get_global(data->this))); + if (client) { + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", + pw_global_get_id(pw_client_get_global(client))); + } + node = pw_spa_node_load(core, factory_name, PW_SPA_NODE_FLAG_ACTIVATE, @@ -130,9 +138,8 @@ static void *create_object(void *_data, pw_node_add_listener(node, &nd->node_listener, &node_events, nd); - if (resource) { + if (client) { struct pw_resource *bound_resource; - struct pw_client *client = pw_resource_get_client(resource); res = pw_global_bind(pw_node_get_global(node), client, diff --git a/src/pipewire/device.c b/src/pipewire/device.c index 1be3aaed1..16dfc77f0 100644 --- a/src/pipewire/device.c +++ b/src/pipewire/device.c @@ -407,7 +407,9 @@ int pw_device_register(struct pw_device *device, struct pw_core *core = device->core; struct object_data *od; const char *keys[] = { + PW_KEY_OBJECT_PATH, PW_KEY_MODULE_ID, + PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, PW_KEY_DEVICE_DESCRIPTION, PW_KEY_DEVICE_NAME, diff --git a/src/pipewire/link.c b/src/pipewire/link.c index d5c75da69..28fe2c6c1 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1207,6 +1207,8 @@ int pw_link_register(struct pw_link *link, struct pw_core *core = link->core; struct pw_node *output_node, *input_node; const char *keys[] = { + PW_KEY_OBJECT_PATH, + PW_KEY_MODULE_ID, PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, NULL diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 24aab360b..d3f68ee0b 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -550,6 +550,8 @@ int pw_node_register(struct pw_node *this, struct pw_port *port; const char *keys[] = { PW_KEY_OBJECT_PATH, + PW_KEY_MODULE_ID, + PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, PW_KEY_DEVICE_ID, PW_KEY_NODE_DESCRIPTION,