* [PATCH] control: Allow cset'ing specific values in the multi-value case @ 2015-06-09 10:55 arun 2015-06-09 12:03 ` Takashi Iwai 0 siblings, 1 reply; 4+ messages in thread From: arun @ 2015-06-09 10:55 UTC (permalink / raw) To: alsa-devel; +Cc: Arun Raghavan From: Arun Raghavan <git@arunraghavan.net> 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; default: -- 2.4.2 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] control: Allow cset'ing specific values in the multi-value case 2015-06-09 10:55 [PATCH] control: Allow cset'ing specific values in the multi-value case arun @ 2015-06-09 12:03 ` Takashi Iwai 2015-06-10 8:56 ` Arun Raghavan 0 siblings, 1 reply; 4+ messages in thread From: Takashi Iwai @ 2015-06-09 12:03 UTC (permalink / raw) To: arun; +Cc: Arun Raghavan, alsa-devel At Tue, 9 Jun 2015 16:25:07 +0530, arun@accosted.net wrote: > > From: Arun Raghavan <git@arunraghavan.net> > > 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 == ',') ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] control: Allow cset'ing specific values in the multi-value case 2015-06-09 12:03 ` Takashi Iwai @ 2015-06-10 8:56 ` Arun Raghavan 2015-06-10 9:58 ` Takashi Iwai 0 siblings, 1 reply; 4+ messages in thread From: Arun Raghavan @ 2015-06-10 8:56 UTC (permalink / raw) To: Takashi Iwai; +Cc: Arun Raghavan, alsa-devel@alsa-project.org On 9 June 2015 at 17:33, Takashi Iwai <tiwai@suse.de> wrote: > At Tue, 9 Jun 2015 16:25:07 +0530, > arun@accosted.net wrote: >> >> From: Arun Raghavan <git@arunraghavan.net> >> >> 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, this works and does look better. Cheers, Arun > --- > 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 == ',') ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] control: Allow cset'ing specific values in the multi-value case 2015-06-10 8:56 ` Arun Raghavan @ 2015-06-10 9:58 ` Takashi Iwai 0 siblings, 0 replies; 4+ messages in thread From: Takashi Iwai @ 2015-06-10 9:58 UTC (permalink / raw) To: Arun Raghavan; +Cc: Arun Raghavan, alsa-devel@alsa-project.org At Wed, 10 Jun 2015 14:26:48 +0530, Arun Raghavan wrote: > > On 9 June 2015 at 17:33, Takashi Iwai <tiwai@suse.de> wrote: > > At Tue, 9 Jun 2015 16:25:07 +0530, > > arun@accosted.net wrote: > >> > >> From: Arun Raghavan <git@arunraghavan.net> > >> > >> 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, this works and does look better. Pushed to git tree now. Thanks. Takashi ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-06-10 9:58 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-06-09 10:55 [PATCH] control: Allow cset'ing specific values in the multi-value case arun 2015-06-09 12:03 ` Takashi Iwai 2015-06-10 8:56 ` Arun Raghavan 2015-06-10 9:58 ` Takashi Iwai
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox