From e02e9dc6cfb45337829fc0053ec5e064fd8e7383 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 5 Feb 2026 17:33:07 +0100 Subject: [PATCH] ucm: substitute define IDs and macro arguments (Syntax 9) It is useful to substitute the variable names and string macro arguments. It may simplify the UCM configurations. E.g.: Define."${var:Name} Suffix" "Value" Macro.a.DoIt "Channels=${var:PlaybackChannels}" Signed-off-by: Jaroslav Kysela --- src/ucm/parser.c | 24 +++++++++++++++++++++--- src/ucm/ucm_local.h | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ucm/parser.c b/src/ucm/parser.c index baa19144..a7ef1b11 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -391,7 +391,7 @@ static int evaluate_define(snd_use_case_mgr_t *uc_mgr, snd_config_iterator_t i, next; snd_config_t *d, *n; const char *id; - char *var, *s; + char *var, *s, *sid; int err; err = snd_config_search(cfg, "Define", &d); @@ -427,8 +427,18 @@ static int evaluate_define(snd_use_case_mgr_t *uc_mgr, snd_error(UCM, "value names starting with '@' are reserved for application variables"); return -EINVAL; } - err = uc_mgr_set_variable(uc_mgr, id, s); + sid = (char *)id; + if (uc_mgr->conf_format >= 9) { + err = uc_mgr_get_substituted_value(uc_mgr, &sid, id); + if (err < 0) { + free(s); + return err; + } + } + err = uc_mgr_set_variable(uc_mgr, sid, s); free(s); + if (id != sid) + free(sid); if (err < 0) return err; } @@ -495,7 +505,15 @@ static int evaluate_macro1(snd_use_case_mgr_t *uc_mgr, err = snd_config_get_string(args, &s); if (err < 0) return err; - err = snd_config_load_string(&a, s, 0); + if (uc_mgr->conf_format < 9) { + err = snd_config_load_string(&a, s, 0); + } else { + err = uc_mgr_get_substituted_value(uc_mgr, &var2, s); + if (err >= 0) { + err = snd_config_load_string(&a, var2, 0); + free(var2); + } + } if (err < 0) return err; } else if (snd_config_get_type(args) != SND_CONFIG_TYPE_COMPOUND) { diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index 8b3da74f..957cb751 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -35,7 +35,7 @@ #include #include "use-case.h" -#define SYNTAX_VERSION_MAX 8 +#define SYNTAX_VERSION_MAX 9 #define MAX_CARD_SHORT_NAME 32 #define MAX_CARD_LONG_NAME 80