home *** CD-ROM | disk | FTP | other *** search
/ ftp.4front-tech.com / ftp.4front-tech.com.tar / ftp.4front-tech.com / ossfree / snd-util-3.8.tar.gz / snd-util-3.8.tar / sndkit / mixer.c next >
C/C++ Source or Header  |  1997-03-27  |  4KB  |  184 lines

  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.  
  12. #include <stdio.h>
  13. #include <fcntl.h>
  14. #include <string.h>
  15. #include <errno.h>
  16. #include <sys/soundcard.h>
  17.  
  18. extern int errno;
  19.  
  20. char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
  21.  
  22. int devmask = 0, recmask = 0, recsrc = 0;
  23.  
  24. void usage(void)
  25. {
  26.     int i, n = 0;
  27.     printf("Usage: mixer { ");
  28.  
  29.     for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 
  30.         if ((1 << i) & devmask)  {
  31.             if (n)
  32.                 putchar('|');
  33.             printf(names[i]);
  34.             n = 1;
  35.         } 
  36.     printf(" } <value>\n  or   mixer { +rec|-rec } <devicename>\n");
  37.     printf("  or   mixer ?rec (prints the current recording source)\n");
  38.     exit(1);
  39. }
  40.  
  41. void print_recsrc(void)
  42. {
  43.     int i, n = 0;
  44.     fprintf(stderr, "Recording source: ");
  45.  
  46.     for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  47.         if ((1 << i) & recsrc) {
  48.             if (n)
  49.                 fprintf(stderr, ", ");
  50.             fprintf(stderr, names[i]);
  51.             n = 1;
  52.         }
  53.     fprintf(stderr, "\n");
  54. }
  55.  
  56. int 
  57. main(int argc, char *argv[])
  58. {
  59.     int ctrl, mode, arg, mixerfd, dev, left, right;
  60.  
  61.     char name[30] = "/dev/mixer";
  62.  
  63.     if (!strcmp(argv[0], "mixer0"))
  64.        strcpy(name, "/dev/mixer0");
  65.     else
  66.       if (!strcmp(argv[0], "mixer1"))
  67.          strcpy(name, "/dev/mixer1");
  68.     else
  69.       if (!strcmp(argv[0], "mixer2"))
  70.          strcpy(name, "/dev/mixer2");
  71.     else
  72.       if (!strcmp(argv[0], "mixer3"))
  73.          strcpy(name, "/dev/mixer3");
  74.     else
  75.       if (!strcmp(argv[0], "mixer4"))
  76.          strcpy(name, "/dev/mixer4");
  77.     else
  78.       if (!strcmp(argv[0], "mixer5"))
  79.          strcpy(name, "/dev/mixer5");
  80.  
  81.     if ((mixerfd = open(name, O_RDWR)) < 0) {
  82.         perror(name);
  83.         exit(1);
  84.     }
  85.     if (ioctl(mixerfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
  86.         perror("SOUND_MIXER_READ_DEVMASK");
  87.         exit(-1);
  88.     }
  89.     if (ioctl(mixerfd, SOUND_MIXER_READ_RECMASK, &recmask) == -1) {
  90.         perror("SOUND_MIXER_READ_RECMASK");
  91.         exit(-1);
  92.     }
  93.     if (ioctl(mixerfd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) {
  94.         perror("SOUND_MIXER_READ_RECSRC");
  95.         exit(-1);
  96.     }
  97.  
  98.     switch (argc) {
  99.         case 3:
  100.             mode = 1;
  101.             break;
  102.         case 2:
  103.             mode = 0;
  104.             break;
  105.         default:
  106.             usage();
  107.     }
  108.  
  109.     for (ctrl = 0; ctrl < SOUND_MIXER_NRDEVICES && strcmp(names[ctrl], argv[1]); ctrl++);
  110.  
  111.      if ((ctrl >= SOUND_MIXER_NRDEVICES) || (!strcmp("?rec",argv[1]))) { 
  112.  
  113.         if (!strcmp("+rec", argv[1]) || !strcmp("-rec", argv[1])) {
  114.             for (dev = 0; dev < SOUND_MIXER_NRDEVICES && strcmp(names[dev], argv[2]); dev++);
  115.             if (dev >= SOUND_MIXER_NRDEVICES)
  116.                 usage();
  117.  
  118.             if (!((1 << dev) & recmask)) {
  119.                 fprintf(stderr, "Invalid recording source %s\n", argv[2]);
  120.                 exit(-1);
  121.             }
  122.             if (argv[1][0] == '+')
  123.                 recsrc |= (1 << dev);
  124.             else
  125.                 recsrc &= ~(1 << dev);
  126.  
  127.             if (ioctl(mixerfd, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) {
  128.                 perror("SOUND_MIXER_WRITE_RECSRC");
  129.                 exit(-1);
  130.             }
  131.             print_recsrc();
  132.         } else if(!strcmp("?rec",argv[1])) {
  133.             print_recsrc();
  134.         } else
  135.             usage();
  136.     } else {
  137.         if (mode) {
  138.             if (strchr(argv[2], ':') == NULL) {
  139.                 sscanf(argv[2], "%d", &left);
  140.                 right = left; /* Tandem setting */
  141.             } else 
  142.                 sscanf(argv[2], "%d:%d", &left, &right);
  143.     
  144.             if (left < 0)
  145.                 left = 0;
  146.             if (right < 0)
  147.                 right = 0;
  148.             if (left > 100)
  149.                 left = 100;
  150.             if (right > 100)
  151.                 right = 100;
  152.  
  153.  
  154.                         arg = left | (right << 8);
  155.             if (ioctl(mixerfd, MIXER_WRITE(ctrl), &arg) == -1)
  156.             {
  157.                if (errno == EINVAL)
  158.                   fprintf(stderr, "Invalid mixer control %s\n",
  159.                     names[ctrl]);
  160.                else
  161.                   perror("MIXER_WRITE");
  162.                exit(-1);
  163.             }
  164.             printf("Setting the mixer %s to %d:%d.\n", 
  165.                 names[ctrl], left, right);
  166.             exit (0);
  167.         } else {
  168.             if (ioctl(mixerfd, MIXER_READ(ctrl),&arg)== -1)
  169.             {
  170.                if (errno == EINVAL)
  171.                   fprintf(stderr, "Invalid mixer control %s\n",
  172.                     names[ctrl]);
  173.                else
  174.                   perror("MIXER_READ");
  175.                exit(-1);
  176.             }
  177.             printf("The mixer %s is currently set to %d:%d.\n", 
  178.                 names[ctrl], arg & 0xff, (arg >> 8) & 0xff);
  179.         }
  180.     }
  181.  
  182.     close(mixerfd);
  183. }
  184.