]> git.alsa-project.org Git - alsa-utils.git/commitdiff
amixer - Allow to pass enum item string for cset, too
authorTakashi Iwai <tiwai@suse.de>
Tue, 31 Jul 2007 15:29:45 +0000 (17:29 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 31 Jul 2007 15:29:45 +0000 (17:29 +0200)
cset accepts only integer values as indices, so far, but it's a bit
unfriendly.  Now it accepts the item name as a string argument, too.
The index can be given using numbers as fallback.

amixer/amixer.c

index 7da0ebe58a001387e0a31cd956d9187867e75fbe..87d93a57c26b6f84c091e81c37aae757e6ee4343 100644 (file)
@@ -1154,6 +1154,34 @@ static int parse_simple_id(const char *str, snd_mixer_selem_id_t *sid)
        return 0;
 }
 
+static int get_ctl_enum_item_index(snd_ctl_t *handle, snd_ctl_elem_info_t *info,
+                                  char **ptrp)
+{
+       char *ptr = *ptrp;
+       int items, i, len;
+       const char *name;
+       
+       items = snd_ctl_elem_info_get_items(info);
+       if (items <= 0)
+               return -1;
+
+       for (i = 0; i < items; i++) {
+               snd_ctl_elem_info_set_item(info, i);
+               if (snd_ctl_elem_info(handle, info) < 0)
+                       return -1;
+               name = snd_ctl_elem_info_get_item_name(info);
+               len = strlen(name);
+               if (! strncmp(name, ptr, len)) {
+                       if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') {
+                               ptr += len;
+                               *ptrp = ptr;
+                               return i;
+                       }
+               }
+       }
+       return -1;
+}
+
 static int cset(int argc, char *argv[], int roflag, int keep_handle)
 {
        int err;
@@ -1242,7 +1270,9 @@ static int cset(int argc, char *argv[], int roflag, int keep_handle)
                                snd_ctl_elem_value_set_integer64(control, idx, tmp);
                                break;
                        case SND_CTL_ELEM_TYPE_ENUMERATED:
-                               tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1);
+                               tmp = get_ctl_enum_item_index(handle, info, &ptr);
+                               if (tmp < 0)
+                                       tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1);
                                snd_ctl_elem_value_set_enumerated(control, idx, tmp);
                                break;
                        case SND_CTL_ELEM_TYPE_BYTES: