From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH] control: Allow cset'ing specific values in the multi-value case Date: Tue, 09 Jun 2015 14:03:09 +0200 Message-ID: References: <1433847307-26125-1-git-send-email-arun@accosted.net> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 3FF9D2605A1 for ; Tue, 9 Jun 2015 14:03:10 +0200 (CEST) In-Reply-To: <1433847307-26125-1-git-send-email-arun@accosted.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: arun@accosted.net Cc: Arun Raghavan , alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org At Tue, 9 Jun 2015 16:25:07 +0530, arun@accosted.net wrote: > > From: Arun Raghavan > > This works with syntax like ... > > amixer cset 'IIR1 Band1' ,,200 > > ... to set the third value of the control to 200. > --- > src/control/ctlparse.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/src/control/ctlparse.c b/src/control/ctlparse.c > index 8d6c385..64c6480 100644 > --- a/src/control/ctlparse.c > +++ b/src/control/ctlparse.c > @@ -48,9 +48,9 @@ static inline long int convert_prange1(long val, long min, long max) > #define check_range(val, min, max) \ > ((val < min) ? (min) : ((val > max) ? (max) : (val))) > > -static long get_integer(const char **ptr, long min, long max) > +static long get_integer(const char **ptr, long def, long min, long max) > { > - long val = min; > + long val = def; > char *p = (char *)*ptr, *s; > > if (*p == ':') > @@ -351,6 +351,8 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, > break; > case SND_CTL_ELEM_TYPE_INTEGER: > tmp = get_integer(&ptr, > + snd_ctl_elem_value_get_integer(dst, > + idx), > snd_ctl_elem_info_get_min(info), > snd_ctl_elem_info_get_max(info)); > snd_ctl_elem_value_set_integer(dst, idx, tmp); > @@ -364,12 +366,12 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, > case SND_CTL_ELEM_TYPE_ENUMERATED: > tmp = get_ctl_enum_item_index(handle, info, &ptr); > if (tmp < 0) > - tmp = get_integer(&ptr, 0, > + tmp = get_integer(&ptr, 0, 0, > snd_ctl_elem_info_get_items(info) - 1); > snd_ctl_elem_value_set_enumerated(dst, idx, tmp); > break; > case SND_CTL_ELEM_TYPE_BYTES: > - tmp = get_integer(&ptr, 0, 255); > + tmp = get_integer(&ptr, 0, 0, 255); > snd_ctl_elem_value_set_byte(dst, idx, tmp); > break; Hmm, if it's just about skipping the empty element, how about the patch below instead? thanks, Takashi --- diff --git a/src/control/ctlparse.c b/src/control/ctlparse.c index 8d6c3859bec4..877a05e3a1f1 100644 --- a/src/control/ctlparse.c +++ b/src/control/ctlparse.c @@ -325,6 +325,8 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, snd_ctl_elem_value_set_id(dst, myid); for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) { + if (*ptr == ',') + goto skip; switch (type) { case SND_CTL_ELEM_TYPE_BOOLEAN: tmp = 0; @@ -375,6 +377,7 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, default: break; } + skip: if (!strchr(value, ',')) ptr = value; else if (*ptr == ',')