]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: add ctl-remove sequence command to delete controls from UCM
authorJaroslav Kysela <perex@perex.cz>
Mon, 29 Mar 2021 09:12:28 +0000 (11:12 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 29 Mar 2021 09:31:08 +0000 (11:31 +0200)
Syntax:

   ctl-remove "name='ABCD'"

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/main.c
src/ucm/parser.c
src/ucm/ucm_local.h
src/ucm/utils.c

index 02c5580eae21eb7d24c82c8a59580955eb142427..231ef4a1dc81084f1279385f79ac5e1d3061f039 100644 (file)
@@ -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.
index a060a3d9ca822b6c249949498167848d5d21ba7f..169dbefe16820b9770dad66485ad696a0851eebb 100644 (file)
@@ -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);
index 5e6c988f2dbf044209eb1d8e42acd33eaa5722de..1ae143bc3c2c9cf4ced67104b8de5b446530f41d 100644 (file)
@@ -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;
index b44a6f487912a43de690f02da77f57f6737d8314..b331fb78129a9de606a615a05af506b3b82354c3 100644 (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_BIN_FILE:
        case SEQUENCE_ELEMENT_TYPE_CSET_TLV:
+       case SEQUENCE_ELEMENT_TYPE_CTL_REMOVE:
                free(seq->data.cset);
                break;
        case SEQUENCE_ELEMENT_TYPE_SYSSET: