Add integer range getters to mixer

This commit is contained in:
Simon Wilson
2011-06-06 14:41:02 -07:00
parent c6f3e464f5
commit b9d4f6bfee
3 changed files with 47 additions and 3 deletions
+4
View File
@@ -131,4 +131,8 @@ int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id);
int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);
int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string);
/* Determe range of integer mixer controls */
int mixer_ctl_get_range_min(struct mixer_ctl *ctl);
int mixer_ctl_get_range_max(struct mixer_ctl *ctl);
#endif
+34
View File
@@ -372,6 +372,40 @@ int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value)
return ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev);
}
int mixer_ctl_get_range_min(struct mixer_ctl *ctl)
{
struct snd_ctl_elem_value ev;
if (!ctl || (ctl->info->type != SNDRV_CTL_ELEM_TYPE_INTEGER)) {
errno = EINVAL;
return -1;
}
memset(&ev, 0, sizeof(ev));
ev.id.numid = ctl->info->id.numid;
if (ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_READ, &ev))
return -1;
return ctl->info->value.integer.min;
}
int mixer_ctl_get_range_max(struct mixer_ctl *ctl)
{
struct snd_ctl_elem_value ev;
if (!ctl || (ctl->info->type != SNDRV_CTL_ELEM_TYPE_INTEGER)) {
errno = EINVAL;
return -1;
}
memset(&ev, 0, sizeof(ev));
ev.id.numid = ctl->info->id.numid;
if (ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_READ, &ev))
return -1;
return ctl->info->value.integer.max;
}
unsigned int mixer_ctl_get_num_enums(struct mixer_ctl *ctl)
{
if (!ctl) {
+9 -3
View File
@@ -102,6 +102,7 @@ static void tinymix_detail_control(struct mixer *mixer, unsigned int id)
unsigned int num_values;
char buffer[256];
unsigned int i;
int min, max;
if (id >= mixer_get_num_ctls(mixer)) {
fprintf(stderr, "Invalid mixer control\n");
@@ -119,19 +120,24 @@ static void tinymix_detail_control(struct mixer *mixer, unsigned int id)
switch (type)
{
case MIXER_CTL_TYPE_INT:
printf("\t%d", mixer_ctl_get_value(ctl, i));
printf(" %d", mixer_ctl_get_value(ctl, i));
break;
case MIXER_CTL_TYPE_BOOL:
printf("\t%s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
printf(" %s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
break;
case MIXER_CTL_TYPE_ENUM:
tinymix_print_enum(ctl);
break;
default:
printf("\tunknown");
printf(" unknown");
break;
};
}
if (type == MIXER_CTL_TYPE_INT) {
min = mixer_ctl_get_range_min(ctl);
max = mixer_ctl_get_range_max(ctl);
printf(" (range %d->%d)", min, max);
}
printf("\n");
}