mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
client-node: improve cleanup
This commit is contained in:
parent
7614604250
commit
960a82dbb9
1 changed files with 53 additions and 32 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue