mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
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:
parent
02423dc970
commit
3cfbacdc34
4 changed files with 22 additions and 4 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue