summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2020-08-06 18:03:04 +0200
committerWim Taymans <wtaymans@redhat.com>2020-08-06 18:03:04 +0200
commit784a516fcaa677df7d2062bcad1ec409aa58817d (patch)
tree4698b85c59e1f001a08da4f85d717d5e7e37ba3f
parent44e74c599f2a2e387728ac1a06cf6942273c4d41 (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.c33
-rw-r--r--src/modules/module-adapter.c8
-rw-r--r--src/modules/module-client-node/remote-node.c11
-rw-r--r--src/pipewire/impl-device.c2
-rw-r--r--src/pipewire/impl-node.c8
-rw-r--r--src/pipewire/stream.c2
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,