diff --git a/src/modules/module-client-device/resource-device.c b/src/modules/module-client-device/resource-device.c index cd3767a17..1b5ca1600 100644 --- a/src/modules/module-client-device/resource-device.c +++ b/src/modules/module-client-device/resource-device.c @@ -104,7 +104,7 @@ static void device_initialized(void *data) struct pw_global *global = pw_device_get_global(device); pw_log_debug("client-device %p: initialized global:%d", impl, global->id); - pw_resource_bound_id(impl->resource, global->id); + pw_resource_set_bound_id(impl->resource, global->id); } static const struct pw_device_events device_events = { diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index 2a5f75d26..32e731648 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -1228,7 +1228,7 @@ void pw_client_node_registered(struct pw_client_node *this, struct pw_global *gl if (this->resource == NULL) return; - pw_resource_bound_id(this->resource, node_id); + pw_resource_set_bound_id(this->resource, node_id); pw_client_node_resource_transport(this->resource, impl->other_fds[0], diff --git a/src/modules/module-session-manager/endpoint.c b/src/modules/module-session-manager/endpoint.c index 8eff33172..927543692 100644 --- a/src/modules/module-session-manager/endpoint.c +++ b/src/modules/module-session-manager/endpoint.c @@ -339,7 +339,7 @@ int endpoint_init(struct endpoint *this, this->info.id = this->global->id; this->info.props = &this->props->dict; - pw_resource_bound_id(client_ep->resource, this->global->id); + pw_resource_set_bound_id(client_ep->resource, this->global->id); return pw_global_register(this->global); diff --git a/src/modules/module-session-manager/session.c b/src/modules/module-session-manager/session.c index b655383e1..d46a44421 100644 --- a/src/modules/module-session-manager/session.c +++ b/src/modules/module-session-manager/session.c @@ -300,7 +300,7 @@ int session_init(struct session *this, this->info.id = this->global->id; this->info.props = &this->props->dict; - pw_resource_bound_id(client_sess->resource, this->global->id); + pw_resource_set_bound_id(client_sess->resource, this->global->id); return pw_global_register(this->global); diff --git a/src/pipewire/client.c b/src/pipewire/client.c index 469285c17..c435473e9 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -212,7 +212,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); if (resource->id == 1) client->client_resource = resource; diff --git a/src/pipewire/core-proxy.c b/src/pipewire/core-proxy.c index d6b000703..2faa1d8c6 100644 --- a/src/pipewire/core-proxy.c +++ b/src/pipewire/core-proxy.c @@ -91,7 +91,7 @@ static void core_event_bound_id(void *data, uint32_t id, uint32_t global_id) pw_log_debug(NAME" %p: proxy %u bound %u", this, id, global_id); if ((proxy = pw_map_lookup(&this->objects, id)) != NULL) { - pw_proxy_emit_bound(proxy, global_id); + pw_proxy_set_bound_id(proxy, global_id); } } diff --git a/src/pipewire/core.c b/src/pipewire/core.c index f85fdbfd8..c62000947 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -431,7 +431,7 @@ global_bind(void *_data, &core_methods, resource); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); if (resource->id == 0) client->core_resource = resource; diff --git a/src/pipewire/device.c b/src/pipewire/device.c index 74294652d..95242b6cf 100644 --- a/src/pipewire/device.c +++ b/src/pipewire/device.c @@ -375,7 +375,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = PW_DEVICE_CHANGE_MASK_ALL; pw_device_resource_info(resource, &this->info); diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index fc091c53a..0baebb6e6 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -138,7 +138,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = ~0; pw_factory_resource_info(resource, &this->info); diff --git a/src/pipewire/link.c b/src/pipewire/link.c index b9e3d3c11..a8f336f5e 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -824,7 +824,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = ~0; pw_link_resource_info(resource, &this->info); diff --git a/src/pipewire/module.c b/src/pipewire/module.c index b80cc89e4..cddcaf857 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -139,7 +139,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = ~0; pw_module_resource_info(resource, &this->info); diff --git a/src/pipewire/node.c b/src/pipewire/node.c index bc70c3e6e..ca2d922e6 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -522,7 +522,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = PW_NODE_CHANGE_MASK_ALL; pw_node_resource_info(resource, &this->info); diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 962049bd4..c90f741d1 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -752,7 +752,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, pw_log_debug(NAME" %p: bound to %d", this, resource->id); spa_list_append(&global->resource_list, &resource->link); - pw_resource_bound_id(resource, global->id); + pw_resource_set_bound_id(resource, global->id); this->info.change_mask = PW_PORT_CHANGE_MASK_ALL; pw_port_resource_info(resource, &this->info); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index d6bdd048b..6b3d3eaa8 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -692,6 +692,7 @@ struct pw_resource { uint32_t permissions; /**< resource permissions */ uint32_t type; /**< type of the client interface */ uint32_t version; /**< version of the client interface */ + uint32_t bound_id; /**< global id we are bound to */ unsigned int removed:1; /**< resource was removed from server */ @@ -717,6 +718,7 @@ struct pw_proxy { uint32_t id; /**< client side id */ uint32_t type; /**< type of the interface */ uint32_t version; /**< client side version */ + uint32_t bound_id; /**< global id we are bound to */ int refcount; unsigned int zombie:1; /**< proxy is removed locally and waiting to * be removed from server */ diff --git a/src/pipewire/proxy.c b/src/pipewire/proxy.c index 39bb61e2a..3601bfc64 100644 --- a/src/pipewire/proxy.c +++ b/src/pipewire/proxy.c @@ -46,6 +46,7 @@ int pw_proxy_init(struct pw_proxy *proxy, uint32_t type, uint32_t version) proxy->refcount = 1; proxy->type = type; proxy->version = version; + proxy->bound_id = SPA_ID_INVALID; proxy->id = pw_map_insert_new(&proxy->core_proxy->objects, proxy); if (proxy->id == SPA_ID_INVALID) { @@ -151,6 +152,20 @@ uint32_t pw_proxy_get_id(struct pw_proxy *proxy) return proxy->id; } +SPA_EXPORT +int pw_proxy_set_bound_id(struct pw_proxy *proxy, uint32_t global_id) +{ + proxy->bound_id = global_id; + pw_proxy_emit_bound(proxy, global_id); + return 0; +} + +SPA_EXPORT +uint32_t pw_proxy_get_bound_id(struct pw_proxy *proxy) +{ + return proxy->bound_id; +} + SPA_EXPORT uint32_t pw_proxy_get_type(struct pw_proxy *proxy, uint32_t *version) { diff --git a/src/pipewire/proxy.h b/src/pipewire/proxy.h index d9e92f4d8..60192728e 100644 --- a/src/pipewire/proxy.h +++ b/src/pipewire/proxy.h @@ -160,6 +160,13 @@ struct pw_protocol *pw_proxy_get_protocol(struct pw_proxy *proxy); * with the same seq number of the reply. */ int pw_proxy_sync(struct pw_proxy *proxy, int seq); +/** Set the global id this proxy is bound to. This is usually used internally + * and will also emit the bound event */ +int pw_proxy_set_bound_id(struct pw_proxy *proxy, uint32_t global_id); +/** Get the global id bound to this proxy of SPA_ID_INVALID when not bound + * to a global */ +uint32_t pw_proxy_get_bound_id(struct pw_proxy *proxy); + /** Generate an error for a proxy */ int pw_proxy_error(struct pw_proxy *proxy, int res, const char *error); int pw_proxy_errorf(struct pw_proxy *proxy, int res, const char *error, ...) SPA_PRINTF_FUNC(3, 4); diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index 55af22ed9..72e267fc7 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -62,6 +62,7 @@ struct pw_resource *pw_resource_new(struct pw_client *client, this->permissions = permissions; this->type = type; this->version = version; + this->bound_id = SPA_ID_INVALID; spa_hook_list_init(&this->listener_list); spa_hook_list_init(&this->object_listener_list); @@ -208,10 +209,11 @@ int pw_resource_ping(struct pw_resource *resource, int seq) } SPA_EXPORT -int pw_resource_bound_id(struct pw_resource *resource, uint32_t global_id) +int pw_resource_set_bound_id(struct pw_resource *resource, uint32_t global_id) { struct pw_client *client = resource->client; + resource->bound_id = global_id; if (client->core_resource != NULL) { pw_log_debug(NAME" %p: %u global_id:%u", resource, resource->id, global_id); pw_core_resource_bound_id(client->core_resource, resource->id, global_id); @@ -219,6 +221,12 @@ int pw_resource_bound_id(struct pw_resource *resource, uint32_t global_id) return 0; } +SPA_EXPORT +uint32_t pw_resource_get_bound_id(struct pw_resource *resource) +{ + return resource->bound_id; +} + SPA_EXPORT void pw_resource_errorf(struct pw_resource *resource, int res, const char *error, ...) { diff --git a/src/pipewire/resource.h b/src/pipewire/resource.h index b4e2eef5e..778db7fbe 100644 --- a/src/pipewire/resource.h +++ b/src/pipewire/resource.h @@ -122,7 +122,10 @@ void pw_resource_add_object_listener(struct pw_resource *resource, int pw_resource_ping(struct pw_resource *resource, int seq); /** Notify global id this resource is bound to */ -int pw_resource_bound_id(struct pw_resource *resource, uint32_t global_id); +int pw_resource_set_bound_id(struct pw_resource *resource, uint32_t global_id); + +/** Get the global id this resource is bound to or SPA_ID_INVALID when not bound */ +uint32_t pw_resource_get_bound_id(struct pw_resource *resource); /** Generate an error for a resource */ void pw_resource_error(struct pw_resource *resource, int res, const char *error);