mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-12-22 14:26:31 +01:00
amixer - Allow to pass enum item string for cset, too
cset accepts only integer values as indices, so far, but it's a bit unfriendly. Now it accepts the item name as a string argument, too. The index can be given using numbers as fallback.
This commit is contained in:
parent
fea8dbf020
commit
4b16370c01
1 changed files with 31 additions and 1 deletions
|
@ -1154,6 +1154,34 @@ static int parse_simple_id(const char *str, snd_mixer_selem_id_t *sid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_ctl_enum_item_index(snd_ctl_t *handle, snd_ctl_elem_info_t *info,
|
||||||
|
char **ptrp)
|
||||||
|
{
|
||||||
|
char *ptr = *ptrp;
|
||||||
|
int items, i, len;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
items = snd_ctl_elem_info_get_items(info);
|
||||||
|
if (items <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < items; i++) {
|
||||||
|
snd_ctl_elem_info_set_item(info, i);
|
||||||
|
if (snd_ctl_elem_info(handle, info) < 0)
|
||||||
|
return -1;
|
||||||
|
name = snd_ctl_elem_info_get_item_name(info);
|
||||||
|
len = strlen(name);
|
||||||
|
if (! strncmp(name, ptr, len)) {
|
||||||
|
if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') {
|
||||||
|
ptr += len;
|
||||||
|
*ptrp = ptr;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int cset(int argc, char *argv[], int roflag, int keep_handle)
|
static int cset(int argc, char *argv[], int roflag, int keep_handle)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -1242,7 +1270,9 @@ static int cset(int argc, char *argv[], int roflag, int keep_handle)
|
||||||
snd_ctl_elem_value_set_integer64(control, idx, tmp);
|
snd_ctl_elem_value_set_integer64(control, idx, tmp);
|
||||||
break;
|
break;
|
||||||
case SND_CTL_ELEM_TYPE_ENUMERATED:
|
case SND_CTL_ELEM_TYPE_ENUMERATED:
|
||||||
tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1);
|
tmp = get_ctl_enum_item_index(handle, info, &ptr);
|
||||||
|
if (tmp < 0)
|
||||||
|
tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1);
|
||||||
snd_ctl_elem_value_set_enumerated(control, idx, tmp);
|
snd_ctl_elem_value_set_enumerated(control, idx, tmp);
|
||||||
break;
|
break;
|
||||||
case SND_CTL_ELEM_TYPE_BYTES:
|
case SND_CTL_ELEM_TYPE_BYTES:
|
||||||
|
|
Loading…
Reference in a new issue