pulse-server: client: add 'disconnect' event

Have the clients emit a 'disconnect' event when they are
being disconnected.
This commit is contained in:
Barnabás Pőcze 2021-11-13 14:14:19 +01:00 committed by Wim Taymans
parent 2d4febaba1
commit 043934655a
2 changed files with 22 additions and 0 deletions

View file

@ -49,6 +49,8 @@
#include "server.h" #include "server.h"
#include "stream.h" #include "stream.h"
#define client_emit_disconnect(c) spa_hook_list_call(&(c)->listener_list, struct client_events, disconnect, 0)
struct client *client_new(struct server *server) struct client *client_new(struct server *server)
{ {
struct client *client = calloc(1, sizeof(*client)); struct client *client = calloc(1, sizeof(*client));
@ -65,6 +67,7 @@ struct client *client_new(struct server *server)
spa_list_init(&client->operations); spa_list_init(&client->operations);
spa_list_init(&client->pending_samples); spa_list_init(&client->pending_samples);
spa_list_init(&client->pending_streams); spa_list_init(&client->pending_streams);
spa_hook_list_init(&client->listener_list);
spa_list_append(&server->clients, &client->link); spa_list_append(&server->clients, &client->link);
server->n_clients++; server->n_clients++;
@ -116,6 +119,8 @@ void client_disconnect(struct client *client)
if (client->disconnect) if (client->disconnect)
return; return;
client_emit_disconnect(client);
/* the client must be detached from the server to disconnect */ /* the client must be detached from the server to disconnect */
spa_assert(client->server == NULL); spa_assert(client->server == NULL);
@ -171,6 +176,8 @@ void client_free(struct client *client)
pw_properties_free(client->props); pw_properties_free(client->props);
pw_properties_free(client->routes); pw_properties_free(client->routes);
spa_hook_list_clean(&client->listener_list);
free(client); free(client);
} }

View file

@ -100,6 +100,15 @@ struct client {
struct pw_manager_object *prev_default_sink; struct pw_manager_object *prev_default_sink;
struct pw_manager_object *prev_default_source; struct pw_manager_object *prev_default_source;
struct spa_hook_list listener_list;
};
struct client_events {
#define VERSION_CLIENT_EVENTS 0
uint32_t version;
void (*disconnect) (void *data);
}; };
struct client *client_new(struct server *server); struct client *client_new(struct server *server);
@ -116,4 +125,10 @@ static inline void client_unref(struct client *client)
client_free(client); client_free(client);
} }
static inline void client_add_listener(struct client *client, struct spa_hook *listener,
const struct client_events *events, void *data)
{
spa_hook_list_append(&client->listener_list, listener, events, data);
}
#endif /* PULSER_SERVER_CLIENT_H */ #endif /* PULSER_SERVER_CLIENT_H */