From 079252a8f7cd698ce2bf4a377be51535b64e189f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 27 Jan 2000 21:41:36 +0000 Subject: [PATCH] Fixed some trouble with USER switch and added USER_READ_ONLY switch support. --- alsactl/alsactl_lexer.l | 14 +++++++++----- alsactl/alsactl_parser.y | 2 +- alsactl/merge.c | 12 ++++++++++++ alsactl/setup.c | 8 +++++--- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/alsactl/alsactl_lexer.l b/alsactl/alsactl_lexer.l index 901023b..69c396d 100644 --- a/alsactl/alsactl_lexer.l +++ b/alsactl/alsactl_lexer.l @@ -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; } diff --git a/alsactl/alsactl_parser.y b/alsactl/alsactl_parser.y index 489f4cb..ca67a85 100644 --- a/alsactl/alsactl_parser.y +++ b/alsactl/alsactl_parser.y @@ -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."); diff --git a/alsactl/merge.c b/alsactl/merge.c index fa8b40d..ea022a5 100644 --- a/alsactl/merge.c +++ b/alsactl/merge.c @@ -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); } diff --git a/alsactl/setup.c b/alsactl/setup.c index 6094bb0..b2f7784 100644 --- a/alsactl/setup.c +++ b/alsactl/setup.c @@ -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: -- 2.47.1