1edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson/* tinymix.c
2edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**
3edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** Copyright 2011, The Android Open Source Project
4edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**
5edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** Redistribution and use in source and binary forms, with or without
6edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** modification, are permitted provided that the following conditions are met:
7edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**     * Redistributions of source code must retain the above copyright
8edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**       notice, this list of conditions and the following disclaimer.
9edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**     * Redistributions in binary form must reproduce the above copyright
10edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**       notice, this list of conditions and the following disclaimer in the
11edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**       documentation and/or other materials provided with the distribution.
12edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**     * Neither the name of The Android Open Source Project nor the names of
13edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**       its contributors may be used to endorse or promote products derived
14edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**       from this software without specific prior written permission.
15edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson**
16edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
17edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
20edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson** DAMAGE.
27edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson*/
28edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
29edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson#include <tinyalsa/asoundlib.h>
30edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson#include <stdio.h>
31edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson#include <stdlib.h>
32edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson#include <ctype.h>
33da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson#include <string.h>
34edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
35edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilsonstatic void tinymix_list_controls(struct mixer *mixer);
36da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilsonstatic void tinymix_detail_control(struct mixer *mixer, const char *control,
37621047309242d04a6186230e7a337de8642ec754Simon Wilson                                   int print_all);
38da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilsonstatic void tinymix_set_value(struct mixer *mixer, const char *control,
39da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                              char **values, unsigned int num_values);
40621047309242d04a6186230e7a337de8642ec754Simon Wilsonstatic void tinymix_print_enum(struct mixer_ctl *ctl, int print_all);
41edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
42edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilsonint main(int argc, char **argv)
43edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson{
44edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    struct mixer *mixer;
45daa83291944318d8face12c780dfb69ae96b0723Simon Wilson    int card = 0;
46edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
47daa83291944318d8face12c780dfb69ae96b0723Simon Wilson    if ((argc > 2) && (strcmp(argv[1], "-D") == 0)) {
48daa83291944318d8face12c780dfb69ae96b0723Simon Wilson        argv++;
49daa83291944318d8face12c780dfb69ae96b0723Simon Wilson        if (argv[1]) {
50daa83291944318d8face12c780dfb69ae96b0723Simon Wilson            card = atoi(argv[1]);
51daa83291944318d8face12c780dfb69ae96b0723Simon Wilson            argv++;
52daa83291944318d8face12c780dfb69ae96b0723Simon Wilson            argc -= 2;
53daa83291944318d8face12c780dfb69ae96b0723Simon Wilson        } else {
54daa83291944318d8face12c780dfb69ae96b0723Simon Wilson            argc -= 1;
55daa83291944318d8face12c780dfb69ae96b0723Simon Wilson        }
56daa83291944318d8face12c780dfb69ae96b0723Simon Wilson    }
57daa83291944318d8face12c780dfb69ae96b0723Simon Wilson
58daa83291944318d8face12c780dfb69ae96b0723Simon Wilson    mixer = mixer_open(card);
59c1239623c178f0142352c28a0f968d826afcb078Simon Wilson    if (!mixer) {
60c1239623c178f0142352c28a0f968d826afcb078Simon Wilson        fprintf(stderr, "Failed to open mixer\n");
61c1239623c178f0142352c28a0f968d826afcb078Simon Wilson        return EXIT_FAILURE;
62c1239623c178f0142352c28a0f968d826afcb078Simon Wilson    }
63edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
647e8a656722b3b19d499ad89c9c1e46b8be3da896Simon Wilson
6536ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson    if (argc == 1) {
6636ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson        printf("Mixer name: '%s'\n", mixer_get_name(mixer));
67edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        tinymix_list_controls(mixer);
6836ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson    } else if (argc == 2) {
69da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        tinymix_detail_control(mixer, argv[1], 1);
7036ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson    } else if (argc >= 3) {
71da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        tinymix_set_value(mixer, argv[1], &argv[2], argc - 2);
7236ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson    } else {
73daa83291944318d8face12c780dfb69ae96b0723Simon Wilson        printf("Usage: tinymix [-D card] [control id] [value to set]\n");
7436ea2d824e5d8af550c139da9da20e73f82a9ae1Simon Wilson    }
75edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
76edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    mixer_close(mixer);
77edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
78edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    return 0;
79edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson}
80edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
81edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilsonstatic void tinymix_list_controls(struct mixer *mixer)
82edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson{
83edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    struct mixer_ctl *ctl;
84e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson    const char *name, *type;
85edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int num_ctls, num_values;
86edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int i;
87edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
88edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    num_ctls = mixer_get_num_ctls(mixer);
89edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
90edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    printf("Number of controls: %d\n", num_ctls);
91edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
92621047309242d04a6186230e7a337de8642ec754Simon Wilson    printf("ctl\ttype\tnum\t%-40s value\n", "name");
93edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    for (i = 0; i < num_ctls; i++) {
94edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        ctl = mixer_get_ctl(mixer, i);
95edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
96e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson        name = mixer_ctl_get_name(ctl);
97edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        type = mixer_ctl_get_type_string(ctl);
98edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        num_values = mixer_ctl_get_num_values(ctl);
99e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson        printf("%d\t%s\t%d\t%-40s", i, type, num_values, name);
100da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        tinymix_detail_control(mixer, name, 0);
101edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
102edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson}
103edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
104621047309242d04a6186230e7a337de8642ec754Simon Wilsonstatic void tinymix_print_enum(struct mixer_ctl *ctl, int print_all)
105edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson{
106edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int num_enums;
107edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int i;
108e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson    const char *string;
109edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
110edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    num_enums = mixer_ctl_get_num_enums(ctl);
111edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
112edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    for (i = 0; i < num_enums; i++) {
113e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson        string = mixer_ctl_get_enum_string(ctl, i);
114621047309242d04a6186230e7a337de8642ec754Simon Wilson        if (print_all)
115621047309242d04a6186230e7a337de8642ec754Simon Wilson            printf("\t%s%s", mixer_ctl_get_value(ctl, 0) == (int)i ? ">" : "",
116e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson                   string);
117621047309242d04a6186230e7a337de8642ec754Simon Wilson        else if (mixer_ctl_get_value(ctl, 0) == (int)i)
118e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson            printf(" %-s", string);
119edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
120edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson}
121edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
122da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilsonstatic void tinymix_detail_control(struct mixer *mixer, const char *control,
123621047309242d04a6186230e7a337de8642ec754Simon Wilson                                   int print_all)
124edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson{
125edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    struct mixer_ctl *ctl;
126edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    enum mixer_ctl_type type;
127edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int num_values;
128edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int i;
129edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    int min, max;
130edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
131da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    if (isdigit(control[0]))
132da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        ctl = mixer_get_ctl(mixer, atoi(control));
133da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    else
134da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        ctl = mixer_get_ctl_by_name(mixer, control);
135da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson
136da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    if (!ctl) {
137edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        fprintf(stderr, "Invalid mixer control\n");
138edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        return;
139edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
140edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
141edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    type = mixer_ctl_get_type(ctl);
142edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    num_values = mixer_ctl_get_num_values(ctl);
143edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
144621047309242d04a6186230e7a337de8642ec754Simon Wilson    if (print_all)
145e44e30a90293ffebe604efea37842aff9d5da874Simon Wilson        printf("%s:", mixer_ctl_get_name(ctl));
146621047309242d04a6186230e7a337de8642ec754Simon Wilson
147edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    for (i = 0; i < num_values; i++) {
148edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        switch (type)
149edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        {
150edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        case MIXER_CTL_TYPE_INT:
151edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            printf(" %d", mixer_ctl_get_value(ctl, i));
152edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            break;
153edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        case MIXER_CTL_TYPE_BOOL:
154edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            printf(" %s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
155edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            break;
156edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        case MIXER_CTL_TYPE_ENUM:
157621047309242d04a6186230e7a337de8642ec754Simon Wilson            tinymix_print_enum(ctl, print_all);
158edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            break;
1595aed71db7d87ba518b53e40c00dcaa0afbc2acebSimon Wilson         case MIXER_CTL_TYPE_BYTE:
1605aed71db7d87ba518b53e40c00dcaa0afbc2acebSimon Wilson            printf(" 0x%02x", mixer_ctl_get_value(ctl, i));
1615aed71db7d87ba518b53e40c00dcaa0afbc2acebSimon Wilson            break;
162edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        default:
163edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            printf(" unknown");
164edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            break;
165edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        };
166edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
167621047309242d04a6186230e7a337de8642ec754Simon Wilson
168621047309242d04a6186230e7a337de8642ec754Simon Wilson    if (print_all) {
169621047309242d04a6186230e7a337de8642ec754Simon Wilson        if (type == MIXER_CTL_TYPE_INT) {
170621047309242d04a6186230e7a337de8642ec754Simon Wilson            min = mixer_ctl_get_range_min(ctl);
171621047309242d04a6186230e7a337de8642ec754Simon Wilson            max = mixer_ctl_get_range_max(ctl);
172621047309242d04a6186230e7a337de8642ec754Simon Wilson            printf(" (range %d->%d)", min, max);
173621047309242d04a6186230e7a337de8642ec754Simon Wilson        }
174edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
175edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    printf("\n");
176edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson}
177edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
178da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilsonstatic void tinymix_set_value(struct mixer *mixer, const char *control,
179da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                              char **values, unsigned int num_values)
180edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson{
181edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    struct mixer_ctl *ctl;
182edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    enum mixer_ctl_type type;
183da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    unsigned int num_ctl_values;
184edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    unsigned int i;
185edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
186da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    if (isdigit(control[0]))
187da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        ctl = mixer_get_ctl(mixer, atoi(control));
188da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    else
189da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        ctl = mixer_get_ctl_by_name(mixer, control);
190edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
191da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    if (!ctl) {
192da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        fprintf(stderr, "Invalid mixer control\n");
193da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        return;
194da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    }
195edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
196da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    type = mixer_ctl_get_type(ctl);
197da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    num_ctl_values = mixer_ctl_get_num_values(ctl);
198da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson
199da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson    if (isdigit(values[0][0])) {
200da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        if (num_values == 1) {
201da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            /* Set all values the same */
202da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            int value = atoi(values[0]);
203da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson
204da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            for (i = 0; i < num_ctl_values; i++) {
205da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                if (mixer_ctl_set_value(ctl, i, value)) {
206da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                    fprintf(stderr, "Error: invalid value\n");
207da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                    return;
208da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                }
209da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            }
210da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson        } else {
211da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            /* Set multiple values */
212da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            if (num_values > num_ctl_values) {
213da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                fprintf(stderr,
214da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                        "Error: %d values given, but control only takes %d\n",
215da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                        num_values, num_ctl_values);
216edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson                return;
217edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            }
218da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            for (i = 0; i < num_values; i++) {
219da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                if (mixer_ctl_set_value(ctl, i, atoi(values[i]))) {
220da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                    fprintf(stderr, "Error: invalid value for index %d\n", i);
221da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                    return;
222da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                }
223da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            }
224edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        }
225edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    } else {
226edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        if (type == MIXER_CTL_TYPE_ENUM) {
227da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            if (num_values != 1) {
228da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                fprintf(stderr, "Enclose strings in quotes and try again\n");
229da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson                return;
230da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            }
231da39e0b09eb0a1b559a96e2108160d1d8dccf314Simon Wilson            if (mixer_ctl_set_enum_by_string(ctl, values[0]))
232edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson                fprintf(stderr, "Error: invalid enum value\n");
233edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        } else {
234edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson            fprintf(stderr, "Error: only enum types can be set with strings\n");
235edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson        }
236edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson    }
237edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson}
238edff708e3129d7d8e05bbdfb624af97a3264a332Simon Wilson
239