Diff for /src/usr.sbin/mixer/mixer.c between versions 1.2 and 1.3

version 1.2, 2003/06/17 04:29:57 version 1.3, 2004/01/06 08:35:42
Line 11 Line 11
  * ditto for my modifications (John-Mark Gurney, 1997)   * 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 $   * $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.1 2003/06/16 07:26:03 dillon Exp $ * $DragonFly$
  */   */
   
 #include <err.h>  #include <err.h>
Line 22 Line 22
 #include <unistd.h>  #include <unistd.h>
 #include <sys/soundcard.h>  #include <sys/soundcard.h>
   
   #define LEFT(vol) (vol & 0x7f)
   #define RIGHT(vol) ((vol >> 8) & 0x7f)
   
 const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;  const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
   const char *defaultdev = "/dev/mixer";
   
 void usage(int devmask, int recmask);  void usage(int devmask, int recmask);
 int res_name(const char *name, int mask);  int res_name(const char *name, int mask);
Line 33  usage(int devmask, int recmask) Line 37  usage(int devmask, int recmask)
 {  {
         int i, n;          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: ");          printf(" devices: ");
         for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)          for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
                 if ((1 << i) & devmask)  {                  if ((1 << i) & devmask)  {
Line 57  usage(int devmask, int recmask) Line 64  usage(int devmask, int recmask)
 int  int
 res_name(const char *name, int mask)  res_name(const char *name, int mask)
 {  {
        int foo;        int i;
   
        for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++)        for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
                if ((1 << foo) & mask && !strcmp(names[foo], name))                if ((1 << i) & mask && !strcmp(names[i], name))
                         break;                          break;
   
        return foo == SOUND_MIXER_NRDEVICES ? -1 : foo;        return i == SOUND_MIXER_NRDEVICES ? -1 : i;
 }  }
   
 void  void
Line 85  print_recsrc(int recsrc) Line 92  print_recsrc(int recsrc)
 int  int
 main(int argc, char *argv[])  main(int argc, char *argv[])
 {  {
        int foo, bar, baz, dev;        int i, mset, fd, dev;
         int devmask = 0, recmask = 0, recsrc = 0, orecsrc;          int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
         int dusage = 0, drecsrc = 0, shortflag = 0;          int dusage = 0, drecsrc = 0, shortflag = 0;
         int l = 0, r = 0, t = 0;          int l = 0, r = 0, t = 0;
           int n = 0, lrel = 0, rrel = 0;
           char lstr[8], rstr[8];
         char ch;          char ch;
   
        char *name;        const char *name = defaultdev;
 
        name = strdup("/dev/mixer"); 
   
        if (!strcmp(argv[0], "mixer2"))        while ((ch = getopt(argc, argv, "f:sh")) != -1)
                name = strdup("/dev/mixer1"); 
        else if (!strcmp(argv[0], "mixer3")) 
                name = strdup("/dev/mixer2"); 
 
        while ((ch = getopt(argc, argv, "f:s")) != -1) 
                 switch (ch) {                  switch (ch) {
                         case 'f':                          case 'f':
                                name = strdup(optarg);                                name = optarg;
                                 break;                                  break;
                         case 's':                          case 's':
                                 shortflag = 1;                                  shortflag = 1;
                                 break;                                  break;
                           case 'h': /* Fall through */
                         default:                          default:
                                 dusage = 1;                                  dusage = 1;
                 }                  }
        argc -= (optind - 1);        argc -= optind;
        argv += (optind - 1);        argv += optind;
   
        if ((baz = open(name, O_RDWR)) < 0)        if ((fd = open(name, O_RDWR)) < 0)
                 err(1, "%s", name);                  err(1, "%s", name);
        free(name);        if (ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
        if (ioctl(baz, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) 
                 err(1, "SOUND_MIXER_READ_DEVMASK");                  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");                  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");                  err(1, "SOUND_MIXER_READ_RECSRC");
         orecsrc = recsrc;          orecsrc = recsrc;
   
        if ((argc == 1) && (dusage == 0)) {        if (dusage) {
                for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) {                close(fd);
                        if (!((1 << foo) & devmask))                 usage(devmask, recmask); /* Does not return */
         }
 
         if (argc == 0) {
                 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
                         if (!((1 << i) & devmask)) 
                                 continue;                                  continue;
                        if (ioctl(baz, MIXER_READ(foo),&bar)== -1) {                        if (ioctl(fd, MIXER_READ(i),&mset)== -1) {
                                 warn("MIXER_READ");                                  warn("MIXER_READ");
                                 continue;                                  continue;
                         }                          }
                         if (shortflag)                          if (shortflag)
                                printf("%s %d:%d ", names[foo], bar & 0x7f, (bar >> 8) & 0x7f);                                printf("%s %d:%d ", names[i], LEFT(mset), 
                                                 RIGHT(mset));
                         else                          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)) {                  if (!strcmp("recsrc", *argv)) {
                         drecsrc = 1;                          drecsrc = 1;
                         argc--; argv++;                          argc--; argv++;
Line 188  main(int argc, char *argv[]) Line 202  main(int argc, char *argv[])
                         break;                          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:                  case 0:
                        if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {                        if (ioctl(fd, MIXER_READ(dev),&mset)== -1) {
                                 warn("MIXER_READ");                                  warn("MIXER_READ");
                                 argc--; argv++;                                  argc--; argv++;
                                 continue;                                  continue;
                         }                          }
                         if (shortflag)                          if (shortflag)
                                printf("%s %d:%d ", names[dev], bar & 0x7f, (bar >> 8) & 0x7f);                                printf("%s %d:%d ", names[dev], LEFT(mset), RIGHT(mset));
                         else                          else
                                 printf("Mixer %-8s is currently set to %3d:%d\n",                                  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++;                          argc--; argv++;
                         break;                          break;
                 case 1:                  case 1:
                         r = l;                          r = l;
                 case 2:                  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)                          if (l < 0)
                                 l = 0;                                  l = 0;
                         else if (l > 100)                          else if (l > 100)
Line 219  main(int argc, char *argv[]) Line 261  main(int argc, char *argv[])
                             l, r);                              l, r);
   
                         l |= r << 8;                          l |= r << 8;
                        if (ioctl(baz, MIXER_WRITE(dev), &l) == -1)                        if (ioctl(fd, MIXER_WRITE(dev), &l) == -1)
                                 warn("WRITE_MIXER");                                  warn("WRITE_MIXER");
   
                         argc -= 2; argv += 2;                          argc -= 2; argv += 2;
Line 227  main(int argc, char *argv[]) Line 269  main(int argc, char *argv[])
                 }                  }
         }          }
   
         if (dusage) {  
                 close(baz);  
                 usage(devmask, recmask);  
                 /* Not reached */  
         }  
   
         if (orecsrc != recsrc)          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");                          err(1, "SOUND_MIXER_WRITE_RECSRC");
     
         if (drecsrc) {          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");                          err(1, "SOUND_MIXER_READ_RECSRC");
                 print_recsrc(recsrc);                  print_recsrc(recsrc);
         }          }
   
        close(baz);        close(fd);
   
         exit(0);          exit(0);
 }  }

Removed from v.1.2  
changed lines
  Added in v.1.3