From 3cfbacdc343ab56aeec141fe41e1a03dacaa1c6c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 29 Mar 2021 11:12:28 +0200 Subject: [PATCH] ucm: add ctl-remove sequence command to delete controls from UCM Syntax: ctl-remove "name='ABCD'" Signed-off-by: Jaroslav Kysela --- src/ucm/main.c | 15 +++++++++++++-- src/ucm/parser.c | 5 +++++ src/ucm/ucm_local.h | 5 +++-- src/ucm/utils.c | 1 + 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ucm/main.c b/src/ucm/main.c index 02c5580e..231ef4a1 100644 --- a/src/ucm/main.c +++ b/src/ucm/main.c @@ -418,14 +418,21 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type) pos++; } if (!*pos) { - uc_error("undefined value for cset >%s<", cset); + if (type != SEQUENCE_ELEMENT_TYPE_CTL_REMOVE) { + uc_error("undefined value for cset >%s<", cset); + err = -EINVAL; + goto __fail; + } + } else if (type == SEQUENCE_ELEMENT_TYPE_CTL_REMOVE) { + uc_error("extra value for ctl-remove >%s<", cset); err = -EINVAL; goto __fail; } snd_ctl_elem_info_set_id(info, id); err = snd_ctl_elem_info(ctl, info); - if (type == SEQUENCE_ELEMENT_TYPE_CSET_NEW) { + if (type == SEQUENCE_ELEMENT_TYPE_CSET_NEW || + type == SEQUENCE_ELEMENT_TYPE_CTL_REMOVE) { if (err >= 0) { err = snd_ctl_elem_remove(ctl, id); if (err < 0) { @@ -434,6 +441,8 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type) goto __fail; } } + if (type == SEQUENCE_ELEMENT_TYPE_CTL_REMOVE) + goto __ok; err = __snd_ctl_add_elem_set(ctl, info2, info2->owner, info2->count); if (err < 0) { uc_error("unable to create new control"); @@ -479,6 +488,7 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type) } } } + __ok: err = 0; __fail: free(id); @@ -591,6 +601,7 @@ static int execute_sequence(snd_use_case_mgr_t *uc_mgr, case SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE: case SEQUENCE_ELEMENT_TYPE_CSET_TLV: case SEQUENCE_ELEMENT_TYPE_CSET_NEW: + case SEQUENCE_ELEMENT_TYPE_CTL_REMOVE: if (cdev == NULL && uc_mgr->in_component_domain) { /* For sequence of a component device, use * its parent's cdev stored by ucm manager. diff --git a/src/ucm/parser.c b/src/ucm/parser.c index a060a3d9..169dbefe 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -768,6 +768,11 @@ cset: goto cset; } + if (strcmp(cmd, "ctl-remove") == 0) { + curr->type = SEQUENCE_ELEMENT_TYPE_CTL_REMOVE; + goto cset; + } + if (strcmp(cmd, "sysw") == 0) { curr->type = SEQUENCE_ELEMENT_TYPE_SYSSET; err = parse_string_substitute3(uc_mgr, n, &curr->data.sysw); diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index 5e6c988f..1ae143bc 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -52,8 +52,9 @@ #define SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE 5 #define SEQUENCE_ELEMENT_TYPE_CSET_TLV 6 #define SEQUENCE_ELEMENT_TYPE_CSET_NEW 7 -#define SEQUENCE_ELEMENT_TYPE_CMPT_SEQ 8 -#define SEQUENCE_ELEMENT_TYPE_SYSSET 9 +#define SEQUENCE_ELEMENT_TYPE_CTL_REMOVE 8 +#define SEQUENCE_ELEMENT_TYPE_CMPT_SEQ 9 +#define SEQUENCE_ELEMENT_TYPE_SYSSET 10 struct ucm_value { struct list_head list; diff --git a/src/ucm/utils.c b/src/ucm/utils.c index b44a6f48..b331fb78 100644 --- a/src/ucm/utils.c +++ b/src/ucm/utils.c @@ -488,6 +488,7 @@ void uc_mgr_free_sequence_element(struct sequence_element *seq) case SEQUENCE_ELEMENT_TYPE_CSET_NEW: case SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE: case SEQUENCE_ELEMENT_TYPE_CSET_TLV: + case SEQUENCE_ELEMENT_TYPE_CTL_REMOVE: free(seq->data.cset); break; case SEQUENCE_ELEMENT_TYPE_SYSSET: