client-node: improve cleanup

This commit is contained in:
Wim Taymans 2019-08-01 15:04:18 +02:00
parent 7614604250
commit 960a82dbb9

View file

@ -84,10 +84,12 @@ struct node_data {
int do_free:1; int do_free:1;
int have_transport:1; int have_transport:1;
struct pw_client_node_proxy *node_proxy; struct pw_client_node_proxy *client_node;
struct spa_hook node_proxy_listener; struct spa_hook client_node_listener;
struct spa_hook client_node_proxy_listener;
struct pw_proxy *proxy;
struct spa_hook proxy_listener; struct spa_hook proxy_listener;
struct pw_proxy *proxy;
struct spa_io_position *position; struct spa_io_position *position;
@ -256,7 +258,7 @@ static int client_node_transport(void *object, uint32_t node_id,
data->have_transport = true; data->have_transport = true;
if (data->node->active) if (data->node->active)
pw_client_node_proxy_set_active(data->node_proxy, true); pw_client_node_proxy_set_active(data->client_node, true);
pw_remote_emit_exported(remote, data->proxy->id, node_id); pw_remote_emit_exported(remote, data->proxy->id, node_id);
return 0; return 0;
@ -306,7 +308,7 @@ static int add_node_update(struct pw_proxy *proxy, uint32_t change_mask)
} }
res = pw_client_node_proxy_update(data->node_proxy, res = pw_client_node_proxy_update(data->client_node,
change_mask, change_mask,
n_params, n_params,
(const struct spa_pod **)params, (const struct spa_pod **)params,
@ -364,7 +366,7 @@ static int add_port_update(struct pw_proxy *proxy, struct pw_port *port, uint32_
pi.params = port->info.params; pi.params = port->info.params;
} }
res = pw_client_node_proxy_port_update(data->node_proxy, res = pw_client_node_proxy_port_update(data->client_node,
port->direction, port->direction,
port->port_id, port->port_id,
change_mask, change_mask,
@ -673,7 +675,7 @@ client_node_port_use_buffers(void *object,
goto error_exit_cleanup; goto error_exit_cleanup;
if (flags & SPA_NODE_BUFFERS_FLAG_ALLOC) { if (flags & SPA_NODE_BUFFERS_FLAG_ALLOC) {
pw_client_node_proxy_port_buffers(data->node_proxy, pw_client_node_proxy_port_buffers(data->client_node,
direction, port_id, mix_id, direction, port_id, mix_id,
n_buffers, n_buffers,
bufs); bufs);
@ -929,11 +931,8 @@ static void node_free(void *data)
pw_log_debug("%p: free", d); pw_log_debug("%p: free", d);
if (d->proxy) { if (d->client_node)
pw_proxy_destroy(d->proxy); pw_proxy_destroy((struct pw_proxy*)d->client_node);
d->proxy = NULL;
}
pw_proxy_destroy((struct pw_proxy*)d->node_proxy);
} }
static void node_info_changed(void *data, const struct pw_node_info *info) static void node_info_changed(void *data, const struct pw_node_info *info)
@ -949,7 +948,7 @@ static void node_info_changed(void *data, const struct pw_node_info *info)
change_mask |= PW_CLIENT_NODE_UPDATE_PARAMS; change_mask |= PW_CLIENT_NODE_UPDATE_PARAMS;
change_mask |= PW_CLIENT_NODE_UPDATE_INFO; change_mask |= PW_CLIENT_NODE_UPDATE_INFO;
} }
add_node_update((struct pw_proxy*)d->node_proxy, change_mask); add_node_update((struct pw_proxy*)d->client_node, change_mask);
} }
static void node_port_info_changed(void *data, struct pw_port *port, static void node_port_info_changed(void *data, struct pw_port *port,
@ -966,14 +965,14 @@ static void node_port_info_changed(void *data, struct pw_port *port,
change_mask |= PW_CLIENT_NODE_PORT_UPDATE_PARAMS; change_mask |= PW_CLIENT_NODE_PORT_UPDATE_PARAMS;
change_mask |= PW_CLIENT_NODE_PORT_UPDATE_INFO; change_mask |= PW_CLIENT_NODE_PORT_UPDATE_INFO;
} }
add_port_update((struct pw_proxy*)d->node_proxy, port, change_mask); add_port_update((struct pw_proxy*)d->client_node, port, change_mask);
} }
static void node_active_changed(void *data, bool active) static void node_active_changed(void *data, bool active)
{ {
struct node_data *d = data; struct node_data *d = data;
pw_log_debug("active %d", active); pw_log_debug("active %d", active);
pw_client_node_proxy_set_active(d->node_proxy, active); pw_client_node_proxy_set_active(d->client_node, active);
} }
static const struct pw_node_events node_events = { static const struct pw_node_events node_events = {
@ -985,7 +984,7 @@ static const struct pw_node_events node_events = {
.active_changed = node_active_changed, .active_changed = node_active_changed,
}; };
static void node_proxy_destroy(void *_data) static void client_node_proxy_destroy(void *_data)
{ {
struct node_data *data = _data; struct node_data *data = _data;
@ -995,19 +994,36 @@ static void node_proxy_destroy(void *_data)
spa_hook_remove(&data->node_listener); spa_hook_remove(&data->node_listener);
data->node_proxy = NULL; data->client_node = NULL;
if (data->proxy) { if (data->proxy)
pw_proxy_destroy(data->proxy); pw_proxy_destroy(data->proxy);
data->proxy = NULL;
}
if (data->do_free) if (data->do_free)
pw_node_destroy(data->node); pw_node_destroy(data->node);
} }
static const struct pw_proxy_events client_node_proxy_events = {
PW_VERSION_PROXY_EVENTS,
.destroy = client_node_proxy_destroy,
};
static void proxy_destroy(void *_data)
{
struct node_data *data = _data;
pw_log_debug("%p: destroy", data);
spa_hook_remove(&data->proxy_listener);
data->proxy = NULL;
if (data->client_node)
pw_proxy_destroy((struct pw_proxy*)data->client_node);
}
static const struct pw_proxy_events proxy_events = { static const struct pw_proxy_events proxy_events = {
PW_VERSION_PROXY_EVENTS, PW_VERSION_PROXY_EVENTS,
.destroy = node_proxy_destroy, .destroy = proxy_destroy,
}; };
static int node_ready(void *d, int status) static int node_ready(void *d, int status)
@ -1051,25 +1067,25 @@ static struct pw_proxy *node_export(struct pw_remote *remote, void *object, bool
size_t user_data_size) size_t user_data_size)
{ {
struct pw_node *node = object; struct pw_node *node = object;
struct pw_proxy *proxy; struct pw_proxy *client_node;
struct node_data *data; struct node_data *data;
int i; int i;
proxy = pw_core_proxy_create_object(remote->core_proxy, client_node = pw_core_proxy_create_object(remote->core_proxy,
"client-node", "client-node",
PW_TYPE_INTERFACE_ClientNode, PW_TYPE_INTERFACE_ClientNode,
PW_VERSION_CLIENT_NODE, PW_VERSION_CLIENT_NODE,
&node->properties->dict, &node->properties->dict,
sizeof(struct node_data)); sizeof(struct node_data));
if (proxy == NULL) if (client_node == NULL)
return NULL; return NULL;
data = pw_proxy_get_user_data(proxy); data = pw_proxy_get_user_data(client_node);
data->remote = remote; data->remote = remote;
data->node = node; data->node = node;
data->do_free = do_free; data->do_free = do_free;
data->core = pw_node_get_core(node); data->core = pw_node_get_core(node);
data->node_proxy = (struct pw_client_node_proxy *)proxy; data->client_node = (struct pw_client_node_proxy *)client_node;
data->remote_id = SPA_ID_INVALID; data->remote_id = SPA_ID_INVALID;
node->exported = true; node->exported = true;
@ -1083,19 +1099,24 @@ static struct pw_proxy *node_export(struct pw_remote *remote, void *object, bool
pw_array_init(&data->links, 64); pw_array_init(&data->links, 64);
pw_array_ensure_size(&data->links, sizeof(struct link) * 64); pw_array_ensure_size(&data->links, sizeof(struct link) * 64);
pw_proxy_add_listener(proxy, &data->proxy_listener, &proxy_events, data); pw_proxy_add_listener(client_node,
&data->client_node_proxy_listener,
&client_node_proxy_events, data);
spa_node_set_callbacks(node->node, &node_callbacks, data); spa_node_set_callbacks(node->node, &node_callbacks, data);
pw_node_add_listener(node, &data->node_listener, &node_events, data); pw_node_add_listener(node, &data->node_listener, &node_events, data);
pw_client_node_proxy_add_listener(data->node_proxy, pw_client_node_proxy_add_listener(data->client_node,
&data->node_proxy_listener, &data->client_node_listener,
&client_node_events, &client_node_events,
proxy); client_node);
do_node_init(proxy); do_node_init(client_node);
data->proxy = (struct pw_proxy*) pw_client_node_proxy_get_node(data->node_proxy, data->proxy = (struct pw_proxy*) pw_client_node_proxy_get_node(data->client_node,
PW_VERSION_NODE_PROXY, user_data_size); PW_VERSION_NODE_PROXY, user_data_size);
pw_proxy_add_listener(data->proxy, &data->proxy_listener, &proxy_events, data);
return data->proxy; return data->proxy;
} }