From 3be759ced2f8ad81c51abbf295a96df21d82bd3f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 14 Dec 2018 16:37:59 +0100 Subject: [PATCH] stream: handle proxy destroy When the proxy is destroyed, mark the stream as unconnected and remove our reference to the proxy. --- src/pipewire/private.h | 2 ++ src/pipewire/remote.c | 1 + src/pipewire/stream.c | 13 +++++++++++++ 3 files changed, 16 insertions(+) diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 873270dc7..64875f480 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -598,7 +598,9 @@ struct pw_stream { char *error; /**< error reason when state is in error */ struct spa_hook_list listener_list; + struct pw_proxy *proxy; + struct spa_hook proxy_listener; }; #define pw_factory_events_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct pw_factory_events, m, v, ##__VA_ARGS__) diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index 2ae844173..a372d9f3f 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -317,6 +317,7 @@ void pw_remote_destroy(struct pw_remote *remote) pw_map_clear(&remote->objects); + pw_log_debug("remote %p: free", remote); if (remote->properties) pw_properties_free(remote->properties); free(remote->error); diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 535378550..02cbb1f47 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -784,6 +784,18 @@ static const struct spa_node impl_node = { .port_reuse_buffer = impl_port_reuse_buffer, }; +static void proxy_destroy(void *_data) +{ + struct pw_stream *stream = _data; + stream->proxy = NULL; + stream_set_state(stream, PW_STREAM_STATE_UNCONNECTED, NULL); +} + +static const struct pw_proxy_events proxy_events = { + PW_VERSION_PROXY_EVENTS, + .destroy = proxy_destroy, +}; + static int handle_connect(struct pw_stream *stream) { struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); @@ -806,6 +818,7 @@ static int handle_connect(struct pw_stream *stream) pw_log_debug("stream %p: export node %p", stream, impl->node); stream->proxy = pw_remote_export(stream->remote, impl->node); + pw_proxy_add_listener(stream->proxy, &stream->proxy_listener, &proxy_events, stream); return 0; }