mixer.c (153953) | mixer.c (177195) |
---|---|
1/* 2 * This is an example of a mixer program for Linux 3 * 4 * updated 1/1/93 to add stereo, level query, broken 5 * devmask kludge - cmetz@thor.tjhsst.edu 6 * 7 * (C) Craig Metz and Hannu Savolainen 1993. 8 * 9 * You may do anything you wish with this program. 10 * 11 * ditto for my modifications (John-Mark Gurney, 1997) 12 */ 13 14#include <sys/cdefs.h> | 1/* 2 * This is an example of a mixer program for Linux 3 * 4 * updated 1/1/93 to add stereo, level query, broken 5 * devmask kludge - cmetz@thor.tjhsst.edu 6 * 7 * (C) Craig Metz and Hannu Savolainen 1993. 8 * 9 * You may do anything you wish with this program. 10 * 11 * ditto for my modifications (John-Mark Gurney, 1997) 12 */ 13 14#include <sys/cdefs.h> |
15__FBSDID("$FreeBSD: head/usr.sbin/mixer/mixer.c 153953 2006-01-01 20:19:49Z ariff $"); | 15__FBSDID("$FreeBSD: head/usr.sbin/mixer/mixer.c 177195 2008-03-15 01:09:47Z jkim $"); |
16 17#include <err.h> 18#include <fcntl.h> | 16 17#include <err.h> 18#include <fcntl.h> |
19#include <libgen.h> 20#include <limits.h> |
|
19#include <stdio.h> 20#include <string.h> 21#include <stdlib.h> 22#include <unistd.h> 23#include <sys/soundcard.h> 24 25const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES; 26 27void usage(int devmask, int recmask); 28int res_name(const char *name, int mask); | 21#include <stdio.h> 22#include <string.h> 23#include <stdlib.h> 24#include <unistd.h> 25#include <sys/soundcard.h> 26 27const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES; 28 29void usage(int devmask, int recmask); 30int res_name(const char *name, int mask); |
29void print_recsrc(int recsrc, int shortflag); | 31void print_recsrc(int recsrc, int recmask, int shortflag); |
30 31void 32usage(int devmask, int recmask) 33{ 34 int i, n; 35 36 printf("usage: mixer [-f device] [-s | -S] [dev [+|-][voll[:[+|-]volr]] ...\n" 37 " mixer [-f device] [-s | -S] recsrc ...\n" 38 " mixer [-f device] [-s | -S] {^|+|-|=}rec rdev ... \n"); | 32 33void 34usage(int devmask, int recmask) 35{ 36 int i, n; 37 38 printf("usage: mixer [-f device] [-s | -S] [dev [+|-][voll[:[+|-]volr]] ...\n" 39 " mixer [-f device] [-s | -S] recsrc ...\n" 40 " mixer [-f device] [-s | -S] {^|+|-|=}rec rdev ... \n"); |
39 printf(" devices: "); 40 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) 41 if ((1 << i) & devmask) { 42 if (n) 43 printf(", "); 44 printf("%s", names[i]); 45 n = 1; 46 } 47 printf("\n rec devices: "); 48 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) 49 if ((1 << i) & recmask) { 50 if (n) 51 printf(", "); 52 printf("%s", names[i]); 53 n = 1; 54 } | 41 if (devmask != 0) { 42 printf(" devices: "); 43 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) 44 if ((1 << i) & devmask) { 45 if (n) 46 printf(", "); 47 printf("%s", names[i]); 48 n = 1; 49 } 50 } 51 if (recmask != 0) { 52 printf("\n rec devices: "); 53 for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) 54 if ((1 << i) & recmask) { 55 if (n) 56 printf(", "); 57 printf("%s", names[i]); 58 n = 1; 59 } 60 } |
55 printf("\n"); 56 exit(1); 57} 58 59int 60res_name(const char *name, int mask) 61{ 62 int foo; 63 64 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) 65 if ((1 << foo) & mask && !strcmp(names[foo], name)) 66 break; 67 68 return foo == SOUND_MIXER_NRDEVICES ? -1 : foo; 69} 70 71void | 61 printf("\n"); 62 exit(1); 63} 64 65int 66res_name(const char *name, int mask) 67{ 68 int foo; 69 70 for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) 71 if ((1 << foo) & mask && !strcmp(names[foo], name)) 72 break; 73 74 return foo == SOUND_MIXER_NRDEVICES ? -1 : foo; 75} 76 77void |
72print_recsrc(int recsrc, int shortflag) | 78print_recsrc(int recsrc, int recmask, int shortflag) |
73{ 74 int i, n = 0; 75 | 79{ 80 int i, n = 0; 81 |
82 if (recmask == 0) 83 return; 84 |
|
76 if (!shortflag) 77 printf("Recording source: "); 78 79 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 80 if ((1 << i) & recsrc) { 81 if (shortflag) { 82 if (n) 83 printf(" +rec "); --- 6 unchanged lines hidden (view full) --- 90 } 91 if (!shortflag) 92 printf("\n"); 93} 94 95int 96main(int argc, char *argv[]) 97{ | 85 if (!shortflag) 86 printf("Recording source: "); 87 88 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 89 if ((1 << i) & recsrc) { 90 if (shortflag) { 91 if (n) 92 printf(" +rec "); --- 6 unchanged lines hidden (view full) --- 99 } 100 if (!shortflag) 101 printf("\n"); 102} 103 104int 105main(int argc, char *argv[]) 106{ |
107 char mixer[PATH_MAX] = "/dev/mixer"; 108 char *name, *eptr; |
|
98 int foo, bar, baz, dev; 99 int devmask = 0, recmask = 0, recsrc = 0, orecsrc; 100 int dusage = 0, drecsrc = 0, shortflag = 0, Shortflag = 0; 101 int l = 0, r = 0, t = 0; 102 char lstr[5], rstr[5]; | 109 int foo, bar, baz, dev; 110 int devmask = 0, recmask = 0, recsrc = 0, orecsrc; 111 int dusage = 0, drecsrc = 0, shortflag = 0, Shortflag = 0; 112 int l = 0, r = 0, t = 0; 113 char lstr[5], rstr[5]; |
103 int n = 0, lrel = 0, rrel = 0; 104 int ch; | 114 int n, lrel = 0, rrel = 0; 115 char ch; |
105 | 116 |
106 char *name; | 117 if ((name = strdup(basename(argv[0]))) == NULL) 118 err(1, "strdup()"); 119 if (strncmp(name, "mixer", 5) == 0 && name[5] != '\0') { 120 n = strtol(name + 5, &eptr, 10) - 1; 121 if (n > 0 && *eptr == '\0') 122 snprintf(mixer, PATH_MAX - 1, "/dev/mixer%d", n); 123 } 124 free(name); 125 name = mixer; |
107 | 126 |
108 name = "/dev/mixer"; 109 110 if (!strcmp(argv[0], "mixer2")) 111 name = "/dev/mixer1"; 112 else if (!strcmp(argv[0], "mixer3")) 113 name = "/dev/mixer2"; 114 115 while ((ch = getopt(argc, argv, "f:sS")) != -1) 116 switch (ch) { 117 case 'f': 118 name = optarg; 119 break; 120 case 's': 121 shortflag = 1; 122 break; 123 case 'S': 124 Shortflag = 1; 125 break; 126 default: | 127 n = 1; 128 for (;;) { 129 if (n >= argc || *argv[n] != '-') 130 break; 131 if (strlen(argv[n]) != 2) { 132 if (strcmp(argv[n] + 1, "rec") != 0) |
127 dusage = 1; | 133 dusage = 1; |
134 break; |
|
128 } | 135 } |
129 argc -= (optind - 1); 130 argv += (optind - 1); | 136 ch = *(argv[n] + 1); 137 if (ch == 'f' && n < argc - 1) { 138 name = argv[n + 1]; 139 n += 2; 140 } else if (ch == 's') { 141 shortflag = 1; 142 n++; 143 } else if (ch == 'S') { 144 Shortflag = 1; 145 n++; 146 } else { 147 dusage = 1; 148 break; 149 } 150 } 151 if (shortflag && Shortflag) 152 dusage = 1; |
131 | 153 |
154 argc -= n - 1; 155 argv += n - 1; 156 |
|
132 if ((baz = open(name, O_RDWR)) < 0) 133 err(1, "%s", name); 134 if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) 135 err(1, "SOUND_MIXER_READ_DEVMASK"); 136 if (ioctl(baz, SOUND_MIXER_READ_RECMASK, &recmask) == -1) 137 err(1, "SOUND_MIXER_READ_RECMASK"); 138 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 139 err(1, "SOUND_MIXER_READ_RECSRC"); --- 14 unchanged lines hidden (view full) --- 154 printf("%s %d:%d ", names[foo], bar & 0x7f, 155 (bar >> 8) & 0x7f); 156 else 157 printf("Mixer %-8s is currently set to %3d:%d\n", 158 names[foo], bar & 0x7f, (bar >> 8) & 0x7f); 159 } 160 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 161 err(1, "SOUND_MIXER_READ_RECSRC"); | 157 if ((baz = open(name, O_RDWR)) < 0) 158 err(1, "%s", name); 159 if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) 160 err(1, "SOUND_MIXER_READ_DEVMASK"); 161 if (ioctl(baz, SOUND_MIXER_READ_RECMASK, &recmask) == -1) 162 err(1, "SOUND_MIXER_READ_RECMASK"); 163 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 164 err(1, "SOUND_MIXER_READ_RECSRC"); --- 14 unchanged lines hidden (view full) --- 179 printf("%s %d:%d ", names[foo], bar & 0x7f, 180 (bar >> 8) & 0x7f); 181 else 182 printf("Mixer %-8s is currently set to %3d:%d\n", 183 names[foo], bar & 0x7f, (bar >> 8) & 0x7f); 184 } 185 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 186 err(1, "SOUND_MIXER_READ_RECSRC"); |
162 print_recsrc(recsrc, shortflag || Shortflag); | 187 print_recsrc(recsrc, recmask, shortflag || Shortflag); |
163 return(0); 164 } 165 166 argc--; argv++; 167 168 while ((argc > 0) && (dusage == 0)) { 169 if (!strcmp("recsrc", *argv)) { 170 drecsrc = 1; --- 112 unchanged lines hidden (view full) --- 283 } 284 285 if (dusage) { 286 close(baz); 287 usage(devmask, recmask); 288 /* Not reached */ 289 } 290 | 188 return(0); 189 } 190 191 argc--; argv++; 192 193 while ((argc > 0) && (dusage == 0)) { 194 if (!strcmp("recsrc", *argv)) { 195 drecsrc = 1; --- 112 unchanged lines hidden (view full) --- 308 } 309 310 if (dusage) { 311 close(baz); 312 usage(devmask, recmask); 313 /* Not reached */ 314 } 315 |
291 if (orecsrc != recsrc) | 316 if (orecsrc != recsrc) { |
292 if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) 293 err(1, "SOUND_MIXER_WRITE_RECSRC"); | 317 if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) 318 err(1, "SOUND_MIXER_WRITE_RECSRC"); |
294 295 if (drecsrc) { | |
296 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 297 err(1, "SOUND_MIXER_READ_RECSRC"); | 319 if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) 320 err(1, "SOUND_MIXER_READ_RECSRC"); |
298 print_recsrc(recsrc, shortflag || Shortflag); | |
299 } | 321 } |
322 323 if (drecsrc) 324 print_recsrc(recsrc, recmask, shortflag || Shortflag); |
|
300 301 close(baz); 302 303 exit(0); 304} | 325 326 close(baz); 327 328 exit(0); 329} |