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.3 2004/01/06 08:35:42 asmodai Exp $
23 #include <sys/soundcard.h>
25 #define LEFT(vol) (vol & 0x7f)
26 #define RIGHT(vol) ((vol >> 8) & 0x7f)
28 const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
29 const char *defaultdev = "/dev/mixer";
31 void usage(int devmask, int recmask);
32 int res_name(const char *name, int mask);
33 void print_recsrc(int recsrc);
36 usage(int devmask, int recmask)
40 printf("usage: mixer [-f device] [-s] [dev [+|-][voll[:[+|-]volr]] ...\n"
41 " mixer [-f device] [-s] recsrc ...\n"
42 " mixer [-f device] [-s] {^|+|-|=}rec recdev ...\n"
45 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
46 if ((1 << i) & devmask) {
49 printf("%s", names[i]);
52 printf("\n rec devices: ");
53 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
54 if ((1 << i) & recmask) {
57 printf("%s", names[i]);
65 res_name(const char *name, int mask)
69 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
70 if ((1 << i) & mask && !strcmp(names[i], name))
73 return i == SOUND_MIXER_NRDEVICES ? -1 : i;
77 print_recsrc(int recsrc)
80 fprintf(stderr, "Recording source: ");
82 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
83 if ((1 << i) & recsrc) {
85 fprintf(stderr, ", ");
86 fprintf(stderr, "%s", names[i]);
89 fprintf(stderr, "\n");
93 main(int argc, char *argv[])
96 int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
97 int dusage = 0, drecsrc = 0, shortflag = 0;
98 int l = 0, r = 0, t = 0;
99 int n = 0, lrel = 0, rrel = 0;
100 char lstr[8], rstr[8];
103 const char *name = defaultdev;
105 while ((ch = getopt(argc, argv, "f:sh")) != -1)
113 case 'h': /* Fall through */
120 if ((fd = open(name, O_RDWR)) < 0)
122 if (ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
123 err(1, "SOUND_MIXER_READ_DEVMASK");
124 if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
125 err(1, "SOUND_MIXER_READ_RECMASK");
126 if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
127 err(1, "SOUND_MIXER_READ_RECSRC");
132 usage(devmask, recmask); /* Does not return */
136 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
137 if (!((1 << i) & devmask))
139 if (ioctl(fd, MIXER_READ(i),&mset)== -1) {
144 printf("%s %d:%d ", names[i], LEFT(mset),
147 printf("Mixer %-8s is currently set to %3d:%d\n",
148 names[i], LEFT(mset), RIGHT(mset));
150 if(shortflag && isatty(STDOUT_FILENO))
152 if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
153 err(1, "SOUND_MIXER_READ_RECSRC");
154 print_recsrc(recsrc);
161 if (!strcmp("recsrc", *argv)) {
165 } else if (argc > 1 && !strcmp("rec", *argv + 1)) {
166 if (**argv != '+' && **argv != '-' &&
167 **argv != '=' && **argv != '^') {
168 warnx("unknown modifier: %c", **argv);
172 if ((dev = res_name(argv[1], recmask)) == -1) {
173 warnx("unknown recording device: %s", argv[1]);
179 recsrc |= (1 << dev);
182 recsrc &= ~(1 << dev);
188 recsrc ^= (1 << dev);
192 argc -= 2; argv += 2;
196 if ((t = sscanf(*argv, "%d:%d", &l, &r)) > 0) {
199 else if((dev = res_name(*argv, devmask)) == -1) {
200 warnx("unknown device: %s", *argv);
205 #define issign(c) (((c) == '+') || ((c) == '-'))
208 n = sscanf(argv[1], "%7[^:]:%7s", lstr, rstr);
222 switch(argc > 1 ? n : t) {
224 if (ioctl(fd, MIXER_READ(dev),&mset)== -1) {
230 printf("%s %d:%d ", names[dev], LEFT(mset), RIGHT(mset));
232 printf("Mixer %-8s is currently set to %3d:%d\n",
233 names[dev], LEFT(mset), RIGHT(mset));
240 if (ioctl(fd, MIXER_READ(dev),&mset)== -1) {
260 printf("Setting the mixer %s to %d:%d.\n", names[dev],
264 if (ioctl(fd, MIXER_WRITE(dev), &l) == -1)
267 argc -= 2; argv += 2;
272 if (orecsrc != recsrc)
273 if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1)
274 err(1, "SOUND_MIXER_WRITE_RECSRC");
277 if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
278 err(1, "SOUND_MIXER_READ_RECSRC");
279 print_recsrc(recsrc);