summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mixer/mixer.c
diff options
context:
space:
mode:
authorjmg <jmg@FreeBSD.org>1997-09-19 13:38:51 +0000
committerjmg <jmg@FreeBSD.org>1997-09-19 13:38:51 +0000
commitd3d13402b907e7b1ab063873cf2b80a7fcdb71ba (patch)
tree17f009b8f3954c73dd9262b252c7a012d29f2e06 /usr.sbin/mixer/mixer.c
parent95f845dddf814c591be7f8a205652d475ae89d64 (diff)
downloadFreeBSD-src-d3d13402b907e7b1ab063873cf2b80a7fcdb71ba.zip
FreeBSD-src-d3d13402b907e7b1ab063873cf2b80a7fcdb71ba.tar.gz
major modifications to the mixer. currently it doesn't report errors
that it encounters (such as invalid device), but does print usage upon this error... but otherwise allows complex commands such as: mixer -f /dev/mixer4 synth line 50 -rec mic +rec line =rec cd ^rec mix
Diffstat (limited to 'usr.sbin/mixer/mixer.c')
-rw-r--r--usr.sbin/mixer/mixer.c221
1 files changed, 143 insertions, 78 deletions
diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c
index 9415a42..edb9ab7 100644
--- a/usr.sbin/mixer/mixer.c
+++ b/usr.sbin/mixer/mixer.c
@@ -7,11 +7,15 @@
* (C) Craig Metz and Hannu Savolainen 1993.
*
* You may do anything you wish with this program.
+ *
+ * ditto for my modifications (John-Mark Gurney, 1997)
*/
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
#ifdef __FreeBSD__
#include <machine/soundcard.h>
#else
@@ -20,25 +24,50 @@
char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
-int devmask = 0, recmask = 0, recsrc = 0;
+void usage(int devmask, int recmask);
+int res_name(const char *name, int mask);
+void print_recsrc(int recsrc);
-void usage(void)
+void
+usage(int devmask, int recmask)
{
- int i, n = 0;
- printf("Usage: mixer { ");
+ int i, n;
- for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
+ printf("usage:\tmixer [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n");
+ printf(" devices:\t");
+ for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
if ((1 << i) & devmask) {
if (n)
- putchar('|');
+ printf(", ");
+ printf(names[i]);
+ n = 1;
+ }
+ printf("\n rec devices:\t");
+ for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
+ if ((1 << i) & recmask) {
+ if (n)
+ printf(", ");
printf(names[i]);
n = 1;
}
- printf(" } <value>\n or mixer { +rec|-rec } <devicename>\n");
+ printf("\n");
exit(1);
}
-void print_recsrc(void)
+int
+res_name(const char *name, int mask)
+{
+ int foo;
+
+ for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++)
+ if ((1 << foo) & mask && !strcmp(names[foo], name))
+ break;
+
+ return foo == SOUND_MIXER_NRDEVICES ? -1 : foo;
+}
+
+void
+print_recsrc(int recsrc)
{
int i, n = 0;
fprintf(stderr, "Recording source: ");
@@ -57,19 +86,29 @@ int
main(int argc, char *argv[])
{
int foo, bar, baz, dev;
+ int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
+ int dusage = 0, drecsrc = 0;
+ int l, r;
+
+ char *name;
- char name[30] = "/dev/mixer";
+ name = strdup("/dev/mixer");
if (!strcmp(argv[0], "mixer2"))
- strcpy(name, "/dev/mixer1");
- else
- if (!strcmp(argv[0], "mixer3"))
- strcpy(name, "/dev/mixer2");
+ name = strdup("/dev/mixer1");
+ else if (!strcmp(argv[0], "mixer3"))
+ name = strdup("/dev/mixer2");
+
+ if (argc > 1 && !strcmp(argv[1], "-f")) {
+ name = strdup(argv[2]);
+ argc -= 2; argv += 2;
+ }
if ((baz = open(name, O_RDWR)) < 0) {
perror(name);
exit(1);
}
+ free(name);
if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
perror("SOUND_MIXER_READ_DEVMASK");
exit(-1);
@@ -82,22 +121,9 @@ main(int argc, char *argv[])
perror("SOUND_MIXER_READ_RECSRC");
exit(-1);
}
+ orecsrc = recsrc;
- switch (argc) {
- case 3:
- bar = 1;
- break;
- case 2:
- bar = 0;
- break;
- case 1:
- bar = -1;
- break;
- default:
- usage();
- }
-
- if (bar < 0) {
+ if (argc == 1) {
for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) {
if (!((1 << foo) & devmask))
continue;
@@ -110,65 +136,104 @@ main(int argc, char *argv[])
return(0);
}
- for (foo = 0; foo < SOUND_MIXER_NRDEVICES && strcmp(names[foo], argv[1]); foo++);
-
- if (foo >= SOUND_MIXER_NRDEVICES) {
-
- if (!strcmp("+rec", argv[1]) || !strcmp("-rec", argv[1])) {
- if (argc != 3) {
- usage();
- /* NOTREACHED */
+ argc--; argv++;
+
+ while (argc) {
+ if (!strcmp("recsrc", *argv)) {
+ drecsrc = 1;
+ argc--; argv++;
+ continue;
+ } else if (argc > 1 && !strcmp("rec", *argv + 1)) {
+ if (**argv != '+' && **argv != '-' &&
+ **argv != '=' && **argv != '^') {
+ dusage = 1;
+ argc -= 1; argv += 1;
+ continue;
}
- for (dev = 0; dev < SOUND_MIXER_NRDEVICES && strcmp(names[dev], argv[2]); dev++);
- if (dev >= SOUND_MIXER_NRDEVICES)
- usage();
-
- if (!((1 << dev) & recmask)) {
- fprintf(stderr, "Invalid recording source %s\n", argv[2]);
- exit(-1);
+ if ((dev = res_name(argv[1], recmask)) == -1) {
+ dusage = 1;
+ argc -= 1; argv += 1;
+ continue;
}
- if (argv[1][0] == '+')
+ switch(**argv) {
+ case '+':
recsrc |= (1 << dev);
- else
+ break;
+ case '-':
recsrc &= ~(1 << dev);
+ break;
+ case '=':
+ recsrc = (1 << dev);
+ break;
+ case '^':
+ recsrc ^= (1 << dev);
+ break;
+ }
+ drecsrc = 1;
+ argc -= 2; argv += 2;
+ continue;
+ }
- if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) {
- perror("SOUND_MIXER_WRITE_RECSRC");
- exit(-1);
+ if ((dev = res_name(*argv, devmask)) == -1) {
+ dusage = 1;
+ argc--; argv++;
+ continue;
+ }
+
+ switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : 0) {
+ case 0:
+ if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
+ perror("MIXER_READ");
+ argc--; argv++;
+ continue;
}
- print_recsrc();
-
- } else
- usage();
- } else {
- if (bar) {
- if (strchr(argv[2], ':') == NULL) {
- sscanf(argv[2], "%d", &bar);
- dev = bar;
- } else
- sscanf(argv[2], "%d:%d", &bar, &dev);
-
- if (bar < 0)
- bar = 0;
- if (dev < 0)
- dev = 0;
- if (bar > 100)
- bar = 100;
- if (dev > 100)
- dev = 100;
-
- printf("Setting the mixer %s to %d:%d.\n", names[foo], bar, dev);
-
- bar |= dev << 8;
- if (ioctl(baz, MIXER_WRITE(foo), &bar) == -1)
+ printf("Mixer %-8s is currently set to %3d:%d\n",
+ names[dev], bar & 0x7f, (bar >> 8) & 0x7f);
+
+ argc--; argv++;
+ break;
+ case 1:
+ r = l;
+ case 2:
+ if (l < 0)
+ l = 0;
+ else if (l > 100)
+ l = 100;
+ if (r < 0)
+ r = 0;
+ else if (r > 100)
+ r = 100;
+
+ printf("Setting the mixer %s to %d:%d.\n", names[dev],
+ l, r);
+
+ l |= r << 8;
+ if (ioctl(baz, MIXER_WRITE(dev), &l) == -1)
perror("WRITE_MIXER");
- return (0);
- } else {
- if (ioctl(baz, MIXER_READ(foo),&bar)== -1)
- perror("MIXER_READ");
- printf("The mixer %s is currently set to %d:%d.\n", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);
+
+ argc -= 2; argv += 2;
+ break;
}
}
+ if (orecsrc != recsrc)
+ if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) {
+ perror("SOUND_MIXER_WRITE_RECSRC");
+ exit(-1);
+ }
+
+ if (drecsrc) {
+ if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) {
+ perror("SOUND_MIXER_READ_RECSRC");
+ exit(-1);
+ }
+ print_recsrc(recsrc);
+ }
+
close(baz);
+
+ if (dusage)
+ usage(devmask, recmask);
+
+ exit(0);
}
OpenPOWER on IntegriCloud