diff options
author | Wim Taymans <wtaymans@redhat.com> | 2020-08-06 18:03:04 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2020-08-06 18:03:04 +0200 |
commit | 784a516fcaa677df7d2062bcad1ec409aa58817d (patch) | |
tree | 4698b85c59e1f001a08da4f85d717d5e7e37ba3f | |
parent | 44e74c599f2a2e387728ac1a06cf6942273c4d41 (diff) |
node: manually enable a node in the session managerenable
Don't enable nodes automatically but only after the session
manager says so.
-rw-r--r-- | src/examples/media-session/policy-node.c | 33 | ||||
-rw-r--r-- | src/modules/module-adapter.c | 8 | ||||
-rw-r--r-- | src/modules/module-client-node/remote-node.c | 11 | ||||
-rw-r--r-- | src/pipewire/impl-device.c | 2 | ||||
-rw-r--r-- | src/pipewire/impl-node.c | 8 | ||||
-rw-r--r-- | src/pipewire/stream.c | 2 |
6 files changed, 49 insertions, 15 deletions
diff --git a/src/examples/media-session/policy-node.c b/src/examples/media-session/policy-node.c index 9d6e2568..b05703f2 100644 --- a/src/examples/media-session/policy-node.c +++ b/src/examples/media-session/policy-node.c @@ -139,7 +139,16 @@ static bool find_format(struct node *node) return have_format; } -static int configure_node(struct node *node, struct spa_audio_info *info) +static int enable_node(struct node *node, bool enable) +{ + node->active = node->configured = enable; + pw_node_send_command((struct pw_node*)node->obj->obj.proxy, + &SPA_NODE_COMMAND_INIT(enable ? + SPA_NODE_COMMAND_Enable : SPA_NODE_COMMAND_Disable)); + return 0; +} + +static int configure_node(struct node *node, struct spa_audio_info *info, bool enable) { struct impl *impl = node->impl; char buf[1024]; @@ -172,6 +181,9 @@ static int configure_node(struct node *node, struct spa_audio_info *info) SPA_PARAM_PortConfig, 0, param); node->configured = true; + if (enable) + pw_node_send_command((struct pw_node*)node->obj->obj.proxy, + &SPA_NODE_COMMAND_INIT(SPA_NODE_COMMAND_Enable)); return 0; } @@ -229,7 +241,7 @@ handle_node(struct impl *impl, struct sm_object *object) spa_list_append(&impl->node_list, &node->link); if (role && !strcmp(role, "DSP")) - node->active = node->configured = true; + enable_node(node, true); if (strstr(media_class, "Stream/") == media_class) { media_class += strlen("Stream/"); @@ -252,10 +264,10 @@ handle_node(struct impl *impl, struct sm_object *object) else node->plugged = SPA_TIMESPEC_TO_NSEC(&impl->now); } - node->active = node->configured = true; + enable_node(node, true); } else if (strstr(media_class, "Unknown") == media_class) { - node->active = node->configured = true; + enable_node(node, true); } node->direction = direction; @@ -272,7 +284,7 @@ handle_node(struct impl *impl, struct sm_object *object) else if (strstr(media_class, "Video/") == media_class) { media_class += strlen("Video/"); media = "Video"; - node->active = node->configured = true; + enable_node(node, true); } else return 0; @@ -447,7 +459,7 @@ static int link_nodes(struct node *node, struct node *peer) pw_log_debug(NAME " %p: link nodes %d %d", impl, node->id, peer->id); if (node->dont_remix) - configure_node(node, NULL); + configure_node(node, NULL, false); else { #if 0 bool configured = node->configured; @@ -457,7 +469,7 @@ static int link_nodes(struct node *node, struct node *peer) &SPA_NODE_COMMAND_INIT(SPA_NODE_COMMAND_Suspend)); } #endif - configure_node(node, &peer->format); + configure_node(node, &peer->format, false); #if 0 if (configured) { pw_node_send_command((struct pw_node*)node->obj->obj.proxy, @@ -484,6 +496,9 @@ static int link_nodes(struct node *node, struct node *peer) pw_properties_free(props); + pw_node_send_command((struct pw_node*)node->obj->obj.proxy, + &SPA_NODE_COMMAND_INIT(SPA_NODE_COMMAND_Enable)); + return 0; } @@ -531,7 +546,7 @@ static int rescan_node(struct impl *impl, struct node *n) } if (n->type == NODE_TYPE_DEVICE) { - configure_node(n, NULL); + configure_node(n, NULL, true); return 0; } @@ -557,7 +572,7 @@ static int rescan_node(struct impl *impl, struct node *n) str = spa_dict_lookup(props, PW_KEY_NODE_AUTOCONNECT); if (str == NULL || !pw_properties_parse_bool(str)) { pw_log_debug(NAME" %p: node %d does not need autoconnect", impl, n->id); - configure_node(n, NULL); + configure_node(n, NULL, true); return 0; } diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index 34d6a899..b79022b9 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -155,6 +155,7 @@ static void *create_object(void *_data, const char *str, *factory_name; int res; struct node_data *nd; + bool activate; if (properties == NULL) goto error_properties; @@ -169,6 +170,9 @@ static void *create_object(void *_data, pw_impl_client_get_info(client)->id); } + str = pw_properties_get(properties, "node.activate"); + activate = str ? pw_properties_parse_bool(str) : false; + follower = NULL; str = pw_properties_get(properties, "adapt.follower.node"); if (str != NULL) { @@ -184,7 +188,7 @@ static void *create_object(void *_data, follower = pw_spa_node_load(d->context, factory_name, - PW_SPA_NODE_FLAG_ACTIVATE | + (activate ? PW_SPA_NODE_FLAG_ACTIVATE : 0) | PW_SPA_NODE_FLAG_NO_REGISTER, pw_properties_copy(properties), 0); if (follower == NULL) @@ -216,7 +220,7 @@ static void *create_object(void *_data, pw_impl_node_register(adapter, NULL); - pw_impl_node_set_active(adapter, true); + pw_impl_node_set_active(adapter, activate); return adapter; diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index fb479511..67d43f05 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -488,6 +488,16 @@ static int client_node_command(void *object, const struct spa_command *command) } break; + case SPA_NODE_COMMAND_Enable: + pw_log_debug("node %p: enable", proxy); + res = pw_impl_node_set_active(data->node, true); + break; + + case SPA_NODE_COMMAND_Disable: + pw_log_debug("node %p: disable", proxy); + res = pw_impl_node_set_active(data->node, false); + break; + default: pw_log_warn("unhandled node command %d", SPA_NODE_COMMAND_ID(command)); res = -ENOTSUP; @@ -1242,7 +1252,6 @@ struct pw_proxy *pw_core_spa_node_export(struct pw_core *core, pw_impl_node_set_implementation(node, (struct spa_node*)object); pw_impl_node_register(node, NULL); - pw_impl_node_set_active(node, true); return node_export(core, node, true, user_data_size); } diff --git a/src/pipewire/impl-device.c b/src/pipewire/impl-device.c index 3f7f1d95..85b50f39 100644 --- a/src/pipewire/impl-device.c +++ b/src/pipewire/impl-device.c @@ -105,7 +105,7 @@ static void object_register(struct object_data *od) switch (od->type) { case OBJECT_NODE: pw_impl_node_register(od->object, NULL); - pw_impl_node_set_active(od->object, true); +// pw_impl_node_set_active(od->object, true); break; case OBJECT_DEVICE: pw_impl_device_register(od->object, NULL); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index d11da9c7..ab50d10e 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -483,6 +483,14 @@ static int node_send_command(void *object, const struct spa_command *command) case SPA_NODE_COMMAND_Suspend: suspend_node(node); break; + case SPA_NODE_COMMAND_Enable: + pw_impl_node_set_active(node, true); + spa_node_send_command(node->node, command); + break; + case SPA_NODE_COMMAND_Disable: + pw_impl_node_set_active(node, false); + spa_node_send_command(node->node, command); + break; default: spa_node_send_command(node->node, command); break; diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index ec82839a..48f2e9b2 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1546,8 +1546,6 @@ pw_stream_connect(struct pw_stream *stream, pw_properties_free(props); props = NULL; } - if (!SPA_FLAG_IS_SET(impl->flags, PW_STREAM_FLAG_INACTIVE)) - pw_impl_node_set_active(impl->node, true); pw_log_debug(NAME" %p: export node %p", stream, impl->node); stream->proxy = pw_core_export(stream->core, |