Changes made, also added a couple lines of docs here and their and changed the int variables to more meaningful. Lemme know if their is anything else you need.
Daren Desjardins On Mon, 2003-01-06 at 13:59, Juli Mallett wrote: > * De: Daren Desjardins <[EMAIL PROTECTED]> [ Data: 2003-01-06 ] > [ Subjecte: Added volume stepping to mixer ] > > Last week I modified the mixer to support volume stepping. Having a > > keyboard with volume control on it, it has come in very handy to be able > > to use the mixer to increase/decrease the volume. I submitted the > > changes to send-pr and have an open ticket. For those that are > > interested, Im including the diff against mixer.c v1.17. > > OK, I have some critiques, which if you do them (they were in my TODO > anyway) I'll be glad to commit: > Instead of two bool's use one 'int', if it is 0, then act as > we do now. If it is -1, we're decreasing, if it is +1, we're > increasing. Thus you do something like: > > if (direction != 0) > newvol = oldvol + (newvol * amount); > /* Set newval */ > > Also, don't do what you do with printf. What should be done, just before > setting newval (I've already done this locally, but you should as part > of what you're doing anyway) is more like this: > > if (newval < oldval) > printf("Decreasing level to blah blah"); > else if (newval > oldval) > printf("Increasing level to blah blah"); > else { > printf("No change in level at blah"); > /* Get on with our lives */ > } > /* Set newval */ > > Let me know. > > Thanx, > juli.
*** mixer_new.c Thu Jan 2 14:58:34 2003 --- mixer.c Mon Jan 6 14:31:58 2003 *************** *** 3,8 **** --- 3,9 ---- * * updated 1/1/93 to add stereo, level query, broken * devmask kludge - [EMAIL PROTECTED] + * updated 6/1/03 to add volume stepping - [EMAIL PROTECTED] * * (C) Craig Metz and Hannu Savolainen 1993. * *************** *** 13,19 **** #ifndef lint static const char rcsid[] = ! "$FreeBSD: src/usr.sbin/mixer/mixer.c,v 1.17 2002/12/30 04:23:08 jmallett Exp $"; #endif /* not lint */ #include <err.h> --- 14,20 ---- #ifndef lint static const char rcsid[] = ! "$FreeBSD: src/usr.sbin/mixer/mixer.c,v 1.11.2.6 2001/07/30 10:22:58 dd Exp $"; #endif /* not lint */ #include <err.h> *************** *** 35,41 **** { int i, n; ! printf("usage: mixer [-f device] [-s] [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n"); printf(" devices: "); for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) if ((1 << i) & devmask) { --- 36,42 ---- { int i, n; ! printf("usage: mixer [-f device] [-s] [-i|-d] [[dev [voll[:volr]] | recsrc | {^|+|-|=}rec recdev] ... ]\n"); printf(" devices: "); for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++) if ((1 << i) & devmask) { *************** *** 90,96 **** int foo, bar, baz, dev; int devmask = 0, recmask = 0, recsrc = 0, orecsrc; int dusage = 0, drecsrc = 0, shortflag = 0; ! int l = 0, r = 0, t = 0; char ch; char *name; --- 91,98 ---- int foo, bar, baz, dev; int devmask = 0, recmask = 0, recsrc = 0, orecsrc; int dusage = 0, drecsrc = 0, shortflag = 0; ! int left = 0, right = 0, temp = 0; ! int direction = 0; // volume stepping indicator char ch; char *name; *************** *** 102,115 **** else if (!strcmp(argv[0], "mixer3")) name = strdup("/dev/mixer2"); ! while ((ch = getopt(argc, argv, "f:s")) != -1) switch (ch) { case 'f': name = strdup(optarg); break; case 's': shortflag = 1; break; default: dusage = 1; } --- 104,126 ---- else if (!strcmp(argv[0], "mixer3")) name = strdup("/dev/mixer2"); ! while ((ch = getopt(argc, argv, "f:sid")) != -1) switch (ch) { case 'f': + // user specifed device name = strdup(optarg); break; case 's': + // display levels in short form shortflag = 1; break; + case 'i': + // increase volume flag present + direction = 1; + break; + case 'd': + direction = -1; + break; default: dusage = 1; } *************** *** 181,196 **** continue; } ! if ((t = sscanf(*argv, "%d:%d", &l, &r)) > 0) { dev = 0; } else if((dev = res_name(*argv, devmask)) == -1) { warnx("unknown device: %s", *argv); dusage = 1; break; } ! ! switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : t) { case 0: if (ioctl(baz, MIXER_READ(dev),&bar)== -1) { warn("MIXER_READ"); --- 192,209 ---- continue; } ! // Check if device is specified ! if ((temp = sscanf(*argv, "%d:%d", &left, &right)) > 0) { dev = 0; } + // read and verify the device else if((dev = res_name(*argv, devmask)) == -1) { warnx("unknown device: %s", *argv); dusage = 1; break; } ! // Read in the volume changes ! switch(argc > 1 ? sscanf(argv[1], "%d:%d", &left, &right) : temp) { case 0: if (ioctl(baz, MIXER_READ(dev),&bar)== -1) { warn("MIXER_READ"); *************** *** 206,233 **** 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; ! if (ioctl(baz, MIXER_READ(dev),&bar)== -1) { warn("MIXER_READ"); - argc--; argv++; continue; } ! printf("Setting the mixer %s from %d:%d to %d:%d.\n", ! names[dev], bar & 0x7f, (bar >> 8) & 0x7f, l, r); ! l |= r << 8; ! if (ioctl(baz, MIXER_WRITE(dev), &l) == -1) warn("WRITE_MIXER"); argc -= 2; argv += 2; --- 219,270 ---- argc--; argv++; break; case 1: ! // user did not specify left:right levels, ! right = left; case 2: ! // Read the current volume ! if(ioctl(baz, MIXER_READ(dev), &bar) == -1) ! { warn("MIXER_READ"); continue; } ! int leftVolume = bar & 0x7f; ! int rightVolume = (bar >> 8) & 0x7f; ! ! if(0 != direction) ! { ! // Perform volume stepping ! left = leftVolume + (direction * left); ! right = rightVolume + (direction * right); ! } ! ! // Check to see if new volumes are outside boundary ! if (left < 0) ! left = 0; ! else if (left > 100) ! left = 100; ! if (right < 0) ! right = 0; ! else if (right > 100) ! right = 100; ! ! temp= left|right << 8; ! ! if(temp>bar) ! { ! printf("Increasing the mixer %s from %d:%d to %d:%d.\n", names[dev],leftVolume, rightVolume, left,right); ! } ! else if(temp<bar) ! { ! printf("Decreasing the mixer %s from %d:%d to %d:%d.\n", names[dev],leftVolume, rightVolume,left, right); ! } ! else ! printf("No change in mixer %s at %d:%d.\n", names[dev], leftVolume, rightVolume); ! // Set the new volume ! if (ioctl(baz, MIXER_WRITE(dev), &temp) == -1) warn("WRITE_MIXER"); argc -= 2; argv += 2;