From 391f70e52a8bd9036778d9ceb7fef2724c783eea Mon Sep 17 00:00:00 2001 From: Jeroen Ruigrok/asmodai Date: Tue, 6 Jan 2004 08:35:42 +0000 Subject: [PATCH] Synch up with FreeBSD 5 with clean up changes. -h option added (for help) Relative volume values are now also supported. Submitted by: Craig Dooley --- usr.sbin/mixer/mixer.8 | 59 ++++++++++++++----- usr.sbin/mixer/mixer.c | 130 ++++++++++++++++++++++++++--------------- 2 files changed, 126 insertions(+), 63 deletions(-) diff --git a/usr.sbin/mixer/mixer.8 b/usr.sbin/mixer/mixer.8 index 616973ce42..79e92e1b02 100644 --- a/usr.sbin/mixer/mixer.8 +++ b/usr.sbin/mixer/mixer.8 @@ -26,7 +26,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD: src/usr.sbin/mixer/mixer.8,v 1.10.2.7 2003/03/11 21:13:51 trhodes Exp $ -.\" $DragonFly: src/usr.sbin/mixer/mixer.8,v 1.2 2003/06/17 04:29:57 dillon Exp $ +.\" $DragonFly: src/usr.sbin/mixer/mixer.8,v 1.3 2004/01/06 08:35:42 asmodai Exp $ .\" .Dd January 9, 1997 .Dt MIXER 8 @@ -38,19 +38,33 @@ .Nm .Op Fl f Ar device .Op Fl s +.Op Fl h .Oo -.Oo Ar dev -.Op Ar lvol Ns Op : Ns Ar rvol -.Cm | recsrc | +.Ar dev .Sm off -.Eo \&{ -.Cm ^ | + | - | = -.Sm on -.Ec \&} Ns Cm rec -.Ar rdev +.Oo +.Op Cm + | - +.Ar lvol +.Op : Oo Cm + | - Oc Ar rvol .Oc -.Ar ... .Oc +.Sm on +.Ar ... +.Nm +.Op Fl f Ar device +.Op Fl s +.Cm recsrc +.Ar ... +.Nm +.Op Fl f Ar device +.Op Fl s +.Sm off +.Bro +.Cm ^ | + | - | = +.Brc +.Cm rec +.Sm on +.Ar rdev ... .Sh DESCRIPTION The .Nm @@ -66,15 +80,16 @@ pcm2, rec, igain, ogain, line1, line2, and line3. .Pp Not all mixer devices are available. .Pp -When +Without any arguments, .Nm -is run without any arguments, all supported devices are displayed -along with current values. +displays the current settings for all supported devices, followed by information +about the current recording input devices. If the .Ar dev -argument is specified, the value for the -.Ar dev -device will be displayed. +argument is specified, +.Nm +displays only the value for that +.Ar dev . .Pp To modify the mixer value .Ar dev , @@ -88,6 +103,13 @@ arguments may be from 0 - 100. Omitting .Ar dev and including only the channel settings will change the main volume level. .Pp +If the left or right channel settings are prefixed with +.Cm + +or +.Cm - , +the value following will be used as a relative adjustment, modifying the +current settings by the amount specified. +.Pp If the .Fl s flag is used, the current mixer values will be displayed in a format suitable @@ -127,6 +149,11 @@ The option will open .Ar device as the mixer device. +.Pp +The option +.Fl h +will print a help and exit +.Pp .Sh FILES .Bl -tag -width /dev/mixer -compact .It Pa /dev/mixer diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c index f33ca28387..bfe1a961ad 100644 --- a/usr.sbin/mixer/mixer.c +++ b/usr.sbin/mixer/mixer.c @@ -11,7 +11,7 @@ * ditto for my modifications (John-Mark Gurney, 1997) * * $FreeBSD: src/usr.sbin/mixer/mixer.c,v 1.11.2.6 2001/07/30 10:22:58 dd Exp $ - * $DragonFly: src/usr.sbin/mixer/mixer.c,v 1.2 2003/06/17 04:29:57 dillon Exp $ + * $DragonFly: src/usr.sbin/mixer/mixer.c,v 1.3 2004/01/06 08:35:42 asmodai Exp $ */ #include @@ -22,7 +22,11 @@ #include #include +#define LEFT(vol) (vol & 0x7f) +#define RIGHT(vol) ((vol >> 8) & 0x7f) + const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES; +const char *defaultdev = "/dev/mixer"; void usage(int devmask, int recmask); int res_name(const char *name, int mask); @@ -33,7 +37,10 @@ usage(int devmask, int recmask) { int i, n; - printf("usage: mixer [-f device] [-s] [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n"); + printf("usage: mixer [-f device] [-s] [dev [+|-][voll[:[+|-]volr]] ...\n" + " mixer [-f device] [-s] recsrc ...\n" + " mixer [-f device] [-s] {^|+|-|=}rec recdev ...\n" + " mixer -h\n"); printf(" devices: "); for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) if ((1 << i) & devmask) { @@ -57,13 +64,13 @@ usage(int devmask, int recmask) int res_name(const char *name, int mask) { - int foo; + int i; - for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) - if ((1 << foo) & mask && !strcmp(names[foo], name)) + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) + if ((1 << i) & mask && !strcmp(names[i], name)) break; - return foo == SOUND_MIXER_NRDEVICES ? -1 : foo; + return i == SOUND_MIXER_NRDEVICES ? -1 : i; } void @@ -85,65 +92,72 @@ print_recsrc(int recsrc) int main(int argc, char *argv[]) { - int foo, bar, baz, dev; + int i, mset, fd, dev; int devmask = 0, recmask = 0, recsrc = 0, orecsrc; int dusage = 0, drecsrc = 0, shortflag = 0; int l = 0, r = 0, t = 0; + int n = 0, lrel = 0, rrel = 0; + char lstr[8], rstr[8]; char ch; - char *name; - - name = strdup("/dev/mixer"); + const char *name = defaultdev; - if (!strcmp(argv[0], "mixer2")) - name = strdup("/dev/mixer1"); - else if (!strcmp(argv[0], "mixer3")) - name = strdup("/dev/mixer2"); - - while ((ch = getopt(argc, argv, "f:s")) != -1) + while ((ch = getopt(argc, argv, "f:sh")) != -1) switch (ch) { case 'f': - name = strdup(optarg); + name = optarg; break; case 's': shortflag = 1; break; + case 'h': /* Fall through */ default: dusage = 1; } - argc -= (optind - 1); - argv += (optind - 1); + argc -= optind; + argv += optind; - if ((baz = open(name, O_RDWR)) < 0) + if ((fd = open(name, O_RDWR)) < 0) err(1, "%s", name); - free(name); - if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) + if (ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) err(1, "SOUND_MIXER_READ_DEVMASK"); - if (ioctl(baz, SOUND_MIXER_READ_RECMASK, &recmask) == -1) + if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1) err(1, "SOUND_MIXER_READ_RECMASK"); - if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) + if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) err(1, "SOUND_MIXER_READ_RECSRC"); orecsrc = recsrc; - if ((argc == 1) && (dusage == 0)) { - for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) { - if (!((1 << foo) & devmask)) + if (dusage) { + close(fd); + usage(devmask, recmask); /* Does not return */ + } + + if (argc == 0) { + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { + if (!((1 << i) & devmask)) continue; - if (ioctl(baz, MIXER_READ(foo),&bar)== -1) { + if (ioctl(fd, MIXER_READ(i),&mset)== -1) { warn("MIXER_READ"); continue; } if (shortflag) - printf("%s %d:%d ", names[foo], bar & 0x7f, (bar >> 8) & 0x7f); + printf("%s %d:%d ", names[i], LEFT(mset), + RIGHT(mset)); else - printf("Mixer %-8s is currently set to %3d:%d\n", names[foo], bar & 0x7f, (bar >> 8) & 0x7f); + printf("Mixer %-8s is currently set to %3d:%d\n", + names[i], LEFT(mset), RIGHT(mset)); } - return(0); + if(shortflag && isatty(STDOUT_FILENO)) + printf("\n"); + if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) + err(1, "SOUND_MIXER_READ_RECSRC"); + print_recsrc(recsrc); + exit(0); } - argc--; argv++; - while ((argc > 0) && (dusage == 0)) { + + while (argc > 0) { if (!strcmp("recsrc", *argv)) { drecsrc = 1; argc--; argv++; @@ -188,24 +202,52 @@ main(int argc, char *argv[]) break; } - switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : t) { +#define issign(c) (((c) == '+') || ((c) == '-')) + + if (argc > 1) { + n = sscanf(argv[1], "%7[^:]:%7s", lstr, rstr); + if (n > 0) { + if (issign(lstr[0])) + lrel = rrel = 1; + l = atoi(lstr); + } + if (n > 1) { + rrel = 0; + if (issign(rstr[0])) + rrel = 1; + r = atoi(rstr); + } + } + + switch(argc > 1 ? n : t) { case 0: - if (ioctl(baz, MIXER_READ(dev),&bar)== -1) { + if (ioctl(fd, MIXER_READ(dev),&mset)== -1) { warn("MIXER_READ"); argc--; argv++; continue; } if (shortflag) - printf("%s %d:%d ", names[dev], bar & 0x7f, (bar >> 8) & 0x7f); + printf("%s %d:%d ", names[dev], LEFT(mset), RIGHT(mset)); else printf("Mixer %-8s is currently set to %3d:%d\n", - names[dev], bar & 0x7f, (bar >> 8) & 0x7f); + names[dev], LEFT(mset), RIGHT(mset)); argc--; argv++; break; case 1: r = l; case 2: + if (ioctl(fd, MIXER_READ(dev),&mset)== -1) { + warn("MIXER_READ"); + argc--; argv++; + continue; + } + + if (lrel) + l += LEFT(mset); + if (rrel) + r += RIGHT(mset); + if (l < 0) l = 0; else if (l > 100) @@ -219,7 +261,7 @@ main(int argc, char *argv[]) l, r); l |= r << 8; - if (ioctl(baz, MIXER_WRITE(dev), &l) == -1) + if (ioctl(fd, MIXER_WRITE(dev), &l) == -1) warn("WRITE_MIXER"); argc -= 2; argv += 2; @@ -227,23 +269,17 @@ main(int argc, char *argv[]) } } - if (dusage) { - close(baz); - usage(devmask, recmask); - /* Not reached */ - } - if (orecsrc != recsrc) - if (ioctl(baz, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) + if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) err(1, "SOUND_MIXER_WRITE_RECSRC"); if (drecsrc) { - if (ioctl(baz, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) + if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) err(1, "SOUND_MIXER_READ_RECSRC"); print_recsrc(recsrc); } - close(baz); + close(fd); exit(0); } -- 2.41.0