From 9856500a13256cf76b6d58d90c87b177a58331d7 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 10 Jun 2024 10:19:03 +0200 Subject: [PATCH] module-spa: evaluate node and device rules Before loading the node or device spa plugin, evaluate the node and device rules so that we can use them to configure the plugin properties when it is loaded. --- src/modules/spa/spa-device.c | 22 ++++++++++++++++++++++ src/modules/spa/spa-node.c | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/modules/spa/spa-device.c b/src/modules/spa/spa-device.c index 4273dd9f3..68befcaef 100644 --- a/src/modules/spa/spa-device.c +++ b/src/modules/spa/spa-device.c @@ -92,6 +92,22 @@ void *pw_spa_device_get_user_data(struct pw_impl_device *device) return impl->user_data; } +struct match { + struct pw_properties *props; + int count; +}; +#define MATCH_INIT(p) ((struct match){ .props = (p) }) + +static int execute_match(void *data, const char *location, const char *action, + const char *val, size_t len) +{ + struct match *match = data; + if (spa_streq(action, "update-props")) { + match->count += pw_properties_update_string(match->props, val, len); + } + return 1; +} + struct pw_impl_device *pw_spa_device_load(struct pw_context *context, const char *factory_name, enum pw_spa_device_flags flags, @@ -102,7 +118,13 @@ struct pw_impl_device *pw_spa_device_load(struct pw_context *context, struct spa_handle *handle; void *iface; int res; + struct match match; + if (properties) { + match = MATCH_INIT(properties); + pw_context_conf_section_match_rules(context, "device.rules", + &properties->dict, execute_match, &match); + } handle = pw_context_load_spa_handle(context, factory_name, properties ? &properties->dict : NULL); if (handle == NULL) diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index 09ce3f813..8f5749271 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -211,6 +211,22 @@ setup_props(struct pw_context *context, struct spa_node *spa_node, struct pw_pro return 0; } +struct match { + struct pw_properties *props; + int count; +}; +#define MATCH_INIT(p) ((struct match){ .props = (p) }) + +static int execute_match(void *data, const char *location, const char *action, + const char *val, size_t len) +{ + struct match *match = data; + if (spa_streq(action, "update-props")) { + match->count += pw_properties_update_string(match->props, val, len); + } + return 1; +} + struct pw_impl_node *pw_spa_node_load(struct pw_context *context, const char *factory_name, @@ -225,6 +241,7 @@ struct pw_impl_node *pw_spa_node_load(struct pw_context *context, void *iface; const struct pw_properties *p; struct pw_loop *loop; + struct match match; if (properties) { p = pw_context_get_properties(context); @@ -235,6 +252,11 @@ struct pw_impl_node *pw_spa_node_load(struct pw_context *context, if (properties == NULL) return NULL; } + + match = MATCH_INIT(properties); + pw_context_conf_section_match_rules(context, "node.rules", + &properties->dict, execute_match, &match); + loop = pw_context_acquire_loop(context, &properties->dict); if (loop == NULL) { res = -errno;