diff --git a/src/pipewire/client.c b/src/pipewire/client.c index dab8d4cb9..695374ddc 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -169,6 +169,8 @@ static const struct pw_client_proxy_methods client_methods = { static void client_unbind_func(void *data) { struct pw_resource *resource = data; + if (resource->id == 1) + resource->client->client_resource = NULL; spa_list_remove(&resource->link); } @@ -199,6 +201,9 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, spa_list_append(&global->resource_list, &resource->link); + if (resource->id == 1) + client->client_resource = resource; + this->info.change_mask = ~0; pw_client_resource_info(resource, &this->info); this->info.change_mask = 0; diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 8061945ef..fcb362ca5 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -151,7 +151,11 @@ static const struct pw_resource_events resource_events = { static int destroy_resource(void *object, void *data) { struct pw_resource *resource = object; - if (resource && resource != resource->client->core_resource) { + struct pw_client *client = resource->client; + + if (resource && + resource != client->core_resource && + resource != client->client_resource) { resource->removed = true; pw_resource_destroy(resource); } @@ -363,7 +367,8 @@ static const struct pw_core_proxy_methods core_methods = { static void core_unbind_func(void *data) { struct pw_resource *resource = data; - resource->client->core_resource = NULL; + if (resource->id == 0) + resource->client->core_resource = NULL; spa_list_remove(&resource->link); } diff --git a/src/pipewire/interfaces.h b/src/pipewire/interfaces.h index 3144fa587..a8b3680d9 100644 --- a/src/pipewire/interfaces.h +++ b/src/pipewire/interfaces.h @@ -96,7 +96,8 @@ struct pw_core_proxy_methods { uint32_t version; /** * Start a conversation with the server. This will send - * the core info.. + * the core info and will destroy all resources for the client + * (except the core and client resource). */ int (*hello) (void *object, uint32_t version); /** diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 839f0d019..87fed792f 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -112,6 +112,7 @@ struct pw_client { struct pw_client_info info; /**< client info */ struct pw_resource *core_resource; /**< core resource object */ + struct pw_resource *client_resource; /**< client resource object */ struct pw_map objects; /**< list of resource objects */