aboutsummaryrefslogtreecommitdiff
path: root/tinymix.c
diff options
context:
space:
mode:
authorSimon Wilson <simonwilson@google.com>2012-09-17 13:05:06 -0700
committerSimon Wilson <simonwilson@google.com>2012-09-18 14:52:58 -0700
commita5baefd1ab254a04de0ccd7f34449de2b885da94 (patch)
treefabe7d5acc4db274e796b9ce45d2532b7e6b2b05 /tinymix.c
parent93e7b67301f9c5af3c5f92287c237a50dd607b95 (diff)
tinymix: support setting of multiple control values
This allows stereo controls to be set with different values for left and right.
Diffstat (limited to 'tinymix.c')
-rw-r--r--tinymix.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/tinymix.c b/tinymix.c
index 6427a02..c22bbb2 100644
--- a/tinymix.c
+++ b/tinymix.c
@@ -35,7 +35,7 @@ static void tinymix_list_controls(struct mixer *mixer);
static void tinymix_detail_control(struct mixer *mixer, unsigned int id,
int print_all);
static void tinymix_set_value(struct mixer *mixer, unsigned int id,
- char *value);
+ char **values, unsigned int num_values);
static void tinymix_print_enum(struct mixer_ctl *ctl, int print_all);
int main(int argc, char **argv)
@@ -64,8 +64,8 @@ int main(int argc, char **argv)
tinymix_list_controls(mixer);
else if (argc == 2)
tinymix_detail_control(mixer, atoi(argv[1]), 1);
- else if (argc == 3)
- tinymix_set_value(mixer, atoi(argv[1]), argv[2]);
+ else if (argc >= 3)
+ tinymix_set_value(mixer, atoi(argv[1]), &argv[2], argc - 2);
else
printf("Usage: tinymix [-D card] [control id] [value to set]\n");
@@ -169,29 +169,50 @@ static void tinymix_detail_control(struct mixer *mixer, unsigned int id,
}
static void tinymix_set_value(struct mixer *mixer, unsigned int id,
- char *string)
+ char **values, unsigned int num_values)
{
struct mixer_ctl *ctl;
enum mixer_ctl_type type;
- unsigned int num_values;
+ unsigned int num_ctl_values;
unsigned int i;
ctl = mixer_get_ctl(mixer, id);
type = mixer_ctl_get_type(ctl);
- num_values = mixer_ctl_get_num_values(ctl);
-
- if (isdigit(string[0])) {
- int value = atoi(string);
-
- for (i = 0; i < num_values; i++) {
- if (mixer_ctl_set_value(ctl, i, value)) {
- fprintf(stderr, "Error: invalid value\n");
+ num_ctl_values = mixer_ctl_get_num_values(ctl);
+
+ if (isdigit(values[0][0])) {
+ if (num_values == 1) {
+ /* Set all values the same */
+ int value = atoi(values[0]);
+
+ for (i = 0; i < num_ctl_values; i++) {
+ if (mixer_ctl_set_value(ctl, i, value)) {
+ fprintf(stderr, "Error: invalid value\n");
+ return;
+ }
+ }
+ } else {
+ /* Set multiple values */
+ if (num_values > num_ctl_values) {
+ fprintf(stderr,
+ "Error: %d values given, but control only takes %d\n",
+ num_values, num_ctl_values);
return;
}
+ for (i = 0; i < num_values; i++) {
+ if (mixer_ctl_set_value(ctl, i, atoi(values[i]))) {
+ fprintf(stderr, "Error: invalid value for index %d\n", i);
+ return;
+ }
+ }
}
} else {
if (type == MIXER_CTL_TYPE_ENUM) {
- if (mixer_ctl_set_enum_by_string(ctl, string))
+ if (num_values != 1) {
+ fprintf(stderr, "Enclose strings in quotes and try again\n");
+ return;
+ }
+ if (mixer_ctl_set_enum_by_string(ctl, values[0]))
fprintf(stderr, "Error: invalid enum value\n");
} else {
fprintf(stderr, "Error: only enum types can be set with strings\n");