mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-07 13:30:09 -05:00
global: add properties
Add properties to global objects to make it easier to select what nodes and objects to bind too. They can also be used to implement permissions on the globals based on properties. Add more error handling in _register. Make more functions return a result code. Make a separate pw_module_register, like all other objects.
This commit is contained in:
parent
47dd97049c
commit
c593d868fb
45 changed files with 295 additions and 149 deletions
|
|
@ -226,7 +226,7 @@ static void try_link_port(struct pw_node *node, struct pw_port *port, struct nod
|
|||
pw_link_add_listener(link, &ld->link_listener, &link_events, ld);
|
||||
|
||||
spa_list_append(&info->links, &ld->l);
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module));
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
|
||||
|
||||
try_link_controls(impl, port, target);
|
||||
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
|
|||
|
||||
pw_protocol_native_ext_client_node_init(core);
|
||||
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module));
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
|
||||
|
||||
pw_module_add_listener(module, &data->module_listener, &module_events, data);
|
||||
|
||||
|
|
|
|||
|
|
@ -813,7 +813,7 @@ handle_connect_name_ports(struct client *client)
|
|||
ld->in_port = in_port;
|
||||
spa_list_append(&impl->link_list, &ld->link_link);
|
||||
pw_link_add_listener(link, &ld->link_listener, &link_events, ld);
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module));
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
|
||||
|
||||
notify_clients(impl, jack_notify_PortConnectCallback, false, "", src_id, dst_id);
|
||||
|
||||
|
|
@ -1060,7 +1060,7 @@ static struct client *client_new(struct impl *impl, int fd)
|
|||
|
||||
pw_client_add_listener(client, &this->client_listener, &client_events, this);
|
||||
|
||||
pw_client_register(client, NULL, pw_module_get_global(impl->module));
|
||||
pw_client_register(client, NULL, pw_module_get_global(impl->module), NULL);
|
||||
|
||||
pw_log_debug("module-jack %p: added new client", impl);
|
||||
|
||||
|
|
@ -1339,7 +1339,7 @@ static int on_global(void *data, struct pw_global *global)
|
|||
pw_log_debug("module-jack %p: using buffer_size %d", impl,
|
||||
impl->server.engine_control->buffer_size);
|
||||
|
||||
pw_link_register(impl->sink_link, NULL, pw_module_get_global(impl->module));
|
||||
pw_link_register(impl->sink_link, NULL, pw_module_get_global(impl->module), NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -944,7 +944,7 @@ struct pw_jack_node *pw_jack_node_new(struct pw_core *core,
|
|||
jack_connection_manager_init_ref_num(conn, ref_num);
|
||||
jack_graph_manager_next_stop(mgr);
|
||||
|
||||
pw_node_register(node, NULL, parent);
|
||||
pw_node_register(node, NULL, parent, NULL);
|
||||
pw_node_set_active(node, true);
|
||||
|
||||
return this;
|
||||
|
|
@ -1041,7 +1041,7 @@ pw_jack_driver_new(struct pw_core *core,
|
|||
this->driver_out = alloc_port(this, PW_DIRECTION_OUTPUT, 0);
|
||||
pw_port_add(this->driver_out->port, node);
|
||||
}
|
||||
pw_node_register(node, NULL, parent);
|
||||
pw_node_register(node, NULL, parent, NULL);
|
||||
pw_node_set_active(node, true);
|
||||
|
||||
return this;
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ static void *create_object(void *_data,
|
|||
if (link == NULL)
|
||||
goto no_mem;
|
||||
|
||||
pw_link_register(link, client, pw_client_get_global(client));
|
||||
pw_link_register(link, client, pw_client_get_global(client), NULL);
|
||||
|
||||
res = pw_global_bind(pw_link_get_global(link), client, PW_PERM_RWX, PW_VERSION_LINK, new_id);
|
||||
if (res < 0)
|
||||
|
|
@ -206,7 +206,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
|
|||
&impl_factory,
|
||||
data);
|
||||
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module));
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
|
||||
|
||||
pw_module_add_listener(module, &data->module_listener, &module_events, data);
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ static int on_global(void *data, struct pw_global *global)
|
|||
NULL,
|
||||
pw_properties_new(PW_LINK_PROP_PASSIVE, "true", NULL),
|
||||
&error, 0);
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module));
|
||||
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -334,7 +334,7 @@ static struct pw_client *client_new(struct server *s, int fd)
|
|||
spa_list_append(&s->this.client_list, &client->protocol_link);
|
||||
|
||||
pw_client_add_listener(client, &this->client_listener, &client_events, this);
|
||||
pw_client_register(client, NULL, pw_module_get_global(pd->module));
|
||||
pw_client_register(client, NULL, pw_module_get_global(pd->module), NULL);
|
||||
|
||||
pw_global_bind(pw_core_get_global(core), client, PW_PERM_RWX, PW_VERSION_CORE, 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -488,19 +488,31 @@ static int core_demarshal_update_types_server(void *object, void *data, size_t s
|
|||
}
|
||||
|
||||
static void registry_marshal_global(void *object, uint32_t id, uint32_t parent_id, uint32_t permissions,
|
||||
uint32_t type, uint32_t version)
|
||||
uint32_t type, uint32_t version, const struct spa_dict *props)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_builder *b;
|
||||
uint32_t i, n_items;
|
||||
|
||||
b = pw_protocol_native_begin_resource(resource, PW_REGISTRY_PROXY_EVENT_GLOBAL);
|
||||
|
||||
spa_pod_builder_struct(b,
|
||||
"i", id,
|
||||
"i", parent_id,
|
||||
"i", permissions,
|
||||
"I", type,
|
||||
"i", version);
|
||||
n_items = props ? props->n_items : 0;
|
||||
|
||||
spa_pod_builder_add(b,
|
||||
"[",
|
||||
"i", id,
|
||||
"i", parent_id,
|
||||
"i", permissions,
|
||||
"I", type,
|
||||
"i", version,
|
||||
"i", n_items, NULL);
|
||||
|
||||
for (i = 0; i < n_items; i++) {
|
||||
spa_pod_builder_add(b,
|
||||
"s", props->items[i].key,
|
||||
"s", props->items[i].value, NULL);
|
||||
}
|
||||
spa_pod_builder_add(b, "]", NULL);
|
||||
|
||||
pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
|
@ -874,7 +886,8 @@ static int registry_demarshal_global(void *object, void *data, size_t size)
|
|||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_parser prs;
|
||||
uint32_t id, parent_id, permissions, type, version;
|
||||
uint32_t id, parent_id, permissions, type, version, i;
|
||||
struct spa_dict props;
|
||||
|
||||
spa_pod_parser_init(&prs, data, size, 0);
|
||||
if (spa_pod_parser_get(&prs,
|
||||
|
|
@ -883,10 +896,21 @@ static int registry_demarshal_global(void *object, void *data, size_t size)
|
|||
"i", &parent_id,
|
||||
"i", &permissions,
|
||||
"I", &type,
|
||||
"i", &version, NULL) < 0)
|
||||
"i", &version,
|
||||
"i", &props.n_items, NULL) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
pw_proxy_notify(proxy, struct pw_registry_proxy_events, global, id, parent_id, permissions, type, version);
|
||||
props.items = alloca(props.n_items * sizeof(struct spa_dict_item));
|
||||
for (i = 0; i < props.n_items; i++) {
|
||||
if (spa_pod_parser_get(&prs,
|
||||
"s", &props.items[i].key,
|
||||
"s", &props.items[i].value, NULL) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pw_proxy_notify(proxy, struct pw_registry_proxy_events,
|
||||
global, id, parent_id, permissions, type, version,
|
||||
props.n_items > 0 ? &props : NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
|
|||
pw_log_debug("module %p: new", module);
|
||||
pw_module_add_listener(module, &data->module_listener, &module_events, data);
|
||||
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module));
|
||||
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ static void pw_spa_node_destroy(void *data)
|
|||
static void complete_init(struct impl *impl)
|
||||
{
|
||||
struct pw_node *this = impl->this;
|
||||
pw_node_register(this, impl->owner, impl->parent);
|
||||
pw_node_register(this, impl->owner, impl->parent, NULL);
|
||||
if (impl->flags & PW_SPA_NODE_FLAG_ACTIVATE)
|
||||
pw_node_set_active(this, true);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue