diff --git a/src/modules/module-protocol-pulse/manager.c b/src/modules/module-protocol-pulse/manager.c index 13f8df993..a58eb6f7b 100644 --- a/src/modules/module-protocol-pulse/manager.c +++ b/src/modules/module-protocol-pulse/manager.c @@ -31,6 +31,7 @@ #include #include "log.h" +#include "module-protocol-pulse/server.h" #define MAX_PARAMS 32 @@ -39,6 +40,7 @@ #define manager_emit_updated(m,o) spa_hook_list_call(&m->hooks, struct pw_manager_events, updated, 0, o) #define manager_emit_removed(m,o) spa_hook_list_call(&m->hooks, struct pw_manager_events, removed, 0, o) #define manager_emit_metadata(m,o,s,k,t,v) spa_hook_list_call(&m->hooks, struct pw_manager_events, metadata,0,o,s,k,t,v) +#define manager_emit_disconnect(m) spa_hook_list_call(&m->hooks, struct pw_manager_events, disconnect, 0) struct object; @@ -688,10 +690,21 @@ static void on_core_done(void *data, uint32_t id, int seq) } } +static void on_core_error(void *data, uint32_t id, int seq, int res, const char *message) +{ + struct manager *m = data; + + if (id == PW_ID_CORE) { + pw_log_debug("connection error: %d, %s", res, message); + manager_emit_disconnect(m); + } +} + static const struct pw_core_events core_events = { PW_VERSION_CORE_EVENTS, .done = on_core_done, .info = on_core_info, + .error = on_core_error }; struct pw_manager *pw_manager_new(struct pw_core *core) diff --git a/src/modules/module-protocol-pulse/manager.h b/src/modules/module-protocol-pulse/manager.h index ba7bc17f6..abdd7987d 100644 --- a/src/modules/module-protocol-pulse/manager.h +++ b/src/modules/module-protocol-pulse/manager.h @@ -53,6 +53,8 @@ struct pw_manager_events { void (*metadata) (void *data, struct pw_manager_object *object, uint32_t subject, const char *key, const char *type, const char *value); + + void (*disconnect) (void *data); }; struct pw_manager { diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 99484d827..b17cec31a 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -22,6 +22,7 @@ * DEALINGS IN THE SOFTWARE. */ +#include "pipewire/core.h" #define NAME "pulse-server" #include "config.h" @@ -835,6 +836,21 @@ static void manager_metadata(void *data, struct pw_manager_object *o, } } + +static void do_free_client(void *obj, void *data, int res, uint32_t id) +{ + struct client *client = data; + client_free(client); +} + +static void manager_disconnect(void *data) +{ + struct client *client = data; + pw_log_debug("manager_disconnect()"); + pw_work_queue_add(client->impl->work_queue, NULL, 0, + do_free_client, client); +} + static const struct pw_manager_events manager_events = { PW_VERSION_MANAGER_EVENTS, .sync = manager_sync, @@ -842,6 +858,7 @@ static const struct pw_manager_events manager_events = { .updated = manager_updated, .removed = manager_removed, .metadata = manager_metadata, + .disconnect = manager_disconnect }; static int do_set_client_name(struct client *client, uint32_t command, uint32_t tag, struct message *m)