Hi,

The attached patch allows retrieval of parameter dependent values with
cget.

Thomas.


--- amixer.c.orig       2003-02-24 14:51:16.000000000 +0100
+++ amixer.c    2003-03-08 12:40:53.000000000 +0100
@@ -378,7 +378,7 @@
 }
 
 static int show_control(const char *space, snd_hctl_elem_t *elem,
-                       int level)
+                       int level, snd_ctl_elem_value_t *ctrl)
 {
        int err;
        unsigned int item, idx;
@@ -389,7 +389,10 @@
        snd_ctl_elem_value_t *control;
        snd_ctl_elem_id_alloca(&id);
        snd_ctl_elem_info_alloca(&info);
-       snd_ctl_elem_value_alloca(&control);
+       if (ctrl == NULL)
+               snd_ctl_elem_value_alloca(&control);
+       else
+               control = ctrl;
        if ((err = snd_hctl_elem_info(elem, info)) < 0) {
                error("Control %s snd_hctl_elem_info error: %s\n", card, 
snd_strerror(err));
                return err;
@@ -497,7 +500,7 @@
                show_control_id(id);
                printf("\n");
                if (level & LEVEL_BASIC)
-                       show_control("  ", elem, 1);
+                       show_control("  ", elem, 1, NULL);
        }
        snd_hctl_close(handle);
        return 0;
@@ -971,60 +974,60 @@
        count = snd_ctl_elem_info_get_count(info);
        snd_ctl_elem_value_set_id(control, id);
        
-       if (!roflag) {
-               ptr = argv[1];
-               for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) {
-                       switch (type) {
-                       case SND_CTL_ELEM_TYPE_BOOLEAN:
-                               tmp = 0;
-                               if (!strncasecmp(ptr, "on", 2) || !strncasecmp(ptr, 
"up", 2)) {
-                                       tmp = 1;
-                                       ptr += 2;
-                               } else if (!strncasecmp(ptr, "yes", 3)) {
-                                       tmp = 1;
-                                       ptr += 3;
-                               } else if (!strncasecmp(ptr, "toggle", 6)) {
-                                       tmp = snd_ctl_elem_value_get_boolean(control, 
idx);
-                                       tmp = tmp > 0 ? 0 : 1;
-                                       ptr += 6;
-                               } else if (isdigit(*ptr)) {
-                                       tmp = atoi(ptr) > 0 ? 1 : 0;
-                                       while (isdigit(*ptr))
-                                               ptr++;
-                               } else {
-                                       while (*ptr && *ptr != ',')
-                                               ptr++;
-                               }
-                               snd_ctl_elem_value_set_boolean(control, idx, tmp);
-                               break;
-                       case SND_CTL_ELEM_TYPE_INTEGER:
-                               tmp = get_integer(&ptr,
-                                                 snd_ctl_elem_info_get_min(info),
-                                                 snd_ctl_elem_info_get_max(info));
-                               snd_ctl_elem_value_set_integer(control, idx, tmp);
-                               break;
-                       case SND_CTL_ELEM_TYPE_INTEGER64:
-                               tmp = get_integer64(&ptr,
-                                                 snd_ctl_elem_info_get_min64(info),
-                                                 snd_ctl_elem_info_get_max64(info));
-                               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);
-                               snd_ctl_elem_value_set_enumerated(control, idx, tmp);
-                               break;
-                       case SND_CTL_ELEM_TYPE_BYTES:
-                               tmp = get_integer(&ptr, 0, 255);
-                               snd_ctl_elem_value_set_byte(control, idx, tmp);
-                               break;
-                       default:
-                               break;
+       ptr = argv[1];
+       for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) {
+               switch (type) {
+               case SND_CTL_ELEM_TYPE_BOOLEAN:
+                       tmp = 0;
+                       if (!strncasecmp(ptr, "on", 2) || !strncasecmp(ptr, "up", 2)) {
+                               tmp = 1;
+                               ptr += 2;
+                       } else if (!strncasecmp(ptr, "yes", 3)) {
+                               tmp = 1;
+                               ptr += 3;
+                       } else if (!strncasecmp(ptr, "toggle", 6)) {
+                               tmp = snd_ctl_elem_value_get_boolean(control, idx);
+                               tmp = tmp > 0 ? 0 : 1;
+                               ptr += 6;
+                       } else if (isdigit(*ptr)) {
+                               tmp = atoi(ptr) > 0 ? 1 : 0;
+                               while (isdigit(*ptr))
+                                       ptr++;
+                       } else {
+                               while (*ptr && *ptr != ',')
+                                       ptr++;
                        }
-                       if (!strchr(argv[1], ','))
-                               ptr = argv[1];
-                       else if (*ptr == ',')
-                               ptr++;
+                       snd_ctl_elem_value_set_boolean(control, idx, tmp);
+                       break;
+               case SND_CTL_ELEM_TYPE_INTEGER:
+                       tmp = get_integer(&ptr,
+                                         snd_ctl_elem_info_get_min(info),
+                                         snd_ctl_elem_info_get_max(info));
+                       snd_ctl_elem_value_set_integer(control, idx, tmp);
+                       break;
+               case SND_CTL_ELEM_TYPE_INTEGER64:
+                       tmp = get_integer64(&ptr,
+                                         snd_ctl_elem_info_get_min64(info),
+                                         snd_ctl_elem_info_get_max64(info));
+                       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);
+                       snd_ctl_elem_value_set_enumerated(control, idx, tmp);
+                       break;
+               case SND_CTL_ELEM_TYPE_BYTES:
+                       tmp = get_integer(&ptr, 0, 255);
+                       snd_ctl_elem_value_set_byte(control, idx, tmp);
+                       break;
+               default:
+                       break;
                }
+               if (!strchr(argv[1], ','))
+                       ptr = argv[1];
+               else if (*ptr == ',')
+                       ptr++;
+       }
+       if (!roflag) {
                if ((err = snd_ctl_elem_write(handle, control)) < 0) {
                        error("Control %s element write error: %s\n", card, 
snd_strerror(err));
                        return err;
@@ -1044,7 +1047,7 @@
                }
                elem = snd_hctl_find_elem(hctl, id);
                if (elem)
-                       show_control("  ", elem, LEVEL_BASIC | LEVEL_ID);
+                       show_control("  ", elem, LEVEL_BASIC | LEVEL_ID, control);
                else
                        printf("Could not find the specified element\n");
                snd_hctl_close(hctl);

Reply via email to