2 * This is an example of a mixer program for Linux
4 * updated 1/1/93 to add stereo, level query, broken
5 * devmask kludge - cmetz@thor.tjhsst.edu
7 * (C) Craig Metz and Hannu Savolainen 1993.
9 * You may do anything you wish with this program.
11 * ditto for my modifications (John-Mark Gurney, 1997)
15 static const char rcsid[] =
16 "$FreeBSD: src/usr.sbin/mixer/mixer.c,v 1.11.2.6 2001/07/30 10:22:58 dd Exp $";
25 #include <sys/soundcard.h>
27 const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
29 void usage(int devmask, int recmask);
30 int res_name(const char *name, int mask);
31 void print_recsrc(int recsrc);
34 usage(int devmask, int recmask)
38 printf("usage: mixer [-f device] [-s] [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n");
40 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
41 if ((1 << i) & devmask) {
44 printf("%s", names[i]);
47 printf("\n rec devices: ");
48 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
49 if ((1 << i) & recmask) {
52 printf("%s", names[i]);
60 res_name(const char *name, int mask)
64 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++)
65 if ((1 << foo) & mask && !strcmp(names[foo], name))
68 return foo == SOUND_MIXER_NRDEVICES ? -1 : foo;
72 print_recsrc(int recsrc)
75 fprintf(stderr, "Recording source: ");
77 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
78 if ((1 << i) & recsrc) {
80 fprintf(stderr, ", ");
81 fprintf(stderr, "%s", names[i]);
84 fprintf(stderr, "\n");
88 main(int argc, char *argv[])
90 int foo, bar, baz, dev;
91 int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
92 int dusage = 0, drecsrc = 0, shortflag = 0;
93 int l = 0, r = 0, t = 0;
98 name = strdup("/dev/mixer");
100 if (!strcmp(argv[0], "mixer2"))
101 name = strdup("/dev/mixer1");
102 else if (!strcmp(argv[0], "mixer3"))
103 name = strdup("/dev/mixer2");
105 while ((ch = getopt(argc, argv, "f:s")) != -1)
108 name = strdup(optarg);
116 argc -= (optind - 1);
117 argv += (optind - 1);
119 if ((baz = open(name, O_RDWR)) < 0)
122 if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
123 err(1, "SOUND_MIXER_READ_DEVMASK");
124 if (ioctl(baz, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
125 err(1, "SOUND_MIXER_READ_RECMASK");
126 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
127 err(1, "SOUND_MIXER_READ_RECSRC");
130 if ((argc == 1) && (dusage == 0)) {
131 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) {
132 if (!((1 << foo) & devmask))
134 if (ioctl(baz, MIXER_READ(foo),&bar)== -1) {
139 printf("%s %d:%d ", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);
141 printf("Mixer %-8s is currently set to %3d:%d\n", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);
148 while ((argc > 0) && (dusage == 0)) {
149 if (!strcmp("recsrc", *argv)) {
153 } else if (argc > 1 && !strcmp("rec", *argv + 1)) {
154 if (**argv != '+' && **argv != '-' &&
155 **argv != '=' && **argv != '^') {
156 warnx("unknown modifier: %c", **argv);
160 if ((dev = res_name(argv[1], recmask)) == -1) {
161 warnx("unknown recording device: %s", argv[1]);
167 recsrc |= (1 << dev);
170 recsrc &= ~(1 << dev);
176 recsrc ^= (1 << dev);
180 argc -= 2; argv += 2;
184 if ((t = sscanf(*argv, "%d:%d", &l, &r)) > 0) {
187 else if((dev = res_name(*argv, devmask)) == -1) {
188 warnx("unknown device: %s", *argv);
193 switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : t) {
195 if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
201 printf("%s %d:%d ", names[dev], bar & 0x7f, (bar >> 8) & 0x7f);
203 printf("Mixer %-8s is currently set to %3d:%d\n",
204 names[dev], bar & 0x7f, (bar >> 8) & 0x7f);
220 printf("Setting the mixer %s to %d:%d.\n", names[dev],
224 if (ioctl(baz, MIXER_WRITE(dev), &l) == -1)
227 argc -= 2; argv += 2;
234 usage(devmask, recmask);
238 if (orecsrc != recsrc)
239 if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1)
240 err(1, "SOUND_MIXER_WRITE_RECSRC");
243 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
244 err(1, "SOUND_MIXER_READ_RECSRC");
245 print_recsrc(recsrc);