mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-09-21 02:29:57 +02:00
Add enum control support to sget/sset
Added the enum control support to amixer sget/sset.
This commit is contained in:
parent
74dca8fd02
commit
210e946410
1 changed files with 63 additions and 2 deletions
|
@ -564,7 +564,26 @@ static int show_selem(snd_mixer_t *handle, snd_mixer_selem_id_t *id, const char
|
||||||
printf(" cswitch-exclusive");
|
printf(" cswitch-exclusive");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (snd_mixer_selem_is_enumerated(elem)) {
|
||||||
|
printf(" enum");
|
||||||
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
if (snd_mixer_selem_is_enumerated(elem)) {
|
||||||
|
int i, items, idx;
|
||||||
|
char itemname[40];
|
||||||
|
items = snd_mixer_selem_get_enum_items(elem);
|
||||||
|
printf(" Items:");
|
||||||
|
for (i = 0; i < items; i++) {
|
||||||
|
snd_mixer_selem_get_enum_item_name(elem, i, sizeof(itemname) - 1, itemname);
|
||||||
|
printf(" '%s'", itemname);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
for (i = 0; !snd_mixer_selem_get_enum_item(elem, i, &idx); i++) {
|
||||||
|
snd_mixer_selem_get_enum_item_name(elem, idx, sizeof(itemname) - 1, itemname);
|
||||||
|
printf(" Item%d: '%s'\n", i, itemname);
|
||||||
|
}
|
||||||
|
return 0; /* no more thing to do */
|
||||||
|
}
|
||||||
if (snd_mixer_selem_has_capture_switch_exclusive(elem))
|
if (snd_mixer_selem_has_capture_switch_exclusive(elem))
|
||||||
printf("%sCapture exclusive group: %i\n", space,
|
printf("%sCapture exclusive group: %i\n", space,
|
||||||
snd_mixer_selem_get_capture_group(elem));
|
snd_mixer_selem_get_capture_group(elem));
|
||||||
|
@ -800,7 +819,7 @@ static int selems(int level)
|
||||||
|
|
||||||
static int parse_control_id(const char *str, snd_ctl_elem_id_t *id)
|
static int parse_control_id(const char *str, snd_ctl_elem_id_t *id)
|
||||||
{
|
{
|
||||||
int c, size;
|
int c, size, numid;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
while (*str == ' ' || *str == '\t')
|
while (*str == ' ' || *str == '\t')
|
||||||
|
@ -811,6 +830,11 @@ static int parse_control_id(const char *str, snd_ctl_elem_id_t *id)
|
||||||
while (*str) {
|
while (*str) {
|
||||||
if (!strncasecmp(str, "numid=", 6)) {
|
if (!strncasecmp(str, "numid=", 6)) {
|
||||||
str += 6;
|
str += 6;
|
||||||
|
numid = atoi(str);
|
||||||
|
if (numid <= 0) {
|
||||||
|
fprintf(stderr, "amixer: Invalid numid %d\n", numid);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
snd_ctl_elem_id_set_numid(id, atoi(str));
|
snd_ctl_elem_id_set_numid(id, atoi(str));
|
||||||
while (isdigit(*str))
|
while (isdigit(*str))
|
||||||
str++;
|
str++;
|
||||||
|
@ -972,7 +996,7 @@ static int cset(int argc, char *argv[], int roflag)
|
||||||
}
|
}
|
||||||
snd_ctl_elem_info_set_id(info, id);
|
snd_ctl_elem_info_set_id(info, id);
|
||||||
if ((err = snd_ctl_elem_info(handle, info)) < 0) {
|
if ((err = snd_ctl_elem_info(handle, info)) < 0) {
|
||||||
error("Control %s cinfo error: %s\n", card, snd_strerror(err));
|
error("Cannot find the given element from control %s\n", card);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
snd_ctl_elem_info_get_id(info, id); /* FIXME: Remove it when hctl find works ok !!! */
|
snd_ctl_elem_info_get_id(info, id); /* FIXME: Remove it when hctl find works ok !!! */
|
||||||
|
@ -1113,6 +1137,31 @@ static unsigned int dir_mask(char **arg, unsigned int def)
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp)
|
||||||
|
{
|
||||||
|
char *ptr = *ptrp;
|
||||||
|
int items, i, len;
|
||||||
|
char name[40];
|
||||||
|
|
||||||
|
items = snd_mixer_selem_get_enum_items(elem);
|
||||||
|
if (items <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < items; i++) {
|
||||||
|
if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0)
|
||||||
|
continue;
|
||||||
|
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 sset(unsigned int argc, char *argv[], int roflag)
|
static int sset(unsigned int argc, char *argv[], int roflag)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -1186,6 +1235,18 @@ static int sset(unsigned int argc, char *argv[], int roflag)
|
||||||
|
|
||||||
if (!(channels & (1 << chn)))
|
if (!(channels & (1 << chn)))
|
||||||
continue;
|
continue;
|
||||||
|
/* enum control */
|
||||||
|
if (snd_mixer_selem_is_enumerated(elem)) {
|
||||||
|
int idx = get_enum_item_index(elem, &ptr);
|
||||||
|
if (idx < 0)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
snd_mixer_selem_set_enum_item(elem, chn, idx);
|
||||||
|
if (!multi)
|
||||||
|
ptr = optr;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ((dir & 1) && snd_mixer_selem_has_playback_channel(elem, chn)) {
|
if ((dir & 1) && snd_mixer_selem_has_playback_channel(elem, chn)) {
|
||||||
sptr = ptr;
|
sptr = ptr;
|
||||||
if (!strncmp(ptr, "mute", 4) && snd_mixer_selem_has_playback_switch(elem)) {
|
if (!strncmp(ptr, "mute", 4) && snd_mixer_selem_has_playback_switch(elem)) {
|
||||||
|
|
Loading…
Reference in a new issue