diff options
author | Wim Taymans <wtaymans@redhat.com> | 2020-07-03 14:13:49 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2020-07-03 15:19:40 +0200 |
commit | 1e2ad41d948d068625864722127e1f9c3dcd4957 (patch) | |
tree | 3a9d7e4e78ffffc23f9214f9c0e8f790ab8be19c | |
parent | 1091d2eaf150cf6baeb32657c7e764f26125db62 (diff) |
remote-node: fix user_data
Pass the node_data around instead of the proxy. Get the proxy from
the node data.
Allocate user_data before the node_data so that the caller can
use the proxy user_data without overwriting the node_data.
-rw-r--r-- | src/modules/module-client-node/remote-node.c | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index 730a40ca..cadedb17 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -248,8 +248,8 @@ static struct mix *ensure_mix(struct node_data *data, static int client_node_transport(void *object, int readfd, int writefd, uint32_t mem_id, uint32_t offset, uint32_t size) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; clean_transport(data); @@ -277,9 +277,8 @@ static int client_node_transport(void *object, return 0; } -static int add_node_update(struct pw_proxy *proxy, uint32_t change_mask) +static int add_node_update(struct node_data *data, uint32_t change_mask) { - struct node_data *data = proxy->user_data; struct pw_impl_node *node = data->node; struct spa_node_info ni = SPA_NODE_INFO_INIT(); uint32_t n_params = 0; @@ -337,9 +336,8 @@ static int add_node_update(struct pw_proxy *proxy, uint32_t change_mask) return res; } -static int add_port_update(struct pw_proxy *proxy, struct pw_impl_port *port, uint32_t change_mask) +static int add_port_update(struct node_data *data, struct pw_impl_port *port, uint32_t change_mask) { - struct node_data *data = proxy->user_data; struct spa_port_info pi = SPA_PORT_INFO_INIT(); uint32_t n_params = 0; struct spa_pod **params = NULL; @@ -402,8 +400,7 @@ static int client_node_set_param(void *object, uint32_t id, uint32_t flags, const struct spa_pod *param) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; return spa_node_set_param(data->node->node, id, flags, param); } @@ -414,8 +411,8 @@ client_node_set_io(void *object, uint32_t offset, uint32_t size) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; struct pw_memmap *old, *mm; void *ptr; uint32_t tag[5] = { data->remote_id, id, }; @@ -460,8 +457,8 @@ static int client_node_event(void *object, const struct spa_event *event) static int client_node_command(void *object, const struct spa_command *command) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; int res; switch (SPA_NODE_COMMAND_ID(command)) { @@ -503,7 +500,8 @@ static int client_node_add_port(void *object, enum spa_direction direction, uint32_t port_id, const struct spa_dict *props) { - struct pw_proxy *proxy = object; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; pw_log_warn("add port not supported"); pw_proxy_error(proxy, -ENOTSUP, "add port not supported"); return -ENOTSUP; @@ -512,7 +510,8 @@ client_node_add_port(void *object, enum spa_direction direction, uint32_t port_i static int client_node_remove_port(void *object, enum spa_direction direction, uint32_t port_id) { - struct pw_proxy *proxy = object; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; pw_log_warn("remove port not supported"); pw_proxy_error(proxy, -ENOTSUP, "remove port not supported"); return -ENOTSUP; @@ -549,8 +548,8 @@ client_node_port_set_param(void *object, uint32_t id, uint32_t flags, const struct spa_pod *param) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; struct pw_impl_port *port; int res; @@ -588,8 +587,8 @@ client_node_port_use_buffers(void *object, uint32_t flags, uint32_t n_buffers, struct pw_client_node_buffer *buffers) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; struct buffer *bid; uint32_t i, j; struct spa_buffer *b, **bufs; @@ -735,8 +734,8 @@ client_node_port_set_io(void *object, uint32_t offset, uint32_t size) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; struct mix *mix; struct pw_memmap *mm, *old; void *ptr; @@ -834,8 +833,8 @@ client_node_set_activation(void *object, uint32_t offset, uint32_t size) { - struct pw_proxy *proxy = object; - struct node_data *data = proxy->user_data; + struct node_data *data = object; + struct pw_proxy *proxy = (struct pw_proxy*)data->client_node; struct pw_impl_node *node = data->node; struct pw_memmap *mm; void *ptr; @@ -919,22 +918,21 @@ static const struct pw_client_node_events client_node_events = { .set_activation = client_node_set_activation, }; -static void do_node_init(struct pw_proxy *proxy) +static void do_node_init(struct node_data *data) { - struct node_data *data = proxy->user_data; struct pw_impl_port *port; pw_log_debug("%p: init", data); - add_node_update(proxy, PW_CLIENT_NODE_UPDATE_PARAMS | + add_node_update(data, PW_CLIENT_NODE_UPDATE_PARAMS | PW_CLIENT_NODE_UPDATE_INFO); spa_list_for_each(port, &data->node->input_ports, link) { - add_port_update(proxy, port, + add_port_update(data, port, PW_CLIENT_NODE_PORT_UPDATE_PARAMS | PW_CLIENT_NODE_PORT_UPDATE_INFO); } spa_list_for_each(port, &data->node->output_ports, link) { - add_port_update(proxy, port, + add_port_update(data, port, PW_CLIENT_NODE_PORT_UPDATE_PARAMS | PW_CLIENT_NODE_PORT_UPDATE_INFO); } @@ -999,7 +997,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_INFO; } - add_node_update((struct pw_proxy*)d->client_node, change_mask); + add_node_update(d, change_mask); } static void node_port_info_changed(void *data, struct pw_impl_port *port, @@ -1019,7 +1017,7 @@ static void node_port_info_changed(void *data, struct pw_impl_port *port, change_mask |= PW_CLIENT_NODE_PORT_UPDATE_PARAMS; change_mask |= PW_CLIENT_NODE_PORT_UPDATE_INFO; } - add_port_update((struct pw_proxy*)d->client_node, port, change_mask); + add_port_update(d, port, change_mask); } static void node_active_changed(void *data, bool active) @@ -1150,16 +1148,19 @@ static struct pw_proxy *node_export(struct pw_core *core, void *object, bool do_ const char *str; int i; + user_data_size = SPA_ROUND_UP_N(user_data_size, __alignof__(struct node_data)); + client_node = pw_core_create_object(core, "client-node", PW_TYPE_INTERFACE_ClientNode, PW_VERSION_CLIENT_NODE, &node->properties->dict, - sizeof(struct node_data)); - if (client_node == NULL) - return NULL; + user_data_size + sizeof(struct node_data)); + if (client_node == NULL) + return NULL; data = pw_proxy_get_user_data(client_node); + data = SPA_MEMBER(data, user_data_size, struct node_data); data->pool = pw_core_get_mempool(core); data->node = node; data->do_free = do_free; @@ -1192,11 +1193,11 @@ static struct pw_proxy *node_export(struct pw_core *core, void *object, bool do_ spa_node_set_callbacks(node->node, &node_callbacks, data); pw_impl_node_add_listener(node, &data->node_listener, &node_events, data); - pw_client_node_add_listener(data->client_node, + pw_client_node_add_listener(data->client_node, &data->client_node_listener, &client_node_events, - client_node); - do_node_init(client_node); + data); + do_node_init(data); return client_node; } |