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)
13 * $FreeBSD: src/usr.sbin/mixer/mixer.c,v 1.11.2.6 2001/07/30 10:22:58 dd Exp $
14 * $DragonFly: src/usr.sbin/mixer/mixer.c,v 1.2 2003/06/17 04:29:57 dillon Exp $
23 #include <sys/soundcard.h>
25 const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
27 void usage(int devmask, int recmask);
28 int res_name(const char *name, int mask);
29 void print_recsrc(int recsrc);
32 usage(int devmask, int recmask)
36 printf("usage: mixer [-f device] [-s] [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n");
38 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
39 if ((1 << i) & devmask) {
42 printf("%s", names[i]);
45 printf("\n rec devices: ");
46 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
47 if ((1 << i) & recmask) {
50 printf("%s", names[i]);
58 res_name(const char *name, int mask)
62 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++)
63 if ((1 << foo) & mask && !strcmp(names[foo], name))
66 return foo == SOUND_MIXER_NRDEVICES ? -1 : foo;
70 print_recsrc(int recsrc)
73 fprintf(stderr, "Recording source: ");
75 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
76 if ((1 << i) & recsrc) {
78 fprintf(stderr, ", ");
79 fprintf(stderr, "%s", names[i]);
82 fprintf(stderr, "\n");
86 main(int argc, char *argv[])
88 int foo, bar, baz, dev;
89 int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
90 int dusage = 0, drecsrc = 0, shortflag = 0;
91 int l = 0, r = 0, t = 0;
96 name = strdup("/dev/mixer");
98 if (!strcmp(argv[0], "mixer2"))
99 name = strdup("/dev/mixer1");
100 else if (!strcmp(argv[0], "mixer3"))
101 name = strdup("/dev/mixer2");
103 while ((ch = getopt(argc, argv, "f:s")) != -1)
106 name = strdup(optarg);
114 argc -= (optind - 1);
115 argv += (optind - 1);
117 if ((baz = open(name, O_RDWR)) < 0)
120 if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
121 err(1, "SOUND_MIXER_READ_DEVMASK");
122 if (ioctl(baz, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
123 err(1, "SOUND_MIXER_READ_RECMASK");
124 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
125 err(1, "SOUND_MIXER_READ_RECSRC");
128 if ((argc == 1) && (dusage == 0)) {
129 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) {
130 if (!((1 << foo) & devmask))
132 if (ioctl(baz, MIXER_READ(foo),&bar)== -1) {
137 printf("%s %d:%d ", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);
139 printf("Mixer %-8s is currently set to %3d:%d\n", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);
146 while ((argc > 0) && (dusage == 0)) {
147 if (!strcmp("recsrc", *argv)) {
151 } else if (argc > 1 && !strcmp("rec", *argv + 1)) {
152 if (**argv != '+' && **argv != '-' &&
153 **argv != '=' && **argv != '^') {
154 warnx("unknown modifier: %c", **argv);
158 if ((dev = res_name(argv[1], recmask)) == -1) {
159 warnx("unknown recording device: %s", argv[1]);
165 recsrc |= (1 << dev);
168 recsrc &= ~(1 << dev);
174 recsrc ^= (1 << dev);
178 argc -= 2; argv += 2;
182 if ((t = sscanf(*argv, "%d:%d", &l, &r)) > 0) {
185 else if((dev = res_name(*argv, devmask)) == -1) {
186 warnx("unknown device: %s", *argv);
191 switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : t) {
193 if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
199 printf("%s %d:%d ", names[dev], bar & 0x7f, (bar >> 8) & 0x7f);
201 printf("Mixer %-8s is currently set to %3d:%d\n",
202 names[dev], bar & 0x7f, (bar >> 8) & 0x7f);
218 printf("Setting the mixer %s to %d:%d.\n", names[dev],
222 if (ioctl(baz, MIXER_WRITE(dev), &l) == -1)
225 argc -= 2; argv += 2;
232 usage(devmask, recmask);
236 if (orecsrc != recsrc)
237 if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1)
238 err(1, "SOUND_MIXER_WRITE_RECSRC");
241 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
242 err(1, "SOUND_MIXER_READ_RECSRC");
243 print_recsrc(recsrc);