]> git.alsa-project.org Git - alsa-utils.git/commitdiff
Fixed some trouble with USER switch and added USER_READ_ONLY switch support.
authorJaroslav Kysela <perex@perex.cz>
Thu, 27 Jan 2000 21:41:36 +0000 (21:41 +0000)
committerJaroslav Kysela <perex@perex.cz>
Thu, 27 Jan 2000 21:41:36 +0000 (21:41 +0000)
alsactl/alsactl_lexer.l
alsactl/alsactl_parser.y
alsactl/merge.c
alsactl/setup.c

index 901023bfcadb68776f35cf5e54224daff019729b..69c396db0d88fcf6989a8a14d7b94b7cc12a20b5 100644 (file)
@@ -121,11 +121,15 @@ true|on|yes               return L_TRUE;
                          int val;
                          yylval.a_value.data = d = (unsigned char *)malloc( 32 );
                          yylval.a_value.datalen = 0;
-                         while (p) {
-                            strncpy(x, p, 2); x[2] = '\0';
-                           sscanf(x, "%02x", &val);
-                           *d++ = val; 
-                           ++yylval.a_value.datalen;
+                         while (*p) {
+                               strncpy(x, p, 2); x[2] = '\0';
+                               sscanf(x, "%02x", &val);
+                               *d++ = val; 
+                               ++yylval.a_value.datalen;
+                               p += 2;
+                               if (*p == '@')
+                                       break;
+                               p++;
                          }
                          return L_BYTEARRAY; }
 
index 489f4cb8eec67086e45f6dbf252d602bf459c384..ca67a85be34cdda3f19a15ee9c3baa89183b54d0 100644 (file)
@@ -810,7 +810,7 @@ static void set_switch_integer(int val)
 
 static void set_switch_bytearray(struct bytearray val)
 {
-       Xswitch->s.type = SND_SW_TYPE_LAST + 1;
+       Xswitch->s.type = SND_SW_TYPE_USER;
 
        if (val.datalen > 32)
                yyerror("Byte array too large for switch.");
index fa8b40d894ba971975b9bd6769f18b9a25a60ba8..ea022a508657326f0d95f3d5be0dd10e76bfb52a 100644 (file)
@@ -99,6 +99,18 @@ static int merge_one_sw(struct ctl_switch *csw, struct ctl_switch *usw, int card
                        csw->s.value.data32[0] = usw->s.value.data32[0];
                }
                break;
+       case SND_SW_TYPE_USER_READ_ONLY:
+               break;
+       case SND_SW_TYPE_USER:
+               if (usw->s.type != SND_SW_TYPE_USER) {
+                       error("A wrong type %i for the switch %s. The type user is expected. Skipping...", usw->s.type, sw_id(usw->s.name, cardno, devno, id));
+                       return 1;
+               }
+               if (memcmp(csw->s.value.data8, usw->s.value.data8, 32)) {
+                       csw->change = 1;
+                       memcpy(csw->s.value.data8, usw->s.value.data8, 32);
+               }
+               break;
        default:
                error("The switch type %i is not known.", csw->s.type);
        }
index 6094bb08e8cbca31617ae092f1f6f9ad41b36a81..b2f7784ed240673ed0432a243f476abbab04a32b 100644 (file)
@@ -666,6 +666,8 @@ static void soundcard_setup_write_switch(FILE * out, const char *space, int inte
                s = "list";
                sprintf(v, "%u", sw->value.item_number);
                break;
+       case SND_SW_TYPE_USER_READ_ONLY:
+               return;
        default:
                s = "unknown";
        }
@@ -726,11 +728,11 @@ static void soundcard_setup_write_switch(FILE * out, const char *space, int inte
                fprintf(out, v);
                if (sw->type < 0 || sw->type > SND_SW_TYPE_LIST_ITEM) {
                        /* TODO: some well known types should be verbose */
-                       fprintf(out, "rawdata(");
+                       fprintf(out, "rawdata(@");
                        for (idx = 0; idx < 31; idx++) {
-                               fprintf(out, "@%02x:", sw->value.data8[idx]);
+                               fprintf(out, "%02x:", sw->value.data8[idx]);
                        }
-                       fprintf(out, "%02x@)\n", sw->value.data8[31]);
+                       fprintf(out, "%02x@)", sw->value.data8[31]);
                }
        }
       __end: