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) {
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");
}
}
}
+ __ok:
err = 0;
__fail:
free(id);
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.
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);
#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;
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: