From 324894e6053997d94709e406ad3cd5ccfb12a277 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 30 Jun 2021 13:49:34 +0200 Subject: [PATCH] keys: add object.register property Add a new object.register boolean property. Make adapter and remote-note only register when object.register is true. Make stream and filter not register themselves. They are always exported to a remote server and thus don't need local registration. Fixes #1309 --- src/modules/module-adapter.c | 10 ++++++++-- src/modules/module-client-node/remote-node.c | 9 ++++++++- src/pipewire/filter.c | 6 +++++- src/pipewire/keys.h | 9 +++++---- src/pipewire/stream.c | 1 + 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index a9e92e003..aab7ba750 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -168,7 +168,7 @@ static void *create_object(void *_data, const char *str, *factory_name; int res; struct node_data *nd; - bool linger; + bool linger, do_register; if (properties == NULL) goto error_properties; @@ -179,6 +179,9 @@ static void *create_object(void *_data, str = pw_properties_get(properties, PW_KEY_OBJECT_LINGER); linger = str ? pw_properties_parse_bool(str) : false; + str = pw_properties_get(properties, PW_KEY_OBJECT_REGISTER); + do_register = str ? pw_properties_parse_bool(str) : true; + client = resource ? pw_resource_get_client(resource): NULL; if (client && !linger) { pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", @@ -231,7 +234,10 @@ static void *create_object(void *_data, pw_impl_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd); - pw_impl_node_register(adapter, NULL); + if (do_register) + pw_impl_node_register(adapter, NULL); + else + pw_impl_node_initialized(adapter); return adapter; diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index 317723b1a..a91b53e33 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -1275,6 +1275,11 @@ struct pw_proxy *pw_core_spa_node_export(struct pw_core *core, { struct pw_impl_node *node; struct pw_proxy *proxy; + const char *str; + bool do_register; + + str = props ? spa_dict_lookup(props, PW_KEY_OBJECT_REGISTER) : NULL; + do_register = str ? pw_properties_parse_bool(str) : true; node = pw_context_create_node(pw_core_get_context(core), props ? pw_properties_new_dict(props) : NULL, 0); @@ -1282,7 +1287,9 @@ struct pw_proxy *pw_core_spa_node_export(struct pw_core *core, return NULL; pw_impl_node_set_implementation(node, (struct spa_node*)object); - pw_impl_node_register(node, NULL); + + if (do_register) + pw_impl_node_register(node, NULL); proxy = node_export(core, node, true, user_data_size); if (proxy) diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 42b6fca9e..0411836e1 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -1454,6 +1454,7 @@ pw_filter_connect(struct pw_filter *filter, const char *str; int res; uint32_t i; + struct spa_dict_item items[1]; pw_log_debug(NAME" %p: connect", filter); impl->flags = flags; @@ -1506,8 +1507,11 @@ pw_filter_connect(struct pw_filter *filter, } pw_log_debug(NAME" %p: export node %p", filter, &impl->impl_node); + + items[0] = SPA_DICT_ITEM_INIT(PW_KEY_OBJECT_REGISTER, "false"); filter->proxy = pw_core_export(filter->core, - SPA_TYPE_INTERFACE_Node, NULL, &impl->impl_node, 0); + SPA_TYPE_INTERFACE_Node, &SPA_DICT_INIT_ARRAY(items), + &impl->impl_node, 0); if (filter->proxy == NULL) { res = -errno; goto error_proxy; diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index 82c91e9b1..67e9b91d2 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -61,8 +61,13 @@ 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 */ +/** object properties */ #define PW_KEY_OBJECT_PATH "object.path" /**< unique path to construct the object */ #define PW_KEY_OBJECT_ID "object.id" /**< a global object id */ +#define PW_KEY_OBJECT_LINGER "object.linger" /**< the object lives on even after the client + * that created it has been destroyed */ +#define PW_KEY_OBJECT_REGISTER "object.register" /**< If the object should be registered. */ + /* config */ #define PW_KEY_CONFIG_PREFIX "config.prefix" /**< a config prefix directory */ @@ -259,10 +264,6 @@ extern "C" { #define PW_KEY_STREAM_CAPTURE_SINK "stream.capture.sink" /**< Try to capture the sink output instead of * source output */ -/** object properties */ -#define PW_KEY_OBJECT_LINGER "object.linger" /**< the object lives on even after the client - * that created it has been destroyed */ - /** Media */ #define PW_KEY_MEDIA_TYPE "media.type" /**< Media type, one of * Audio, Video, Midi */ diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 2f1c55ae9..4b61af980 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1747,6 +1747,7 @@ pw_stream_connect(struct pw_stream *stream, goto error_node; } pw_properties_setf(props, "adapt.follower.node", "pointer:%p", follower); + pw_properties_set(props, "object.register", "false"); impl->node = pw_impl_factory_create_object(factory, NULL, PW_TYPE_INTERFACE_Node,