]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: substitute define IDs and macro arguments (Syntax 9)
authorJaroslav Kysela <perex@perex.cz>
Thu, 5 Feb 2026 16:33:07 +0000 (17:33 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 5 Feb 2026 16:35:55 +0000 (17:35 +0100)
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 <perex@perex.cz>
src/ucm/parser.c
src/ucm/ucm_local.h

index baa191448cd1eda31bc2a449b3c6f636306e2adb..a7ef1b1112b418cfd7e6cae67a824f7669af5556 100644 (file)
@@ -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) {
index 8b3da74ff215d1ce01c83f5c349b52349e25fe00..957cb751c91055d6397c49e85f752ab05fe8e648 100644 (file)
@@ -35,7 +35,7 @@
 #include <stdbool.h>
 #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