From 15970ebf7f50d161f5e3b10a4ed8377d9be24e01 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 29 Nov 2019 09:33:50 +0100 Subject: [PATCH] ucm: add support for ControlEnum in ControlExists condition 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 --- src/ucm/ucm_cond.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/ucm/ucm_cond.c b/src/ucm/ucm_cond.c index bdf0d048..22b418d5 100644 --- a/src/ucm/ucm_cond.c +++ b/src/ucm/ucm_cond.c @@ -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; } -- 2.47.1