From 8db4a797aaf11c0db2e447195f2700701df5a366 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 16 Aug 2019 22:11:42 +0200 Subject: [PATCH] core: remove parent_id from the global event Remove the parent_id from the global event. Remove the parent and owner from the global object. Use properties instead to mark parents and owners of objects. Properties are easier to control for client exported objects and usually a simple parent/child is not enough. For example, a client exported node has the client as a parent but also the factory that created the node. --- pipewire-jack | 2 +- pipewire-pulseaudio | 2 +- src/daemon/command.c | 2 +- src/examples/alsa-monitor.c | 13 +++- src/examples/bluez-session.c | 2 +- src/examples/export-spa-device.c | 4 +- src/examples/export-spa.c | 2 +- src/examples/local-v4l2.c | 6 +- src/examples/media-session.c | 43 +++++++----- src/gst/gstpipewiredeviceprovider.c | 10 +-- src/modules/module-adapter.c | 40 +++++++---- src/modules/module-adapter/adapter.c | 2 +- src/modules/module-client-device.c | 42 +++++++----- .../module-client-device/client-device.h | 1 - .../module-client-device/resource-device.c | 16 +++-- src/modules/module-client-node.c | 42 +++++++----- src/modules/module-client-node/client-node.c | 13 ++-- src/modules/module-client-node/client-node.h | 2 - src/modules/module-client-node/remote-node.c | 2 +- src/modules/module-link-factory.c | 67 +++++++++--------- src/modules/module-protocol-native.c | 31 ++------- .../module-protocol-native/protocol-native.c | 8 +-- src/modules/module-rtkit.c | 15 +--- src/modules/spa/module-device-factory.c | 52 +++++++------- src/modules/spa/module-device.c | 2 - src/modules/spa/module-monitor.c | 1 - src/modules/spa/module-node-factory.c | 51 +++++++------- src/modules/spa/module-node.c | 2 - src/modules/spa/spa-device.c | 13 +--- src/modules/spa/spa-device.h | 4 -- src/modules/spa/spa-monitor.c | 5 +- src/modules/spa/spa-monitor.h | 1 - src/modules/spa/spa-node.c | 13 +--- src/modules/spa/spa-node.h | 4 -- src/pipewire/client.c | 30 ++++++-- src/pipewire/client.h | 2 - src/pipewire/core.c | 14 ++-- src/pipewire/device.c | 35 +++++----- src/pipewire/device.h | 2 - src/pipewire/factory.c | 68 ++++++++++++++++--- src/pipewire/factory.h | 8 ++- src/pipewire/global.c | 57 +++------------- src/pipewire/global.h | 13 +--- src/pipewire/interfaces.h | 3 +- src/pipewire/keys.h | 8 ++- src/pipewire/link.c | 44 ++++++------ src/pipewire/link.h | 2 - src/pipewire/module.c | 16 +++-- src/pipewire/module.h | 6 +- src/pipewire/node.c | 38 +++++------ src/pipewire/node.h | 2 - src/pipewire/port.c | 36 ++++++++-- src/pipewire/private.h | 12 +--- src/pipewire/remote.c | 8 +-- src/tests/test-core.c | 2 - src/tests/test-interfaces.c | 2 +- src/tools/pipewire-cli.c | 11 ++- src/tools/pipewire-monitor.c | 12 +--- 58 files changed, 482 insertions(+), 464 deletions(-) diff --git a/pipewire-jack b/pipewire-jack index 2d6f9950a..a560e8b92 160000 --- a/pipewire-jack +++ b/pipewire-jack @@ -1 +1 @@ -Subproject commit 2d6f9950a5e036f908953727e61e3b3fb02eacf0 +Subproject commit a560e8b92f550268e3e697cfe03bd517664b727d diff --git a/pipewire-pulseaudio b/pipewire-pulseaudio index f9fce3cb3..2308318b3 160000 --- a/pipewire-pulseaudio +++ b/pipewire-pulseaudio @@ -1 +1 @@ -Subproject commit f9fce3cb3042486d8015925bf794acd5c4117ba7 +Subproject commit 2308318b39bd769b5059213958193448a4edea27 diff --git a/src/daemon/command.c b/src/daemon/command.c index 9081c9a9d..91fe9d498 100644 --- a/src/daemon/command.c +++ b/src/daemon/command.c @@ -180,7 +180,7 @@ execute_command_module_load(struct pw_command *command, struct pw_core *core, ch { struct pw_module *module; - module = pw_module_load(core, command->args[1], command->args[2], NULL, NULL, NULL); + module = pw_module_load(core, command->args[1], command->args[2], NULL); if (module == NULL) { asprintf(err, "could not load module \"%s\": %m", command->args[1]); return -errno; diff --git a/src/examples/alsa-monitor.c b/src/examples/alsa-monitor.c index 371493010..14fb6c14d 100644 --- a/src/examples/alsa-monitor.c +++ b/src/examples/alsa-monitor.c @@ -58,6 +58,7 @@ struct alsa_object { struct monitor *monitor; struct spa_list link; uint32_t id; + uint32_t device_id; struct pw_properties *props; @@ -111,8 +112,10 @@ static struct alsa_node *alsa_create_node(struct alsa_object *obj, uint32_t id, node->props = pw_properties_new_dict(info->props); - str = pw_properties_get(obj->props, SPA_KEY_DEVICE_NICK); - if (str) + if (obj->device_id != 0) + pw_properties_setf(node->props, PW_KEY_DEVICE_ID, "%d", obj->device_id); + + if ((str = pw_properties_get(obj->props, SPA_KEY_DEVICE_NICK)) != NULL) pw_properties_set(node->props, PW_KEY_NODE_NICK, str); str = pw_properties_get(obj->props, SPA_KEY_DEVICE_NAME); @@ -169,7 +172,13 @@ static void alsa_remove_node(struct alsa_object *obj, struct alsa_node *node) static void alsa_device_info(void *data, const struct spa_device_info *info) { struct alsa_object *obj = data; + const char *str; + pw_properties_update(obj->props, info->props); + + if ((str = pw_properties_get(obj->props, PW_KEY_DEVICE_ID)) != NULL) + obj->device_id = pw_properties_parse_int(str); + spa_debug_dict(0, info->props); } diff --git a/src/examples/bluez-session.c b/src/examples/bluez-session.c index 55d5906a2..66898f6aa 100644 --- a/src/examples/bluez-session.c +++ b/src/examples/bluez-session.c @@ -386,7 +386,7 @@ int main(int argc, char *argv[]) pw_core_add_spa_lib(impl.core, "api.bluez5.*", "bluez5/libspa-bluez5"); - pw_module_load(impl.core, "libpipewire-module-client-device", NULL, NULL, NULL, NULL); + pw_module_load(impl.core, "libpipewire-module-client-device", NULL, NULL); clock_gettime(CLOCK_MONOTONIC, &impl.now); diff --git a/src/examples/export-spa-device.c b/src/examples/export-spa-device.c index 418a707fb..cc14a3181 100644 --- a/src/examples/export-spa-device.c +++ b/src/examples/export-spa-device.c @@ -127,8 +127,8 @@ int main(int argc, char *argv[]) data.library = argv[1]; data.factory = argv[2]; - pw_module_load(data.core, "libpipewire-module-spa-device-factory", NULL, NULL, NULL, NULL); - pw_module_load(data.core, "libpipewire-module-client-device", NULL, NULL, NULL, NULL); + pw_module_load(data.core, "libpipewire-module-spa-device-factory", NULL, NULL); + pw_module_load(data.core, "libpipewire-module-client-device", NULL, NULL); pw_remote_add_listener(data.remote, &data.remote_listener, &remote_events, &data); diff --git a/src/examples/export-spa.c b/src/examples/export-spa.c index 6dd7ecb44..1141c0a3d 100644 --- a/src/examples/export-spa.c +++ b/src/examples/export-spa.c @@ -135,7 +135,7 @@ int main(int argc, char *argv[]) if (argc > 3) data.path = argv[3]; - pw_module_load(data.core, "libpipewire-module-spa-node-factory", NULL, NULL, NULL, NULL); + pw_module_load(data.core, "libpipewire-module-spa-node-factory", NULL, NULL); pw_remote_add_listener(data.remote, &data.remote_listener, &remote_events, &data); diff --git a/src/examples/local-v4l2.c b/src/examples/local-v4l2.c index a4ae9b46b..4a8dac5c5 100644 --- a/src/examples/local-v4l2.c +++ b/src/examples/local-v4l2.c @@ -346,7 +346,7 @@ static int make_nodes(struct data *data) &impl_node, data); pw_node_set_implementation(data->node, &data->impl_node); - pw_node_register(data->node, NULL, NULL, NULL); + pw_node_register(data->node, NULL); factory = pw_core_find_factory(data->core, "spa-node-factory"); props = pw_properties_new(SPA_KEY_LIBRARY_NAME, "v4l2/libspa-v4l2", @@ -366,7 +366,7 @@ static int make_nodes(struct data *data) NULL, NULL, 0); - pw_link_register(data->link, NULL, NULL, NULL); + pw_link_register(data->link, NULL); pw_node_set_active(data->node, true); pw_node_set_active(data->v4l2, true); @@ -385,7 +385,7 @@ int main(int argc, char *argv[]) spa_hook_list_init(&data.hooks); - pw_module_load(data.core, "libpipewire-module-spa-node-factory", NULL, NULL, NULL, NULL); + pw_module_load(data.core, "libpipewire-module-spa-node-factory", NULL, NULL); if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("can't initialize SDL: %s\n", SDL_GetError()); diff --git a/src/examples/media-session.c b/src/examples/media-session.c index b35d4d6e6..3db9b011c 100644 --- a/src/examples/media-session.c +++ b/src/examples/media-session.c @@ -89,7 +89,6 @@ struct impl { struct object { struct impl *impl; uint32_t id; - uint32_t parent_id; uint32_t type; struct pw_proxy *proxy; struct spa_hook listener; @@ -112,6 +111,8 @@ struct node { struct spa_hook listener; struct pw_node_info *info; + uint32_t client_id; + struct spa_list session_link; struct session *session; @@ -401,7 +402,7 @@ static const struct pw_proxy_events node_proxy_events = { }; static int -handle_node(struct impl *impl, uint32_t id, uint32_t parent_id, +handle_node(struct impl *impl, uint32_t id, uint32_t type, const struct spa_dict *props) { const char *str, *media_class; @@ -409,8 +410,10 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id, enum pw_direction direction; struct pw_proxy *p; struct node *node; + uint32_t client_id = SPA_ID_INVALID; - media_class = props ? spa_dict_lookup(props, PW_KEY_MEDIA_CLASS) : NULL; + if (props && (str = spa_dict_lookup(props, PW_KEY_CLIENT_ID)) != NULL) + client_id = atoi(str); p = pw_registry_proxy_bind(impl->registry_proxy, id, type, PW_VERSION_NODE_PROXY, @@ -419,9 +422,9 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id, node = pw_proxy_get_user_data(p); node->obj.impl = impl; node->obj.id = id; - node->obj.parent_id = parent_id; node->obj.type = type; node->obj.proxy = p; + node->client_id = client_id; spa_list_init(&node->port_list); pw_proxy_add_listener(p, &node->obj.listener, &node_proxy_events, node); pw_proxy_add_object_listener(p, &node->listener, &node_events, node); @@ -429,6 +432,8 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id, spa_list_append(&impl->node_list, &node->l); node->type = NODE_TYPE_UNKNOWN; + media_class = props ? spa_dict_lookup(props, PW_KEY_MEDIA_CLASS) : NULL; + pw_log_debug(NAME" %p: node "PW_KEY_MEDIA_CLASS" %s", impl, media_class); if (media_class == NULL) @@ -571,15 +576,21 @@ static const struct pw_proxy_events port_proxy_events = { }; static int -handle_port(struct impl *impl, uint32_t id, uint32_t parent_id, uint32_t type, +handle_port(struct impl *impl, uint32_t id, uint32_t type, const struct spa_dict *props) { struct port *port; struct pw_proxy *p; struct node *node; const char *str; + uint32_t node_id; - if ((node = find_object(impl, parent_id)) == NULL) + if (props == NULL || (str = spa_dict_lookup(props, PW_KEY_NODE_ID)) == NULL) + return -EINVAL; + + node_id = atoi(str); + + if ((node = find_object(impl, node_id)) == NULL) return -ESRCH; if (props == NULL || (str = spa_dict_lookup(props, PW_KEY_PORT_DIRECTION)) == NULL) @@ -592,7 +603,6 @@ handle_port(struct impl *impl, uint32_t id, uint32_t parent_id, uint32_t type, port = pw_proxy_get_user_data(p); port->obj.impl = impl; port->obj.id = id; - port->obj.parent_id = parent_id; port->obj.type = type; port->obj.proxy = p; port->node = node; @@ -607,7 +617,7 @@ handle_port(struct impl *impl, uint32_t id, uint32_t parent_id, uint32_t type, spa_list_append(&node->port_list, &port->l); - pw_log_debug(NAME" %p: new port %d for node %d type %d %08x", impl, id, parent_id, + pw_log_debug(NAME" %p: new port %d for node %d type %d %08x", impl, id, node_id, node->type, port->flags); if (node->type == NODE_TYPE_DEVICE) { @@ -655,7 +665,7 @@ static const struct pw_proxy_events client_proxy_events = { }; static int -handle_client(struct impl *impl, uint32_t id, uint32_t parent_id, +handle_client(struct impl *impl, uint32_t id, uint32_t type, const struct spa_dict *props) { struct pw_proxy *p; @@ -670,7 +680,6 @@ handle_client(struct impl *impl, uint32_t id, uint32_t parent_id, client = pw_proxy_get_user_data(p); client->obj.impl = impl; client->obj.id = id; - client->obj.parent_id = parent_id; client->obj.type = type; client->obj.proxy = p; @@ -695,7 +704,7 @@ handle_client(struct impl *impl, uint32_t id, uint32_t parent_id, } static void -registry_global(void *data,uint32_t id, uint32_t parent_id, +registry_global(void *data,uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props) { @@ -706,15 +715,15 @@ registry_global(void *data,uint32_t id, uint32_t parent_id, switch (type) { case PW_TYPE_INTERFACE_Client: - res = handle_client(impl, id, parent_id, type, props); + res = handle_client(impl, id, type, props); break; case PW_TYPE_INTERFACE_Node: - res = handle_node(impl, id, parent_id, type, props); + res = handle_node(impl, id, type, props); break; case PW_TYPE_INTERFACE_Port: - res = handle_port(impl, id, parent_id, type, props); + res = handle_port(impl, id, type, props); break; default: @@ -1053,7 +1062,7 @@ static int rescan_node(struct impl *impl, struct node *node) pw_log_warn(NAME " %p: no session found for %d", impl, node->obj.id); - client = find_object(impl, node->obj.parent_id); + client = find_object(impl, node->client_id); if (client && client->obj.type == PW_TYPE_INTERFACE_Client) { pw_client_proxy_error((struct pw_client_proxy*)client->obj.proxy, node->obj.id, -ENOENT, "no session available"); @@ -1256,8 +1265,8 @@ int main(int argc, char *argv[]) pw_core_add_spa_lib(impl.core, "api.alsa.*", "alsa/libspa-alsa"); pw_core_add_spa_lib(impl.core, "api.v4l2.*", "v4l2/libspa-v4l2"); - pw_module_load(impl.core, "libpipewire-module-client-device", NULL, NULL, NULL, NULL); - pw_module_load(impl.core, "libpipewire-module-adapter", NULL, NULL, NULL, NULL); + pw_module_load(impl.core, "libpipewire-module-client-device", NULL, NULL); + pw_module_load(impl.core, "libpipewire-module-adapter", NULL, NULL); clock_gettime(CLOCK_MONOTONIC, &impl.now); diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c index 70446854b..8283a805f 100644 --- a/src/gst/gstpipewiredeviceprovider.c +++ b/src/gst/gstpipewiredeviceprovider.c @@ -183,7 +183,6 @@ struct node_data { struct pw_node_proxy *proxy; struct spa_hook proxy_listener; uint32_t id; - uint32_t parent_id; struct spa_hook node_listener; struct pw_node_info *info; GstCaps *caps; @@ -453,7 +452,7 @@ static const struct pw_proxy_events proxy_port_events = { .destroy = destroy_port_proxy, }; -static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, uint32_t permissions, +static void registry_event_global(void *data, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props) { @@ -474,7 +473,6 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, u nd->self = self; nd->proxy = node; nd->id = id; - nd->parent_id = parent_id; nd->caps = gst_caps_new_empty (); spa_list_append(&rd->nodes, &nd->link); pw_node_proxy_add_listener(node, &nd->node_listener, &node_events, nd); @@ -484,8 +482,12 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, u else if (type == PW_TYPE_INTERFACE_Port) { struct pw_port_proxy *port; struct port_data *pd; + const char *str; - if ((nd = find_node_data(rd, parent_id)) == NULL) + if ((str = spa_dict_lookup(props, PW_KEY_NODE_ID)) == NULL) + return; + + if ((nd = find_node_data(rd, atoi(str))) == NULL) return; port = pw_registry_proxy_bind(rd->registry, diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index d46cd9b19..687848dfb 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -38,6 +38,8 @@ #include "modules/spa/spa-node.h" #include "module-adapter/adapter.h" +#define NAME "adapter" + #define FACTORY_USAGE SPA_KEY_FACTORY_NAME"= " \ "["SPA_KEY_LIBRARY_NAME"=] " \ ADAPTER_USAGE @@ -117,6 +119,8 @@ static void *create_object(void *_data, if (properties == NULL) goto error_properties; + pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", d->this->global->id); + slave = NULL; str = pw_properties_get(properties, "adapt.slave.node"); if (str != NULL) { @@ -131,8 +135,6 @@ static void *create_object(void *_data, goto error_properties; slave = pw_spa_node_load(d->core, - NULL, - pw_factory_get_global(d->this), factory_name, PW_SPA_NODE_FLAG_ACTIVATE | PW_SPA_NODE_FLAG_NO_REGISTER, @@ -164,7 +166,7 @@ static void *create_object(void *_data, client = resource ? pw_resource_get_client(resource): NULL; - pw_node_register(adapter, client, pw_module_get_global(d->module), NULL); + pw_node_register(adapter, NULL); if (client) { struct pw_resource *bound_resource; @@ -231,12 +233,32 @@ static void module_destroy(void *data) pw_factory_destroy(d->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", module->global->id); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; @@ -265,17 +287,9 @@ 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), NULL); + pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); pw_module_add_listener(module, &data->module_listener, &module_events, data); - pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); - return 0; } - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); -} diff --git a/src/modules/module-adapter/adapter.c b/src/modules/module-adapter/adapter.c index eab1ecf32..956e5d083 100644 --- a/src/modules/module-adapter/adapter.c +++ b/src/modules/module-adapter/adapter.c @@ -384,7 +384,7 @@ struct pw_node *pw_adapter_new(struct pw_core *core, goto error; } - node = pw_spa_node_load(core, NULL, NULL, + node = pw_spa_node_load(core, factory_name, PW_SPA_NODE_FLAG_ACTIVATE | PW_SPA_NODE_FLAG_NO_REGISTER, pw_properties_copy(props), diff --git a/src/modules/module-client-device.c b/src/modules/module-client-device.c index 8817bec71..c710fc1f3 100644 --- a/src/modules/module-client-device.c +++ b/src/modules/module-client-device.c @@ -33,6 +33,8 @@ #include "module-client-device/client-device.h" +#define NAME "client-device" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Allow clients to create and control remote devices" }, @@ -47,7 +49,6 @@ struct pw_protocol *pw_protocol_native_ext_client_device_init(struct pw_core *co struct factory_data { struct pw_factory *this; - struct pw_properties *properties; struct pw_module *module; struct spa_hook module_listener; @@ -64,7 +65,6 @@ static void *create_object(void *_data, { void *result; struct pw_resource *device_resource; - struct pw_global *parent; struct pw_client *client = pw_resource_get_client(resource); int res; @@ -74,9 +74,7 @@ static void *create_object(void *_data, goto error_resource; } - parent = pw_client_get_global(client); - - result = pw_client_device_new(device_resource, parent, properties); + result = pw_client_device_new(device_resource, properties); if (result == NULL) { res = -errno; goto error_device; @@ -111,20 +109,37 @@ static void module_destroy(void *data) spa_hook_remove(&d->module_listener); - if (d->properties) - pw_properties_free(d->properties); - spa_list_remove(&d->export_spadevice.link); pw_factory_destroy(d->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module))); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; @@ -144,7 +159,6 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie data = pw_factory_get_user_data(factory); data->this = factory; data->module = module; - data->properties = properties; pw_log_debug("module %p: new", module); @@ -154,8 +168,6 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie pw_protocol_native_ext_client_device_init(core); - pw_factory_register(factory, NULL, pw_module_get_global(module), NULL); - data->export_spadevice.type = SPA_TYPE_INTERFACE_Device; data->export_spadevice.func = pw_remote_spa_device_export; pw_core_register_export_type(core, &data->export_spadevice); @@ -166,9 +178,3 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie return 0; } - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); -} diff --git a/src/modules/module-client-device/client-device.h b/src/modules/module-client-device/client-device.h index 818c5c463..9fd8bac6c 100644 --- a/src/modules/module-client-device/client-device.h +++ b/src/modules/module-client-device/client-device.h @@ -35,7 +35,6 @@ extern "C" { struct pw_device * pw_client_device_new(struct pw_resource *resource, - struct pw_global *parent, struct pw_properties *properties); #ifdef __cplusplus diff --git a/src/modules/module-client-device/resource-device.c b/src/modules/module-client-device/resource-device.c index 0c482ba65..460f8d70c 100644 --- a/src/modules/module-client-device/resource-device.c +++ b/src/modules/module-client-device/resource-device.c @@ -48,7 +48,6 @@ struct impl { struct spa_hook resource_listener; struct spa_hook object_listener; - struct pw_global *parent; unsigned int registered:1; }; @@ -56,7 +55,9 @@ static void device_info(void *data, const struct spa_device_info *info) { struct impl *impl = data; if (!impl->registered) { - pw_device_register(impl->device, impl->resource->client, impl->parent, NULL); + pw_device_register(impl->device, NULL); + pw_device_set_implementation(impl->device, + (struct spa_device*)impl->resource); impl->registered = true; } } @@ -103,7 +104,6 @@ static const struct pw_device_events device_events = { }; struct pw_device *pw_client_device_new(struct pw_resource *resource, - struct pw_global *parent, struct pw_properties *properties) { struct impl *impl; @@ -111,6 +111,13 @@ struct pw_device *pw_client_device_new(struct pw_resource *resource, struct pw_client *client = pw_resource_get_client(resource); struct pw_core *core = pw_client_get_core(client); + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + return NULL; + + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", client->global->id); + device = pw_device_new(core, properties, sizeof(struct impl)); if (device == NULL) return NULL; @@ -119,13 +126,10 @@ struct pw_device *pw_client_device_new(struct pw_resource *resource, impl->device = device; impl->core = core; impl->resource = resource; - impl->parent = parent; pw_device_add_listener(impl->device, &impl->device_listener, &device_events, impl); - pw_device_set_implementation(device, - (struct spa_device*)resource); pw_resource_add_listener(impl->resource, &impl->resource_listener, diff --git a/src/modules/module-client-node.c b/src/modules/module-client-node.c index cd37874c6..30f03a267 100644 --- a/src/modules/module-client-node.c +++ b/src/modules/module-client-node.c @@ -33,6 +33,8 @@ #include "module-client-node/client-node.h" +#define NAME "client-node" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Allow clients to create and control remote nodes" }, @@ -48,7 +50,6 @@ struct pw_protocol *pw_protocol_native_ext_client_node_init(struct pw_core *core struct factory_data { struct pw_factory *this; - struct pw_properties *properties; struct pw_module *module; struct spa_hook module_listener; @@ -66,7 +67,6 @@ static void *create_object(void *_data, { void *result; struct pw_resource *node_resource; - struct pw_global *parent; struct pw_client *client = pw_resource_get_client(resource); int res; @@ -76,9 +76,7 @@ static void *create_object(void *_data, goto error_resource; } - parent = pw_client_get_global(client); - - result = pw_client_node_new(node_resource, parent, properties, true); + result = pw_client_node_new(node_resource, properties, true); if (result == NULL) { res = -errno; goto error_node; @@ -112,21 +110,38 @@ static void module_destroy(void *data) spa_hook_remove(&d->module_listener); - if (d->properties) - pw_properties_free(d->properties); - spa_list_remove(&d->export_node.link); spa_list_remove(&d->export_spanode.link); pw_factory_destroy(d->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module))); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; @@ -144,7 +159,6 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie data = pw_factory_get_user_data(factory); data->this = factory; data->module = module; - data->properties = properties; pw_log_debug("module %p: new", module); @@ -154,8 +168,6 @@ 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), NULL); - data->export_node.type = PW_TYPE_INTERFACE_Node; data->export_node.func = pw_remote_node_export; pw_core_register_export_type(core, &data->export_node); @@ -170,9 +182,3 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie return 0; } - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); -} diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index 36adeb51f..11c42b180 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -1621,7 +1621,6 @@ static int process_node(void *data) * \memberof pw_client_node */ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, - struct pw_global *parent, struct pw_properties *properties, bool do_register) { @@ -1639,6 +1638,15 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, goto error_exit_cleanup; } + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) { + res = -errno; + goto error_exit_free; + } + + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", client->global->id); + this = &impl->this; impl->core = core; @@ -1655,10 +1663,7 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, pw_map_init(&impl->io_map, 64, 64); this->resource = resource; - this->parent = parent; this->node = pw_spa_node_new(core, - client, - parent, PW_SPA_NODE_FLAG_ASYNC | (do_register ? 0 : PW_SPA_NODE_FLAG_NO_REGISTER), (struct spa_node *)&impl->node.node, diff --git a/src/modules/module-client-node/client-node.h b/src/modules/module-client-node/client-node.h index 6a3b99ba8..1492c32fc 100644 --- a/src/modules/module-client-node/client-node.h +++ b/src/modules/module-client-node/client-node.h @@ -40,13 +40,11 @@ struct pw_client_node { struct pw_node *node; struct pw_resource *resource; - struct pw_global *parent; uint32_t flags; }; struct pw_client_node * pw_client_node_new(struct pw_resource *resource, - struct pw_global *parent, struct pw_properties *properties, bool do_register); diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index 1e18fcfab..44b6426f6 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -1146,7 +1146,7 @@ struct pw_proxy *pw_remote_spa_node_export(struct pw_remote *remote, return NULL; pw_node_set_implementation(node, (struct spa_node*)object); - pw_node_register(node, NULL, NULL, NULL); + pw_node_register(node, NULL); pw_node_set_active(node, true); return node_export(remote, node, true, user_data_size); diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c index 1fbb1fcad..e0233aa0a 100644 --- a/src/modules/module-link-factory.c +++ b/src/modules/module-link-factory.c @@ -32,6 +32,8 @@ #include #include "pipewire/private.h" +#define NAME "link-factory" + #define FACTORY_USAGE PW_KEY_LINK_OUTPUT_NODE"= " \ "["PW_KEY_LINK_OUTPUT_PORT"=] " \ PW_KEY_LINK_INPUT_NODE"=this->global->id); + if (!linger) + pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", client->global->id); + + link = pw_link_new(core, outport, inport, NULL, properties, sizeof(struct link_data)); properties = NULL; if (link == NULL) { @@ -230,10 +237,7 @@ static void *create_object(void *_data, spa_list_append(&d->link_list, &ld->l); pw_link_add_listener(link, &ld->link_listener, &link_events, ld); - if ((res = pw_link_register(link, - linger ? NULL : client, - linger ? NULL : pw_client_get_global(client), - NULL)) < 0) + if ((res = pw_link_register(link, NULL)) < 0) goto error_link_register; ld->global = pw_link_get_global(link); @@ -249,7 +253,6 @@ static void *create_object(void *_data, res = -ENOENT; goto error_bind; } - pw_resource_add_listener(ld->resource, &ld->resource_listener, &resource_events, ld); } @@ -313,23 +316,39 @@ static void module_destroy(void *data) spa_list_for_each_safe(ld, t, &d->link_list, l) pw_link_destroy(ld->link); - if (d->properties) - pw_properties_free(d->properties); - pw_factory_destroy(d->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module))); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; struct factory_data *data; - int res; factory = pw_factory_new(core, "link-factory", @@ -339,14 +358,12 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie PW_KEY_FACTORY_USAGE, FACTORY_USAGE, NULL), sizeof(*data)); - if (factory == NULL) { - res = -errno; - goto error_cleanup; - } + if (factory == NULL) + return -errno; data = pw_factory_get_user_data(factory); data->this = factory; - data->properties = properties; + data->module = module; spa_list_init(&data->link_list); pw_log_debug("module %p: new", module); @@ -355,25 +372,9 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie &impl_factory, data); - if ((res = pw_factory_register(factory, NULL, pw_module_get_global(module), NULL)) < 0) - goto error_register; + pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); pw_module_add_listener(module, &data->module_listener, &module_events, data); - pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); - return 0; - -error_register: - pw_factory_destroy(factory); -error_cleanup: - if (properties) - pw_properties_free(properties); - return res; -} - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); } diff --git a/src/modules/module-protocol-native.c b/src/modules/module-protocol-native.c index af6a4c238..8bba3abc3 100644 --- a/src/modules/module-protocol-native.c +++ b/src/modules/module-protocol-native.c @@ -72,13 +72,11 @@ struct protocol_data { struct pw_module *module; struct spa_hook module_listener; struct pw_protocol *protocol; - struct pw_properties *properties; }; struct client { struct pw_protocol_client this; - struct pw_properties *properties; struct spa_source *source; struct pw_protocol_native_connection *connection; @@ -257,12 +255,12 @@ static struct pw_client *client_new(struct server *s, int fd) struct client_data *this; struct pw_client *client; struct pw_protocol *protocol = s->this.protocol; - struct protocol_data *pd = protocol->user_data; socklen_t len; struct ucred ucred; struct pw_core *core = protocol->core; struct pw_properties *props; char buffer[1024]; + struct protocol_data *d = pw_protocol_get_user_data(protocol); props = pw_properties_new(PW_KEY_PROTOCOL, "protocol-native", NULL); if (props == NULL) @@ -284,6 +282,8 @@ static struct pw_client *client_new(struct server *s, int fd) pw_properties_setf(props, PW_KEY_SEC_LABEL, "%s", buffer); } + pw_properties_setf(props, PW_KEY_MODULE_ID, "%d", d->module->global->id); + client = pw_client_new(protocol->core, props, sizeof(struct client_data)); @@ -310,8 +310,7 @@ static struct pw_client *client_new(struct server *s, int fd) PW_PERM_RWX, PW_VERSION_CORE_PROXY, 0) < 0) goto cleanup_client; - props = pw_properties_copy(pw_client_get_properties(client)); - if (pw_client_register(client, client, pw_module_get_global(pd->module), props) < 0) + if (pw_client_register(client, NULL) < 0) goto cleanup_client; if (pw_global_bind(pw_client_get_global(client), client, @@ -664,9 +663,6 @@ static void impl_destroy(struct pw_protocol_client *client) pw_loop_destroy_source(remote->core->main_loop, impl->flush_event); - if (impl->properties) - pw_properties_free(impl->properties); - spa_list_remove(&client->link); free(impl); } @@ -688,8 +684,6 @@ impl_new_client(struct pw_protocol *protocol, this->protocol = protocol; this->remote = remote; - impl->properties = properties ? pw_properties_copy(properties) : NULL; - if (properties) str = pw_properties_get(properties, PW_KEY_REMOTE_INTENTION); if (str == NULL) @@ -716,8 +710,6 @@ impl_new_client(struct pw_protocol *protocol, return this; error_cleanup: - if (impl->properties) - pw_properties_free(impl->properties); free(impl); errno = -res; return NULL; @@ -901,9 +893,6 @@ static void module_destroy(void *data) spa_hook_remove(&d->module_listener); - if (d->properties) - pw_properties_free(d->properties); - pw_protocol_destroy(d->protocol); } @@ -912,7 +901,8 @@ static const struct pw_module_events module_events = { .destroy = module_destroy, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_protocol *this; @@ -939,13 +929,12 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie d = pw_protocol_get_user_data(this); d->protocol = this; d->module = module; - d->properties = properties; val = getenv("PIPEWIRE_DAEMON"); if (val == NULL) val = pw_properties_get(pw_core_get_properties(core), PW_KEY_CORE_DAEMON); if (val && pw_properties_parse_bool(val)) { - if (impl_add_server(this, core, properties) == NULL) { + if (impl_add_server(this, core, NULL) == NULL) { res = -errno; goto error_cleanup; } @@ -961,9 +950,3 @@ error_cleanup: pw_protocol_destroy(this); return res; } - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); -} diff --git a/src/modules/module-protocol-native/protocol-native.c b/src/modules/module-protocol-native/protocol-native.c index d6af94e07..6ede164c9 100644 --- a/src/modules/module-protocol-native/protocol-native.c +++ b/src/modules/module-protocol-native/protocol-native.c @@ -632,7 +632,7 @@ static int registry_method_marshal_add_listener(void *object, return 0; } -static void registry_marshal_global(void *object, uint32_t id, uint32_t parent_id, uint32_t permissions, +static void registry_marshal_global(void *object, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props) { struct pw_resource *resource = object; @@ -644,7 +644,6 @@ static void registry_marshal_global(void *object, uint32_t id, uint32_t parent_i spa_pod_builder_push_struct(b, &f); spa_pod_builder_add(b, SPA_POD_Int(id), - SPA_POD_Int(parent_id), SPA_POD_Int(permissions), SPA_POD_Id(type), SPA_POD_Int(version), @@ -1785,14 +1784,13 @@ static int registry_demarshal_global(void *object, const struct pw_protocol_nati struct pw_proxy *proxy = object; struct spa_pod_parser prs; struct spa_pod_frame f[2]; - uint32_t id, parent_id, permissions, type, version; + uint32_t id, permissions, type, version; struct spa_dict props; spa_pod_parser_init(&prs, msg->data, msg->size); if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || spa_pod_parser_get(&prs, SPA_POD_Int(&id), - SPA_POD_Int(&parent_id), SPA_POD_Int(&permissions), SPA_POD_Id(&type), SPA_POD_Int(&version), NULL) < 0) @@ -1808,7 +1806,7 @@ static int registry_demarshal_global(void *object, const struct pw_protocol_nati return -EINVAL; return pw_proxy_notify(proxy, struct pw_registry_proxy_events, - global, 0, id, parent_id, permissions, type, version, + global, 0, id, permissions, type, version, props.n_items > 0 ? &props : NULL); } diff --git a/src/modules/module-rtkit.c b/src/modules/module-rtkit.c index ae57e8678..0375db145 100644 --- a/src/modules/module-rtkit.c +++ b/src/modules/module-rtkit.c @@ -49,7 +49,6 @@ static const struct spa_dict_item module_props[] = { struct impl { struct pw_core *core; - struct pw_properties *properties; struct spa_loop *loop; struct spa_source source; @@ -414,10 +413,6 @@ static void module_destroy(void *data) close(impl->source.fd); impl->source.fd = -1; } - - if (impl->properties) - pw_properties_free(impl->properties); - free(impl); } @@ -476,7 +471,8 @@ static void idle_func(struct spa_source *source) pw_rtkit_bus_free(system_bus); } -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct impl *impl; @@ -498,7 +494,6 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie pw_log_debug("module %p: new", impl); impl->core = core; - impl->properties = properties; impl->loop = loop; impl->source.loop = loop; @@ -523,9 +518,3 @@ error: free(impl); return res; } - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); -} diff --git a/src/modules/spa/module-device-factory.c b/src/modules/spa/module-device-factory.c index 148b41f12..2eb0c4557 100644 --- a/src/modules/spa/module-device-factory.c +++ b/src/modules/spa/module-device-factory.c @@ -33,6 +33,8 @@ #include "spa-device.h" +#define NAME "spa-device-factory" + #define FACTORY_USAGE SPA_KEY_FACTORY_NAME"= " \ "["SPA_KEY_LIBRARY_NAME"=]" @@ -44,8 +46,8 @@ static const struct spa_dict_item module_props[] = { struct factory_data { struct pw_core *core; + struct pw_module *module; struct pw_factory *this; - struct pw_properties *properties; struct spa_hook factory_listener; struct spa_hook module_listener; @@ -93,8 +95,6 @@ static void *create_object(void *_data, goto error_properties; device = pw_spa_device_load(core, - NULL, - pw_factory_get_global(data->this), factory_name, 0, properties, @@ -148,9 +148,6 @@ static void factory_destroy(void *_data) spa_list_consume(nd, &data->device_list, link) pw_device_destroy(nd->device); - - if (data->properties) - pw_properties_free(data->properties); } static const struct pw_factory_events factory_events = { @@ -164,17 +161,36 @@ static void module_destroy(void *_data) pw_factory_destroy(data->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module))); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; struct factory_data *data; - int res; factory = pw_factory_new(core, "spa-device-factory", @@ -187,33 +203,17 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie data = pw_factory_get_user_data(factory); data->this = factory; + data->module = module; data->core = core; - data->properties = properties; spa_list_init(&data->device_list); pw_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_factory_set_implementation(factory, &factory_impl, data); pw_log_debug("module %p: new", module); - pw_module_add_listener(module, &data->module_listener, &module_events, data); - pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); - if ((res = pw_factory_register(factory, - NULL, - pw_module_get_global(module), - NULL)) < 0) - goto error_register; + pw_module_add_listener(module, &data->module_listener, &module_events, data); return 0; - -error_register: - pw_factory_destroy(factory); - return res; -} - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); } diff --git a/src/modules/spa/module-device.c b/src/modules/spa/module-device.c index e7f04c9b6..684419a02 100644 --- a/src/modules/spa/module-device.c +++ b/src/modules/spa/module-device.c @@ -95,8 +95,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) } device = pw_spa_device_load(core, - NULL, - pw_module_get_global(module), argv[0], 0, props, diff --git a/src/modules/spa/module-monitor.c b/src/modules/spa/module-monitor.c index b79a9f539..8c7228bea 100644 --- a/src/modules/spa/module-monitor.c +++ b/src/modules/spa/module-monitor.c @@ -93,7 +93,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) } monitor = pw_spa_monitor_load(core, - pw_module_get_global(module), argv[0], argv[1], props, sizeof(struct data)); diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c index c6d8b8bbc..5f111fff2 100644 --- a/src/modules/spa/module-node-factory.c +++ b/src/modules/spa/module-node-factory.c @@ -33,6 +33,8 @@ #include "spa-node.h" +#define NAME "spa-node-factory" + #define FACTORY_USAGE SPA_KEY_FACTORY_NAME"= " \ "["SPA_KEY_LIBRARY_NAME"=]" @@ -45,7 +47,7 @@ static const struct spa_dict_item module_props[] = { struct factory_data { struct pw_core *core; struct pw_factory *this; - struct pw_properties *properties; + struct pw_module *module; struct spa_hook factory_listener; struct spa_hook module_listener; @@ -110,9 +112,10 @@ static void *create_object(void *_data, if (factory_name == NULL) goto error_properties; + pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", + pw_global_get_id(pw_factory_get_global(data->this))); + node = pw_spa_node_load(core, - NULL, - pw_factory_get_global(data->this), factory_name, PW_SPA_NODE_FLAG_ACTIVATE, properties, @@ -183,9 +186,6 @@ static void factory_destroy(void *_data) spa_list_consume(nd, &data->node_list, link) pw_node_destroy(nd->node); - - if (data->properties) - pw_properties_free(data->properties); } static const struct pw_factory_events factory_events = { @@ -199,17 +199,36 @@ static void module_destroy(void *_data) pw_factory_destroy(data->this); } +static void module_registered(void *data) +{ + struct factory_data *d = data; + struct pw_module *module = d->module; + struct pw_factory *factory = d->this; + struct spa_dict_item items[1]; + char id[16]; + int res; + + snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module))); + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id); + pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1)); + + if ((res = pw_factory_register(factory, NULL)) < 0) { + pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res)); + } +} + static const struct pw_module_events module_events = { PW_VERSION_MODULE_EVENTS, .destroy = module_destroy, + .registered = module_registered, }; -static int module_init(struct pw_module *module, struct pw_properties *properties) +SPA_EXPORT +int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); struct pw_factory *factory; struct factory_data *data; - int res; factory = pw_factory_new(core, "spa-node-factory", @@ -223,7 +242,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie data = pw_factory_get_user_data(factory); data->this = factory; data->core = core; - data->properties = properties; + data->module = module; spa_list_init(&data->node_list); pw_factory_add_listener(factory, &data->factory_listener, &factory_events, data); @@ -234,19 +253,5 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); - if ((res = pw_factory_register(factory, - NULL, pw_module_get_global(module), NULL)) < 0) - goto error_register; - return 0; - -error_register: - pw_factory_destroy(factory); - return res; -} - -SPA_EXPORT -int pipewire__module_init(struct pw_module *module, const char *args) -{ - return module_init(module, NULL); } diff --git a/src/modules/spa/module-node.c b/src/modules/spa/module-node.c index ff102650c..d4828c251 100644 --- a/src/modules/spa/module-node.c +++ b/src/modules/spa/module-node.c @@ -95,8 +95,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) } node = pw_spa_node_load(core, - NULL, - pw_module_get_global(module), argv[0], PW_SPA_NODE_FLAG_ACTIVATE, props, diff --git a/src/modules/spa/spa-device.c b/src/modules/spa/spa-device.c index d4e004882..4e7200898 100644 --- a/src/modules/spa/spa-device.c +++ b/src/modules/spa/spa-device.c @@ -44,9 +44,6 @@ struct impl { struct pw_device *this; - struct pw_client *owner; - struct pw_global *parent; - enum pw_spa_device_flags flags; void *unload; @@ -77,8 +74,6 @@ static const struct pw_device_events device_events = { struct pw_device * pw_spa_device_new(struct pw_core *core, - struct pw_client *owner, - struct pw_global *parent, enum pw_spa_device_flags flags, struct spa_device *device, struct spa_handle *handle, @@ -95,8 +90,6 @@ pw_spa_device_new(struct pw_core *core, impl = this->user_data; impl->this = this; - impl->owner = owner; - impl->parent = parent; impl->device = device; impl->handle = handle; impl->flags = flags; @@ -108,7 +101,7 @@ pw_spa_device_new(struct pw_core *core, pw_device_set_implementation(this, impl->device); if (!SPA_FLAG_CHECK(impl->flags, PW_SPA_DEVICE_FLAG_NO_REGISTER)) { - if ((res = pw_device_register(this, impl->owner, impl->parent, NULL)) < 0) + if ((res = pw_device_register(this, NULL)) < 0) goto error_register; } return this; @@ -126,8 +119,6 @@ void *pw_spa_device_get_user_data(struct pw_device *device) } struct pw_device *pw_spa_device_load(struct pw_core *core, - struct pw_client *owner, - struct pw_global *parent, const char *factory_name, enum pw_spa_device_flags flags, struct pw_properties *properties, @@ -146,7 +137,7 @@ struct pw_device *pw_spa_device_load(struct pw_core *core, if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Device, &iface)) < 0) goto error_interface; - this = pw_spa_device_new(core, owner, parent, flags, + this = pw_spa_device_new(core, flags, iface, handle, properties, user_data_size); if (this == NULL) goto error_device; diff --git a/src/modules/spa/spa-device.h b/src/modules/spa/spa-device.h index 4a34c0f7a..df8b1443d 100644 --- a/src/modules/spa/spa-device.h +++ b/src/modules/spa/spa-device.h @@ -41,8 +41,6 @@ enum pw_spa_device_flags { struct pw_device * pw_spa_device_new(struct pw_core *core, - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< optional parent */ enum pw_spa_device_flags flags, struct spa_device *device, struct spa_handle *handle, @@ -51,8 +49,6 @@ pw_spa_device_new(struct pw_core *core, struct pw_device * pw_spa_device_load(struct pw_core *core, - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< optional parent */ const char *factory_name, enum pw_spa_device_flags flags, struct pw_properties *properties, diff --git a/src/modules/spa/spa-monitor.c b/src/modules/spa/spa-monitor.c index 03880c7b2..deff494b9 100644 --- a/src/modules/spa/spa-monitor.c +++ b/src/modules/spa/spa-monitor.c @@ -62,7 +62,6 @@ struct impl { struct pw_spa_monitor this; struct pw_core *core; - struct pw_global *parent; struct spa_list item_list; }; @@ -139,7 +138,7 @@ static struct monitor_object *add_object(struct pw_spa_monitor *this, uint32_t i case SPA_TYPE_INTERFACE_Device: { struct pw_device *device; - device = pw_spa_device_new(core, NULL, impl->parent, + device = pw_spa_device_new(core, 0, iface, handle, props, 0); pw_device_add_listener(device, &obj->object_listener, &device_events, obj); @@ -262,7 +261,6 @@ static const struct spa_monitor_callbacks callbacks = { }; struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, - struct pw_global *parent, const char *factory_name, const char *system_name, struct pw_properties *properties, @@ -294,7 +292,6 @@ struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, } impl->core = core; - impl->parent = parent; spa_list_init(&impl->item_list); this = &impl->this; diff --git a/src/modules/spa/spa-monitor.h b/src/modules/spa/spa-monitor.h index a55b36f7a..6bea028bb 100644 --- a/src/modules/spa/spa-monitor.h +++ b/src/modules/spa/spa-monitor.h @@ -46,7 +46,6 @@ struct pw_spa_monitor { struct pw_spa_monitor * pw_spa_monitor_load(struct pw_core *core, - struct pw_global *parent, const char *factory_name, const char *system_name, struct pw_properties *properties, diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index d1babaaaf..4b1e05397 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -46,9 +46,6 @@ struct impl { struct pw_node *this; - struct pw_client *owner; - struct pw_global *parent; - enum pw_spa_node_flags flags; struct spa_handle *handle; @@ -86,7 +83,7 @@ static void complete_init(struct impl *impl) pw_node_set_active(this, true); if (!SPA_FLAG_CHECK(impl->flags, PW_SPA_NODE_FLAG_NO_REGISTER)) - pw_node_register(this, impl->owner, impl->parent, NULL); + pw_node_register(this, NULL); else pw_node_initialized(this); } @@ -110,8 +107,6 @@ static const struct pw_node_events node_events = { struct pw_node * pw_spa_node_new(struct pw_core *core, - struct pw_client *owner, - struct pw_global *parent, enum pw_spa_node_flags flags, struct spa_node *node, struct spa_handle *handle, @@ -130,8 +125,6 @@ pw_spa_node_new(struct pw_core *core, impl = this->user_data; impl->this = this; - impl->owner = owner; - impl->parent = parent; impl->node = node; impl->handle = handle; impl->flags = flags; @@ -242,8 +235,6 @@ setup_props(struct pw_core *core, struct spa_node *spa_node, struct pw_propertie struct pw_node *pw_spa_node_load(struct pw_core *core, - struct pw_client *owner, - struct pw_global *parent, const char *factory_name, enum pw_spa_node_flags flags, struct pw_properties *properties, @@ -279,7 +270,7 @@ struct pw_node *pw_spa_node_load(struct pw_core *core, } } - this = pw_spa_node_new(core, owner, parent, flags, + this = pw_spa_node_new(core, flags, spa_node, handle, properties, user_data_size); if (this == NULL) { res = -errno; diff --git a/src/modules/spa/spa-node.h b/src/modules/spa/spa-node.h index ecc290aa0..241d2789c 100644 --- a/src/modules/spa/spa-node.h +++ b/src/modules/spa/spa-node.h @@ -42,8 +42,6 @@ enum pw_spa_node_flags { struct pw_node * pw_spa_node_new(struct pw_core *core, - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< optional parent */ enum pw_spa_node_flags flags, struct spa_node *node, struct spa_handle *handle, @@ -52,8 +50,6 @@ pw_spa_node_new(struct pw_core *core, struct pw_node * pw_spa_node_load(struct pw_core *core, - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< optional parent */ const char *factory_name, enum pw_spa_node_flags flags, struct pw_properties *properties, diff --git a/src/pipewire/client.c b/src/pipewire/client.c index aa190a87d..b37acbf30 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -30,6 +30,7 @@ #include "pipewire/private.h" #include "pipewire/resource.h" #include "pipewire/type.h" +#include "pipewire/keys.h" #define NAME "client" @@ -370,16 +371,30 @@ static const struct pw_global_events global_events = { SPA_EXPORT int pw_client_register(struct pw_client *client, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_core *core = client->core; + const char *keys[] = { + PW_KEY_MODULE_ID, + PW_KEY_PROTOCOL, + PW_KEY_SEC_PID, + PW_KEY_SEC_UID, + PW_KEY_SEC_GID, + PW_KEY_SEC_LABEL, + NULL + }; if (client->registered) goto error_existed; - pw_log_debug(NAME" %p: register parent %d", client, parent ? parent->id : SPA_ID_INVALID); + pw_log_debug(NAME" %p: register", client); + + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + return -errno; + + pw_properties_copy_keys(client->properties, properties, keys); client->global = pw_global_new(core, PW_TYPE_INTERFACE_Client, @@ -393,9 +408,12 @@ int pw_client_register(struct pw_client *client, spa_list_append(&core->client_list, &client->link); client->registered = true; - pw_global_add_listener(client->global, &client->global_listener, &global_events, client); - pw_global_register(client->global, owner, parent); client->info.id = client->global->id; + pw_properties_setf(client->properties, PW_KEY_CLIENT_ID, "%d", client->info.id); + client->info.props = &client->properties->dict; + + pw_global_add_listener(client->global, &client->global_listener, &global_events, client); + pw_global_register(client->global); return 0; @@ -520,6 +538,7 @@ int pw_client_update_properties(struct pw_client *client, const struct spa_dict int changed; changed = pw_properties_update(client->properties, dict); + client->info.props = &client->properties->dict; pw_log_debug(NAME" %p: updated %d properties", client, changed); @@ -527,7 +546,6 @@ int pw_client_update_properties(struct pw_client *client, const struct spa_dict return 0; client->info.change_mask |= PW_CLIENT_CHANGE_MASK_PROPS; - client->info.props = &client->properties->dict; pw_client_emit_info_changed(client, &client->info); diff --git a/src/pipewire/client.h b/src/pipewire/client.h index 222b4d6e2..7de801275 100644 --- a/src/pipewire/client.h +++ b/src/pipewire/client.h @@ -117,8 +117,6 @@ void pw_client_destroy(struct pw_client *client); /** Finish configuration and register a client */ int pw_client_register(struct pw_client *client, /**< the client to register */ - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< the client parent */ struct pw_properties *properties/**< extra properties */); /** Get the client user data */ diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 8c67c6f27..cdae50c0a 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -270,12 +270,10 @@ static struct pw_registry_proxy * core_get_registry(void *object, uint32_t versi if (PW_PERM_IS_R(permissions)) { pw_registry_resource_global(registry_resource, global->id, - global->parent->id, permissions, global->type, global->version, - global->properties ? - &global->properties->dict : NULL); + &global->properties->dict); } } @@ -572,7 +570,6 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, this->info.version = pw_get_library_version(); srandom(time(NULL)); this->info.cookie = random(); - this->info.props = &properties->dict; this->info.name = name; this->sc_pagesize = sysconf(_SC_PAGESIZE); @@ -592,11 +589,12 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, res = -errno; goto error_free_loop; } + this->info.id = this->global->id; + pw_properties_setf(this->properties, PW_KEY_CORE_ID, "%d", this->info.id); + this->info.props = &this->properties->dict; pw_global_add_listener(this->global, &this->global_listener, &global_events, this); - pw_global_register(this->global, NULL, NULL); - - this->info.id = this->global->id; + pw_global_register(this->global); return this; @@ -737,6 +735,7 @@ int pw_core_update_properties(struct pw_core *core, const struct spa_dict *dict) int changed; changed = pw_properties_update(core->properties, dict); + core->info.props = &core->properties->dict; pw_log_debug(NAME" %p: updated %d properties", core, changed); @@ -744,7 +743,6 @@ int pw_core_update_properties(struct pw_core *core, const struct spa_dict *dict) return 0; core->info.change_mask = PW_CORE_CHANGE_MASK_PROPS; - core->info.props = &core->properties->dict; pw_core_emit_info_changed(core, &core->info); diff --git a/src/pipewire/device.c b/src/pipewire/device.c index b9c5151a2..f1b5f5679 100644 --- a/src/pipewire/device.c +++ b/src/pipewire/device.c @@ -363,13 +363,19 @@ static const struct pw_global_events global_events = { SPA_EXPORT int pw_device_register(struct pw_device *device, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_core *core = device->core; struct node_data *nd; - const char *str; + const char *keys[] = { + PW_KEY_MODULE_ID, + PW_KEY_CLIENT_ID, + PW_KEY_DEVICE_DESCRIPTION, + PW_KEY_DEVICE_NAME, + PW_KEY_DEVICE_NICK, + PW_KEY_MEDIA_CLASS, + NULL + }; if (device->registered) goto error_existed; @@ -379,17 +385,11 @@ int pw_device_register(struct pw_device *device, if (properties == NULL) return -errno; - if ((str = pw_properties_get(device->properties, PW_KEY_DEVICE_DESCRIPTION)) != NULL) - pw_properties_set(properties, PW_KEY_DEVICE_DESCRIPTION, str); - if ((str = pw_properties_get(device->properties, PW_KEY_DEVICE_NAME)) != NULL) - pw_properties_set(properties, PW_KEY_DEVICE_NAME, str); - if ((str = pw_properties_get(device->properties, PW_KEY_DEVICE_NICK)) != NULL) - pw_properties_set(properties, PW_KEY_DEVICE_NICK, str); - if ((str = pw_properties_get(device->properties, PW_KEY_MEDIA_CLASS)) != NULL) - pw_properties_set(properties, PW_KEY_MEDIA_CLASS, str); + pw_properties_copy_keys(device->properties, properties, keys); device->global = pw_global_new(core, - PW_TYPE_INTERFACE_Device, PW_VERSION_DEVICE_PROXY, + PW_TYPE_INTERFACE_Device, + PW_VERSION_DEVICE_PROXY, properties, global_bind, device); @@ -400,11 +400,14 @@ int pw_device_register(struct pw_device *device, device->registered = true; device->info.id = device->global->id; + pw_properties_setf(device->properties, PW_KEY_DEVICE_ID, "%d", device->info.id); + device->info.props = &device->properties->dict; + pw_global_add_listener(device->global, &device->global_listener, &global_events, device); - pw_global_register(device->global, owner, parent); + pw_global_register(device->global); spa_list_for_each(nd, &device->node_list, link) { - pw_node_register(nd->node, NULL, device->global, NULL); + pw_node_register(nd->node, NULL); pw_node_set_active(nd->node, true); } return 0; @@ -451,13 +454,13 @@ static int update_properties(struct pw_device *device, const struct spa_dict *di int changed; changed = pw_properties_update(device->properties, dict); + device->info.props = &device->properties->dict; pw_log_debug(NAME" %p: updated %d properties", device, changed); if (!changed) return 0; - device->info.props = &device->properties->dict; device->info.change_mask |= PW_DEVICE_CHANGE_MASK_PROPS; return changed; @@ -529,7 +532,7 @@ static void device_add(struct pw_device *device, uint32_t id, pw_node_set_implementation(node, iface); if (device->global) { - pw_node_register(node, NULL, device->global, NULL); + pw_node_register(node, NULL); pw_node_set_active(node, true); } return; diff --git a/src/pipewire/device.h b/src/pipewire/device.h index c7fad1cea..73a286a16 100644 --- a/src/pipewire/device.h +++ b/src/pipewire/device.h @@ -68,8 +68,6 @@ struct pw_device *pw_device_new(struct pw_core *core, size_t user_data_size); int pw_device_register(struct pw_device *device, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties); void pw_device_destroy(struct pw_device *device); diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index 921d0010c..5fbff04c3 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -49,10 +49,18 @@ struct pw_factory *pw_factory_new(struct pw_core *core, size_t user_data_size) { struct pw_factory *this; + int res; + + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + return NULL; this = calloc(1, sizeof(*this) + user_data_size); - if (this == NULL) - return NULL; + if (this == NULL) { + res = -errno; + goto error_exit; + }; this->core = core; this->properties = properties; @@ -60,7 +68,7 @@ struct pw_factory *pw_factory_new(struct pw_core *core, this->info.name = strdup(name); this->info.type = type; this->info.version = version; - this->info.props = properties ? &properties->dict : NULL; + this->info.props = &properties->dict; spa_hook_list_init(&this->listener_list); if (user_data_size > 0) @@ -69,6 +77,12 @@ struct pw_factory *pw_factory_new(struct pw_core *core, pw_log_debug(NAME" %p: new %s", this, name); return this; + +error_exit: + if (properties) + pw_properties_free(properties); + errno = -res; + return NULL; } SPA_EXPORT @@ -87,8 +101,8 @@ void pw_factory_destroy(struct pw_factory *factory) pw_log_debug(NAME" %p: free", factory); free((char *)factory->info.name); - if (factory->properties) - pw_properties_free(factory->properties); + + pw_properties_free(factory->properties); free(factory); } @@ -148,13 +162,44 @@ static const struct pw_global_events global_events = { .destroy = global_destroy, }; +SPA_EXPORT +const struct pw_properties *pw_factory_get_properties(struct pw_factory *factory) +{ + return factory->properties; +} + +SPA_EXPORT +int pw_factory_update_properties(struct pw_factory *factory, const struct spa_dict *dict) +{ + struct pw_resource *resource; + int changed; + + changed = pw_properties_update(factory->properties, dict); + factory->info.props = &factory->properties->dict; + + pw_log_debug(NAME" %p: updated %d properties", factory, changed); + + if (!changed) + return 0; + + factory->info.change_mask |= PW_FACTORY_CHANGE_MASK_PROPS; + if (factory->global) + spa_list_for_each(resource, &factory->global->resource_list, link) + pw_factory_resource_info(resource, &factory->info); + factory->info.change_mask = 0; + + return changed; +} + SPA_EXPORT int pw_factory_register(struct pw_factory *factory, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_core *core = factory->core; + const char *keys[] = { + PW_KEY_MODULE_ID, + NULL + }; if (factory->registered) goto error_existed; @@ -164,6 +209,8 @@ int pw_factory_register(struct pw_factory *factory, if (properties == NULL) return -errno; + pw_properties_copy_keys(factory->properties, properties, keys); + pw_properties_set(properties, PW_KEY_FACTORY_NAME, factory->info.name); pw_properties_setf(properties, PW_KEY_FACTORY_TYPE_NAME, "%s", spa_debug_type_find_name(pw_type_info(), factory->info.type)); @@ -181,9 +228,12 @@ int pw_factory_register(struct pw_factory *factory, spa_list_append(&core->factory_list, &factory->link); factory->registered = true; - pw_global_add_listener(factory->global, &factory->global_listener, &global_events, factory); - pw_global_register(factory->global, owner, parent); factory->info.id = factory->global->id; + pw_properties_setf(factory->properties, PW_KEY_FACTORY_ID, "%d", factory->info.id); + factory->info.props = &factory->properties->dict; + + pw_global_add_listener(factory->global, &factory->global_listener, &global_events, factory); + pw_global_register(factory->global); return 0; diff --git a/src/pipewire/factory.h b/src/pipewire/factory.h index d583606c5..a4a07c014 100644 --- a/src/pipewire/factory.h +++ b/src/pipewire/factory.h @@ -72,9 +72,13 @@ struct pw_factory *pw_factory_new(struct pw_core *core, struct pw_properties *properties, size_t user_data_size); +/** Get the factory properties */ +const struct pw_properties *pw_factory_get_properties(struct pw_factory *factory); + +/** Update the factory properties */ +int pw_factory_update_properties(struct pw_factory *factory, const struct spa_dict *dict); + int pw_factory_register(struct pw_factory *factory, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties); void pw_factory_destroy(struct pw_factory *factory); diff --git a/src/pipewire/global.c b/src/pipewire/global.c index cb2f5e6c7..52831e454 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -77,6 +77,11 @@ pw_global_new(struct pw_core *core, struct pw_global *this; int res; + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + return NULL; + impl = calloc(1, sizeof(struct impl)); if (impl == NULL) { res = -errno; @@ -98,7 +103,6 @@ pw_global_new(struct pw_core *core, goto error_free; } - spa_list_init(&this->child_list); spa_list_init(&this->resource_list); spa_hook_list_init(&this->listener_list); @@ -120,17 +124,12 @@ error_cleanup: /** register a global to the core registry * * \param global a global to add - * \param owner an optional owner client of the global - * \param parent an optional parent of the global * \return 0 on success < 0 errno value on failure * * \memberof pw_global */ SPA_EXPORT -int -pw_global_register(struct pw_global *global, - struct pw_client *owner, - struct pw_global *parent) +int pw_global_register(struct pw_global *global) { struct impl *impl = SPA_CONTAINER_OF(global, struct impl, this); struct pw_resource *registry; @@ -139,16 +138,6 @@ pw_global_register(struct pw_global *global, if (impl->registered) return -EEXIST; - global->owner = owner; - if (owner && parent == NULL) - parent = owner->global; - if (parent == NULL) - parent = core->global; - if (parent == NULL) - parent = global; - global->parent = parent; - spa_list_append(&parent->child_list, &global->child_link); - spa_list_append(&core->global_list, &global->link); impl->registered = true; @@ -158,15 +147,13 @@ pw_global_register(struct pw_global *global, if (PW_PERM_IS_R(permissions)) pw_registry_resource_global(registry, global->id, - global->parent->id, permissions, global->type, global->version, - global->properties ? - &global->properties->dict : NULL); + &global->properties->dict); } - pw_log_debug(NAME" %p: registered %u owner %p parent %p", global, global->id, owner, parent); + pw_log_debug(NAME" %p: registered %u", global, global->id); pw_core_emit_global_added(core, global); return 0; @@ -177,17 +164,10 @@ static int global_unregister(struct pw_global *global) struct impl *impl = SPA_CONTAINER_OF(global, struct impl, this); struct pw_core *core = global->core; struct pw_resource *resource; - struct pw_global *g; if (!impl->registered) return 0; - spa_list_consume(g, &global->child_list, child_link) { - if (g == global) - break; - global_unregister(g); - } - spa_list_for_each(resource, &core->registry_resource_list, link) { uint32_t permissions = pw_global_get_permissions(global, resource->client); pw_log_debug("registry %p: global %d %08x", resource, global->id, permissions); @@ -195,8 +175,6 @@ static int global_unregister(struct pw_global *global) pw_registry_resource_global_remove(resource, global->id); } - global->parent = NULL; - spa_list_remove(&global->child_link); spa_list_remove(&global->link); pw_map_remove(&core->globals, global->id); impl->registered = false; @@ -213,18 +191,6 @@ struct pw_core *pw_global_get_core(struct pw_global *global) return global->core; } -SPA_EXPORT -struct pw_client *pw_global_get_owner(struct pw_global *global) -{ - return global->owner; -} - -SPA_EXPORT -struct pw_global *pw_global_get_parent(struct pw_global *global) -{ - return global->parent; -} - SPA_EXPORT uint32_t pw_global_get_type(struct pw_global *global) { @@ -340,12 +306,10 @@ int pw_global_update_permissions(struct pw_global *global, struct pw_client *cli client, resource, global->id); pw_registry_resource_global(resource, global->id, - global->parent->id, new_permissions, global->type, global->version, - global->properties ? - &global->properties->dict : NULL); + &global->properties->dict); } } @@ -384,8 +348,7 @@ void pw_global_destroy(struct pw_global *global) pw_log_debug(NAME" %p: free", global); pw_global_emit_free(global); - if (global->properties) - pw_properties_free(global->properties); + pw_properties_free(global->properties); free(global); } diff --git a/src/pipewire/global.h b/src/pipewire/global.h index bbaa9fa6c..2c63c9b54 100644 --- a/src/pipewire/global.h +++ b/src/pipewire/global.h @@ -41,9 +41,6 @@ extern "C" { * * A client can bind to a global to send methods or receive events from * the global. - * - * Global objects are arranged in a hierarchy where each global has a parent - * global. The core global is the top parent in the hierarchy. */ /** \class pw_global * @@ -92,9 +89,7 @@ pw_global_new(struct pw_core *core, /**< the core */ void *object /**< global object */); /** Register a global object to the core registry */ -int pw_global_register(struct pw_global *global, - struct pw_client *owner, - struct pw_global *parent); +int pw_global_register(struct pw_global *global); /** Add an event listener on the global */ void pw_global_add_listener(struct pw_global *global, @@ -108,12 +103,6 @@ uint32_t pw_global_get_permissions(struct pw_global *global, struct pw_client *c /** Get the core object of this global */ struct pw_core *pw_global_get_core(struct pw_global *global); -/** Get the owner of the global. This can be NULL when the core is owner */ -struct pw_client *pw_global_get_owner(struct pw_global *global); - -/** Get the parent of a global */ -struct pw_global *pw_global_get_parent(struct pw_global *global); - /** Get the global type */ uint32_t pw_global_get_type(struct pw_global *global); diff --git a/src/pipewire/interfaces.h b/src/pipewire/interfaces.h index 3836017e6..448275b03 100644 --- a/src/pipewire/interfaces.h +++ b/src/pipewire/interfaces.h @@ -396,13 +396,12 @@ struct pw_registry_proxy_events { * available. * * \param id the global object id - * \param parent_id the parent global id * \param permissions the permissions of the object * \param type the type of the interface * \param version the version of the interface * \param props extra properties of the global */ - void (*global) (void *object, uint32_t id, uint32_t parent_id, + void (*global) (void *object, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props); /** diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index 818261d18..d5864d907 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -36,7 +36,8 @@ extern "C" { * read-only. They are usually used for security sensitive information that * needs to be fixed. * - * Properties from the parent can also appear on children. + * Properties from other objects can also appear. This usually suggests some + * sort of parent/child or owner/owned relationship. */ /* Peroperties usually set on the core object */ @@ -65,6 +66,7 @@ extern "C" { #define PW_KEY_LIBRARY_NAME_LOOP "library.name.loop" /**< name of the loop library to use */ #define PW_KEY_LIBRARY_NAME_DBUS "library.name.dbus" /**< name of the dbus library to use */ +#define PW_KEY_CORE_ID "core.id" /**< the core id */ #define PW_KEY_CORE_MONITORS "core.monitors" /**< the apis monitored by core. */ /* remote keys */ @@ -97,6 +99,7 @@ extern "C" { #define PW_KEY_WINDOW_X11_DISPLAY "window.x11.display" /**< the X11 display string. Ex. ":0.0" */ /** Client properties */ +#define PW_KEY_CLIENT_ID "client.id" /**< a client id */ #define PW_KEY_CLIENT_NAME "client.name" /**< the client name */ #define PW_KEY_CLIENT_API "client.api" /**< the client api used to access * PipeWire */ @@ -135,6 +138,7 @@ extern "C" { #define PW_KEY_PORT_MONITOR "port.monitor" /**< if this port is a monitor port */ /** link properties */ +#define PW_KEY_LINK_ID "link.id" /**< a link id */ #define PW_KEY_LINK_INPUT_NODE "link.input.node" /**< input node id of a link */ #define PW_KEY_LINK_INPUT_PORT "link.input.port" /**< input port id of a link */ #define PW_KEY_LINK_OUTPUT_NODE "link.output.node" /**< output node id of a link */ @@ -181,6 +185,7 @@ extern "C" { * latency, quality or form factor. */ /** module properties */ +#define PW_KEY_MODULE_ID "module.id" /**< the module id */ #define PW_KEY_MODULE_NAME "module.name" /**< the name of the module */ #define PW_KEY_MODULE_AUTHOR "module.author" /**< the author's name */ #define PW_KEY_MODULE_DESCRIPTION "module.description" /**< a human readable one-line description @@ -190,6 +195,7 @@ extern "C" { #define PW_KEY_MODULE_VERSION "module.version" /**< a version string for the module. */ /** Factory properties */ +#define PW_KEY_FACTORY_ID "factory.id" /**< the factory id */ #define PW_KEY_FACTORY_NAME "factory.name" /**< the name of the factory */ #define PW_KEY_FACTORY_USAGE "factory.usage" /**< the usage of the factory */ #define PW_KEY_FACTORY_TYPE_NAME "factory.type.name" /**< the name of the type created by a factory */ diff --git a/src/pipewire/link.c b/src/pipewire/link.c index d7fe21454..3f6fb8258 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1200,16 +1200,6 @@ check_permission(struct pw_core *core, struct pw_port *input, struct pw_properties *properties) { - struct pw_client *client; - - if ((client = output->global->owner) != NULL && - !PW_PERM_IS_R(pw_global_get_permissions(input->global, client))) - return -EACCES; - - if ((client = input->global->owner) != NULL && - !PW_PERM_IS_R(pw_global_get_permissions(output->global, client))) - return -EACCES; - return 0; } @@ -1265,6 +1255,7 @@ struct pw_link *pw_link_new(struct pw_core *core, struct impl *impl; struct pw_link *this; struct pw_node *input_node, *output_node; + const char *str; int res; if (output == input) @@ -1283,6 +1274,11 @@ struct pw_link *pw_link_new(struct pw_core *core, output_node = output->node; input_node = input->node; + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + goto error_no_mem; + impl = calloc(1, sizeof(struct impl) + user_data_size); if (impl == NULL) goto error_no_mem; @@ -1303,11 +1299,10 @@ struct pw_link *pw_link_new(struct pw_core *core, this->output = output; this->input = input; - if (properties) { - const char *str = pw_properties_get(properties, PW_KEY_LINK_PASSIVE); - if (str && pw_properties_parse_bool(str)) - impl->passive = true; - } + /* passive means that this link does not make the nodes active */ + if ((str = pw_properties_get(properties, PW_KEY_LINK_PASSIVE)) != NULL) + impl->passive = pw_properties_parse_bool(str); + spa_hook_list_init(&this->listener_list); impl->format_filter = format_filter; @@ -1328,7 +1323,7 @@ struct pw_link *pw_link_new(struct pw_core *core, spa_list_append(&input->links, &this->input_link); this->info.format = NULL; - this->info.props = this->properties ? &this->properties->dict : NULL; + this->info.props = &this->properties->dict; impl->io.buffer_id = SPA_ID_INVALID; impl->io.status = SPA_STATUS_NEED_BUFFER; @@ -1413,12 +1408,15 @@ static const struct pw_global_events global_events = { SPA_EXPORT int pw_link_register(struct pw_link *link, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_core *core = link->core; struct pw_node *output_node, *input_node; + const char *keys[] = { + PW_KEY_FACTORY_ID, + PW_KEY_CLIENT_ID, + NULL + }; if (link->registered) goto error_existed; @@ -1436,6 +1434,8 @@ int pw_link_register(struct pw_link *link, link->info.input_node_id = input_node->global->id; link->info.input_port_id = link->input->global->id; + pw_properties_copy_keys(link->properties, properties, keys); + pw_properties_setf(properties, PW_KEY_LINK_OUTPUT_PORT, "%d", link->info.output_port_id); pw_properties_setf(properties, PW_KEY_LINK_INPUT_PORT, "%d", link->info.input_port_id); @@ -1452,8 +1452,11 @@ int pw_link_register(struct pw_link *link, link->registered = true; link->info.id = link->global->id; + pw_properties_setf(link->properties, PW_KEY_LINK_ID, "%d", link->info.id); + link->info.props = &link->properties->dict; + pw_global_add_listener(link->global, &link->global_listener, &global_events, link); - pw_global_register(link->global, owner, parent); + pw_global_register(link->global); debug_link(link); @@ -1500,8 +1503,7 @@ void pw_link_destroy(struct pw_link *link) pw_work_queue_destroy(impl->work); - if (link->properties) - pw_properties_free(link->properties); + pw_properties_free(link->properties); pw_core_recalc_graph(link->core); diff --git a/src/pipewire/link.h b/src/pipewire/link.h index a1c9c57dd..0d3decc7f 100644 --- a/src/pipewire/link.h +++ b/src/pipewire/link.h @@ -95,8 +95,6 @@ void pw_link_add_listener(struct pw_link *link, /** Finish link configuration and register */ int pw_link_register(struct pw_link *link, /**< the link to register */ - struct pw_client *owner, /**< optional link owner */ - struct pw_global *parent, /**< parent global */ struct pw_properties *properties /**< extra properties */); /** Get the core of a link */ diff --git a/src/pipewire/module.c b/src/pipewire/module.c index a56c56fd7..a36107ac5 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -178,8 +178,6 @@ SPA_EXPORT struct pw_module * pw_module_load(struct pw_core *core, const char *name, const char *args, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_module *this; @@ -247,7 +245,6 @@ pw_module_load(struct pw_core *core, this->info.filename = filename; filename = NULL; this->info.args = args ? strdup(args) : NULL; - this->info.props = &this->properties->dict; this->global = pw_global_new(core, PW_TYPE_INTERFACE_Module, @@ -262,13 +259,19 @@ pw_module_load(struct pw_core *core, goto error_no_global; spa_list_append(&core->module_list, &this->link); - pw_global_add_listener(this->global, &this->global_listener, &global_events, this); + this->info.id = this->global->id; + pw_properties_setf(this->properties, PW_KEY_MODULE_ID, "%d", this->info.id); + this->info.props = &this->properties->dict; + + pw_global_add_listener(this->global, &this->global_listener, &global_events, this); if ((res = init_func(this, args)) < 0) goto error_init_failed; - pw_global_register(this->global, owner, parent); + pw_global_register(this->global); + + pw_module_emit_registered(this); pw_log_debug(NAME" %p: loaded module: %s", this, this->info.name); @@ -369,14 +372,13 @@ int pw_module_update_properties(struct pw_module *module, const struct spa_dict int changed; changed = pw_properties_update(module->properties, dict); + module->info.props = &module->properties->dict; pw_log_debug(NAME" %p: updated %d properties", module, changed); if (!changed) return 0; - module->info.props = &module->properties->dict; - module->info.change_mask |= PW_MODULE_CHANGE_MASK_PROPS; if (module->global) spa_list_for_each(resource, &module->global->resource_list, link) diff --git a/src/pipewire/module.h b/src/pipewire/module.h index af18cef1c..0a3e7e652 100644 --- a/src/pipewire/module.h +++ b/src/pipewire/module.h @@ -63,14 +63,16 @@ struct pw_module_events { /** The module is destroyed */ void (*destroy) (void *data); + + /** The module is registered. This is a good time to register + * objectes created from the module. */ + void (*registered) (void *data); }; struct pw_module * pw_module_load(struct pw_core *core, const char *name, /**< name of the module */ const char *args /**< arguments of the module */, - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< parent global */ struct pw_properties *properties /**< extra global properties */); /** Get the core of a module */ diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 523fd144e..c439b4f02 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -544,13 +544,21 @@ static const struct pw_global_events global_events = { SPA_EXPORT int pw_node_register(struct pw_node *this, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_core *core = this->core; struct pw_port *port; - const char *str; + const char *keys[] = { + PW_KEY_CLIENT_ID, + PW_KEY_DEVICE_ID, + PW_KEY_NODE_DESCRIPTION, + PW_KEY_NODE_NAME, + PW_KEY_NODE_NICK, + PW_KEY_NODE_SESSION, + PW_KEY_MEDIA_CLASS, + PW_KEY_MEDIA_ROLE, + NULL + }; pw_log_debug(NAME" %p: register", this); @@ -562,18 +570,7 @@ int pw_node_register(struct pw_node *this, if (properties == NULL) return -errno; - if ((str = pw_properties_get(this->properties, PW_KEY_NODE_DESCRIPTION)) != NULL) - pw_properties_set(properties, PW_KEY_NODE_DESCRIPTION, str); - if ((str = pw_properties_get(this->properties, PW_KEY_NODE_NAME)) != NULL) - pw_properties_set(properties, PW_KEY_NODE_NAME, str); - if ((str = pw_properties_get(this->properties, PW_KEY_NODE_NICK)) != NULL) - pw_properties_set(properties, PW_KEY_NODE_NICK, str); - if ((str = pw_properties_get(this->properties, PW_KEY_MEDIA_CLASS)) != NULL) - pw_properties_set(properties, PW_KEY_MEDIA_CLASS, str); - if ((str = pw_properties_get(this->properties, PW_KEY_MEDIA_ROLE)) != NULL) - pw_properties_set(properties, PW_KEY_MEDIA_ROLE, str); - if ((str = pw_properties_get(this->properties, PW_KEY_NODE_SESSION)) != NULL) - pw_properties_set(properties, PW_KEY_NODE_SESSION, str); + pw_properties_copy_keys(this->properties, properties, keys); this->global = pw_global_new(core, PW_TYPE_INTERFACE_Node, @@ -592,18 +589,17 @@ int pw_node_register(struct pw_node *this, this->info.id = this->global->id; this->rt.activation->position.clock.id = this->info.id; pw_properties_setf(this->properties, PW_KEY_NODE_ID, "%d", this->info.id); + this->info.props = &this->properties->dict; pw_node_initialized(this); pw_global_add_listener(this->global, &this->global_listener, &global_events, this); - pw_global_register(this->global, owner, parent); + pw_global_register(this->global); spa_list_for_each(port, &this->input_ports, link) - pw_port_register(port, this->global->owner, this->global, - pw_properties_copy(port->properties)); + pw_port_register(port, NULL); spa_list_for_each(port, &this->output_ports, link) - pw_port_register(port, this->global->owner, this->global, - pw_properties_copy(port->properties)); + pw_port_register(port, NULL); return 0; @@ -997,12 +993,12 @@ static int update_properties(struct pw_node *node, const struct spa_dict *dict) int changed; changed = pw_properties_update(node->properties, dict); + node->info.props = &node->properties->dict; pw_log_debug(NAME" %p: updated %d properties", node, changed); if (changed) { check_properties(node); - node->info.props = &node->properties->dict; node->info.change_mask |= PW_NODE_CHANGE_MASK_PROPS; } return changed; diff --git a/src/pipewire/node.h b/src/pipewire/node.h index e3005329d..1d6c2ecab 100644 --- a/src/pipewire/node.h +++ b/src/pipewire/node.h @@ -107,8 +107,6 @@ pw_node_new(struct pw_core *core, /**< the core */ /** Complete initialization of the node and register */ int pw_node_register(struct pw_node *node, /**< node to register */ - struct pw_client *owner, /**< optional owner */ - struct pw_global *parent, /**< optional parent */ struct pw_properties *properties /**< extra properties */); /** Destroy a node */ diff --git a/src/pipewire/port.c b/src/pipewire/port.c index e1ea3fdb0..8485a8e0f 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -256,10 +256,10 @@ static int update_properties(struct pw_port *port, const struct spa_dict *dict) int changed; changed = pw_properties_update(port->properties, dict); + port->info.props = &port->properties->dict; if (changed) { pw_log_debug(NAME" %p: updated %d properties", port, changed); - port->info.props = &port->properties->dict; port->info.change_mask |= PW_PORT_CHANGE_MASK_PROPS; } return changed; @@ -675,15 +675,32 @@ static const struct pw_global_events global_events = { }; int pw_port_register(struct pw_port *port, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties) { struct pw_node *node = port->node; + const char *keys[] = { + PW_KEY_FORMAT_DSP, + PW_KEY_PORT_NAME, + PW_KEY_PORT_DIRECTION, + PW_KEY_PORT_PHYSICAL, + PW_KEY_PORT_TERMINAL, + PW_KEY_PORT_CONTROL, + PW_KEY_PORT_ALIAS1, + PW_KEY_PORT_ALIAS2, + NULL + }; - if (node == NULL) + if (node == NULL || node->global == NULL) return -EIO; + if (properties == NULL) + properties = pw_properties_new(NULL, NULL); + if (properties == NULL) + return -errno; + + pw_properties_setf(properties, PW_KEY_NODE_ID, "%d", node->global->id); + pw_properties_copy_keys(port->properties, properties, keys); + port->global = pw_global_new(node->core, PW_TYPE_INTERFACE_Port, PW_VERSION_PORT_PROXY, @@ -695,7 +712,12 @@ int pw_port_register(struct pw_port *port, pw_global_add_listener(port->global, &port->global_listener, &global_events, port); - return pw_global_register(port->global, owner, parent); + port->info.id = port->global->id; + pw_properties_setf(port->properties, PW_KEY_NODE_ID, "%d", node->global->id); + pw_properties_setf(port->properties, PW_KEY_PORT_ID, "%d", port->info.id); + port->info.props = &port->properties->dict; + + return pw_global_register(port->global); } SPA_EXPORT @@ -752,6 +774,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node) pw_properties_setf(port->properties, PW_KEY_PORT_NAME, "%s_%d", dir, port->port_id); } } + port->info.props = &port->properties->dict; if (control) { pw_log_debug(NAME" %p: setting node control", port); @@ -781,8 +804,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node) } if (node->global) - pw_port_register(port, node->global->owner, node->global, - pw_properties_copy(port->properties)); + pw_port_register(port, NULL); pw_loop_invoke(node->data_loop, do_add_port, SPA_ID_INVALID, NULL, 0, false, port); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 675235ceb..282d183c8 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -129,14 +129,9 @@ struct pw_client { struct pw_global { struct pw_core *core; /**< the core */ - struct pw_client *owner; /**< the owner of this object, NULL when the - * PipeWire server is the owner */ struct spa_list link; /**< link in core list of globals */ uint32_t id; /**< server id of the object */ - struct pw_global *parent; /**< parent global */ - struct spa_list child_link; /**< link in parent child list of globals */ - struct spa_list child_list; /**< The list of child globals */ struct pw_properties *properties; /**< properties of the global */ @@ -316,6 +311,7 @@ struct pw_device { #define pw_module_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_module_events, m, v, ##__VA_ARGS__) #define pw_module_emit_destroy(m) pw_module_emit(m, destroy, 0) +#define pw_module_emit_registered(m) pw_module_emit(m, registered, 0) struct pw_module { struct pw_core *core; /**< the core object */ @@ -709,8 +705,8 @@ struct pw_remote { struct pw_stream { - struct pw_remote *remote; /**< the owner remote */ - struct spa_list link; /**< link in the remote */ + struct pw_remote *remote; /**< the owner remote */ + struct spa_list link; /**< link in the remote */ char *name; /**< the name of the stream */ struct pw_properties *properties; /**< properties of the stream */ @@ -813,8 +809,6 @@ pw_port_new(enum pw_direction direction, void pw_port_update_info(struct pw_port *port, const struct spa_port_info *info); int pw_port_register(struct pw_port *port, - struct pw_client *owner, - struct pw_global *parent, struct pw_properties *properties); /** Get the user data of a port, the size of the memory was given \ref in pw_port_new */ diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index fc06f93e6..168c1420f 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -221,7 +221,7 @@ struct pw_remote *pw_remote_new(struct pw_core *core, if ((protocol_name = pw_properties_get(properties, PW_KEY_PROTOCOL)) == NULL) { if (pw_module_load(core, "libpipewire-module-protocol-native", - NULL, NULL, NULL, NULL) == NULL) { + NULL, NULL) == NULL) { res = -errno; goto error_protocol; } @@ -239,9 +239,9 @@ struct pw_remote *pw_remote_new(struct pw_core *core, if (this->conn == NULL) goto error_connection; - pw_module_load(core, "libpipewire-module-rtkit", NULL, NULL, NULL, NULL); - pw_module_load(core, "libpipewire-module-client-node", NULL, NULL, NULL, NULL); - pw_module_load(core, "libpipewire-module-adapter", NULL, NULL, NULL, NULL); + pw_module_load(core, "libpipewire-module-rtkit", NULL, NULL); + pw_module_load(core, "libpipewire-module-client-node", NULL, NULL); + pw_module_load(core, "libpipewire-module-adapter", NULL, NULL); spa_list_append(&core->remote_list, &this->link); diff --git a/src/tests/test-core.c b/src/tests/test-core.c index d69cdaac7..12772906f 100644 --- a/src/tests/test-core.c +++ b/src/tests/test-core.c @@ -147,8 +147,6 @@ static void test_create(void) spa_assert(global != NULL); spa_assert(pw_core_find_global(core, 0) == global); spa_assert(pw_global_get_core(global) == core); - spa_assert(pw_global_get_owner(global) == NULL); - spa_assert(pw_global_get_parent(global) == global); spa_assert(pw_global_get_type(global) == PW_TYPE_INTERFACE_Core); spa_assert(pw_global_get_version(global) == PW_VERSION_CORE_PROXY); spa_assert(pw_global_get_id(global) == 0); diff --git a/src/tests/test-interfaces.c b/src/tests/test-interfaces.c index e4d029f20..f8f046c97 100644 --- a/src/tests/test-interfaces.c +++ b/src/tests/test-interfaces.c @@ -106,7 +106,7 @@ static void test_registry_abi(void) } methods = { PW_VERSION_REGISTRY_PROXY_METHODS, }; struct { uint32_t version; - void (*global) (void *object, uint32_t id, uint32_t parent_id, + void (*global) (void *object, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props); void (*global_remove) (void *object, uint32_t id); diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c index 5092d7938..c02d2b0d5 100644 --- a/src/tools/pipewire-cli.c +++ b/src/tools/pipewire-cli.c @@ -54,7 +54,6 @@ struct data { struct global { struct remote_data *rd; uint32_t id; - uint32_t parent_id; uint32_t permissions; uint32_t type; uint32_t version; @@ -247,7 +246,7 @@ static bool do_load_module(struct data *data, const char *cmd, char *args, char return false; } - module = pw_module_load(data->core, a[0], n == 2 ? a[1] : NULL, NULL, NULL, NULL); + module = pw_module_load(data->core, a[0], n == 2 ? a[1] : NULL, NULL); if (module == NULL) { asprintf(error, "Could not load module"); return false; @@ -288,7 +287,7 @@ static int print_global(void *obj, void *data) if (global == NULL) return 0; - fprintf(stdout, "\tid %d, parent %d, type %s/%d\n", global->id, global->parent_id, + fprintf(stdout, "\tid %d, type %s/%d\n", global->id, spa_debug_type_find_name(pw_type_info(), global->type), global->version); if (global->properties) @@ -297,7 +296,7 @@ static int print_global(void *obj, void *data) return 0; } -static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, +static void registry_event_global(void *data, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props) { @@ -308,7 +307,6 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, global = calloc(1, sizeof(struct global)); global->rd = rd; global->id = id; - global->parent_id = parent_id; global->permissions = permissions; global->type = type; global->version = version; @@ -527,7 +525,6 @@ static void info_global(struct proxy_data *pd) return; fprintf(stdout, "\tid: %d\n", global->id); - fprintf(stdout, "\tparent_id: %d\n", global->parent_id); fprintf(stdout, "\tpermissions: %c%c%c\n", global->permissions & PW_PERM_R ? 'r' : '-', global->permissions & PW_PERM_W ? 'w' : '-', global->permissions & PW_PERM_X ? 'x' : '-'); @@ -1386,7 +1383,7 @@ int main(int argc, char *argv[]) data.core = pw_core_new(l, pw_properties_new(PW_KEY_CORE_DAEMON, "1", NULL), 0); info = pw_core_get_info(data.core); - pw_module_load(data.core, "libpipewire-module-link-factory", NULL, NULL, NULL, NULL); + pw_module_load(data.core, "libpipewire-module-link-factory", NULL, NULL); pw_loop_add_io(l, STDIN_FILENO, SPA_IO_IN|SPA_IO_HUP, false, do_input, &data); diff --git a/src/tools/pipewire-monitor.c b/src/tools/pipewire-monitor.c index 9bb3aa3be..abb2ad97e 100644 --- a/src/tools/pipewire-monitor.c +++ b/src/tools/pipewire-monitor.c @@ -67,7 +67,6 @@ struct proxy_data { bool first; struct pw_proxy *proxy; uint32_t id; - uint32_t parent_id; uint32_t permissions; uint32_t version; uint32_t type; @@ -223,7 +222,6 @@ static void module_event_info(void *object, const struct pw_module_info *info) info = data->info = pw_module_info_update(data->info, info); printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -259,7 +257,6 @@ static void print_node(struct proxy_data *data) } printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -328,7 +325,6 @@ static void print_port(struct proxy_data *data) } printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -390,7 +386,6 @@ static void factory_event_info(void *object, const struct pw_factory_info *info) info = data->info = pw_factory_info_update(data->info, info); printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -427,7 +422,6 @@ static void client_event_info(void *object, const struct pw_client_info *info) info = data->info = pw_client_info_update(data->info, info); printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -462,7 +456,6 @@ static void link_event_info(void *object, const struct pw_link_info *info) info = data->info = pw_link_info_update(data->info, info); printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -511,7 +504,6 @@ static void print_device(struct proxy_data *data) } printf("\tid: %d\n", data->id); - printf("\tparent_id: %d\n", data->parent_id); printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', data->permissions & PW_PERM_W ? 'w' : '-', data->permissions & PW_PERM_X ? 'x' : '-'); @@ -577,7 +569,7 @@ static const struct pw_proxy_events proxy_events = { .destroy = destroy_proxy, }; -static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, +static void registry_event_global(void *data, uint32_t id, uint32_t permissions, uint32_t type, uint32_t version, const struct spa_dict *props) { @@ -631,7 +623,6 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, default: printf("added:\n"); printf("\tid: %u\n", id); - printf("\tparent_id: %d\n", parent_id); printf("\tpermissions: %c%c%c\n", permissions & PW_PERM_R ? 'r' : '-', permissions & PW_PERM_W ? 'w' : '-', permissions & PW_PERM_X ? 'x' : '-'); @@ -651,7 +642,6 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, pd->first = true; pd->proxy = proxy; pd->id = id; - pd->parent_id = parent_id; pd->permissions = permissions; pd->version = version; pd->type = type;