]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: add support for ControlEnum in ControlExists condition
authorJaroslav Kysela <perex@perex.cz>
Fri, 29 Nov 2019 08:33:50 +0000 (09:33 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 29 Nov 2019 08:34:09 +0000 (09:34 +0100)
Condition {
  Type ControlExists
  Control "name='Capture Input'"
  ControlEnum "Headphone Mic"
}

The result is true if the control exists, it is the enumerated
type and has the item with the ControlEnum text (name).

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/ucm_cond.c

index bdf0d0486e834eb0feb12deda79f989a445fa072..22b418d5be8b804d0051012ce45ce642bfab6b88 100644 (file)
@@ -163,12 +163,12 @@ static int if_eval_regex_match(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval)
 static int if_eval_control_exists(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval)
 {
        snd_ctl_t *ctl;
-       const char *device = NULL, *ctldef;
+       const char *device = NULL, *ctldef, *enumval = NULL, *name;
        snd_ctl_elem_id_t *elem_id;
        snd_ctl_elem_info_t *elem_info;
+       snd_ctl_elem_type_t type;
        char *s;
-       int err;
-
+       int err, i, items;
 
        snd_ctl_elem_id_alloca(&elem_id);
        snd_ctl_elem_info_alloca(&elem_info);
@@ -185,6 +185,12 @@ static int if_eval_control_exists(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval
                return -EINVAL;
        }
 
+       err = get_string(eval, "ControlEnum", &enumval);
+       if (err < 0 && err != -ENOENT) {
+               uc_error("ControlExists error (If.Condition.ControlEnum)");
+               return -EINVAL;
+       }
+
        err = uc_mgr_get_substituted_value(uc_mgr, &s, ctldef);
        if (err < 0)
                return err;
@@ -216,6 +222,31 @@ static int if_eval_control_exists(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval
        if (err < 0)
                return 0;
 
+       if (enumval) {
+               type = snd_ctl_elem_info_get_type(elem_info);
+               if (type != SND_CTL_ELEM_TYPE_ENUMERATED)
+                       return 0;
+               err = uc_mgr_get_substituted_value(uc_mgr, &s, enumval);
+               if (err < 0)
+                       return err;
+               items = snd_ctl_elem_info_get_items(elem_info);
+               for (i = 0; i < items; i++) {
+                       snd_ctl_elem_info_set_item(elem_info, i);
+                       err = snd_ctl_elem_info(ctl, elem_info);
+                       if (err < 0) {
+                               free(s);
+                               return err;
+                       }
+                       name = snd_ctl_elem_info_get_item_name(elem_info);
+                       if (strcasecmp(name, s) == 0) {
+                               free(s);
+                               return 1;
+                       }
+               }
+               free(s);
+               return 0;
+       }
+
        return 1;
 }