ucm: add ctl-remove sequence command to delete controls from UCM

Syntax:

   ctl-remove "name='ABCD'"

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2021-03-29 11:12:28 +02:00
parent 02423dc970
commit 3cfbacdc34
4 changed files with 22 additions and 4 deletions

View file

@ -418,14 +418,21 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type)
pos++; pos++;
} }
if (!*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; err = -EINVAL;
goto __fail; goto __fail;
} }
snd_ctl_elem_info_set_id(info, id); snd_ctl_elem_info_set_id(info, id);
err = snd_ctl_elem_info(ctl, info); 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) { if (err >= 0) {
err = snd_ctl_elem_remove(ctl, id); err = snd_ctl_elem_remove(ctl, id);
if (err < 0) { if (err < 0) {
@ -434,6 +441,8 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type)
goto __fail; goto __fail;
} }
} }
if (type == SEQUENCE_ELEMENT_TYPE_CTL_REMOVE)
goto __ok;
err = __snd_ctl_add_elem_set(ctl, info2, info2->owner, info2->count); err = __snd_ctl_add_elem_set(ctl, info2, info2->owner, info2->count);
if (err < 0) { if (err < 0) {
uc_error("unable to create new control"); 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; err = 0;
__fail: __fail:
free(id); 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_BIN_FILE:
case SEQUENCE_ELEMENT_TYPE_CSET_TLV: case SEQUENCE_ELEMENT_TYPE_CSET_TLV:
case SEQUENCE_ELEMENT_TYPE_CSET_NEW: case SEQUENCE_ELEMENT_TYPE_CSET_NEW:
case SEQUENCE_ELEMENT_TYPE_CTL_REMOVE:
if (cdev == NULL && uc_mgr->in_component_domain) { if (cdev == NULL && uc_mgr->in_component_domain) {
/* For sequence of a component device, use /* For sequence of a component device, use
* its parent's cdev stored by ucm manager. * its parent's cdev stored by ucm manager.

View file

@ -768,6 +768,11 @@ cset:
goto cset; goto cset;
} }
if (strcmp(cmd, "ctl-remove") == 0) {
curr->type = SEQUENCE_ELEMENT_TYPE_CTL_REMOVE;
goto cset;
}
if (strcmp(cmd, "sysw") == 0) { if (strcmp(cmd, "sysw") == 0) {
curr->type = SEQUENCE_ELEMENT_TYPE_SYSSET; curr->type = SEQUENCE_ELEMENT_TYPE_SYSSET;
err = parse_string_substitute3(uc_mgr, n, &curr->data.sysw); err = parse_string_substitute3(uc_mgr, n, &curr->data.sysw);

View file

@ -52,8 +52,9 @@
#define SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE 5 #define SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE 5
#define SEQUENCE_ELEMENT_TYPE_CSET_TLV 6 #define SEQUENCE_ELEMENT_TYPE_CSET_TLV 6
#define SEQUENCE_ELEMENT_TYPE_CSET_NEW 7 #define SEQUENCE_ELEMENT_TYPE_CSET_NEW 7
#define SEQUENCE_ELEMENT_TYPE_CMPT_SEQ 8 #define SEQUENCE_ELEMENT_TYPE_CTL_REMOVE 8
#define SEQUENCE_ELEMENT_TYPE_SYSSET 9 #define SEQUENCE_ELEMENT_TYPE_CMPT_SEQ 9
#define SEQUENCE_ELEMENT_TYPE_SYSSET 10
struct ucm_value { struct ucm_value {
struct list_head list; struct list_head list;

View file

@ -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_NEW:
case SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE: case SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE:
case SEQUENCE_ELEMENT_TYPE_CSET_TLV: case SEQUENCE_ELEMENT_TYPE_CSET_TLV:
case SEQUENCE_ELEMENT_TYPE_CTL_REMOVE:
free(seq->data.cset); free(seq->data.cset);
break; break;
case SEQUENCE_ELEMENT_TYPE_SYSSET: case SEQUENCE_ELEMENT_TYPE_SYSSET: