home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 4 Drivers / 04-Drivers.zip / SBOS2DEV.ZIP / test / setmixer.c < prev   
C/C++ Source or Header  |  1992-10-23  |  5KB  |  199 lines

  1. /* program to control mixer levels */
  2.  
  3. /* added by msf */
  4. #include <stdio.h>
  5. #include <getopt.h>
  6. #include <string.h>
  7. #include <os2.h>
  8. #include "sblast_user.h"
  9.  
  10. static struct sb_mixer_levels sblevels;
  11. HFILE mixer_handle;
  12.  
  13. /* vars for getopt */
  14. extern char * optarg;
  15. extern int  optind;
  16.  
  17.  
  18. static char USAGE[]={"\nSETMIXER - Set SB PRO mixer levels\n"\
  19. "Options:\n"\
  20. "  -m l,r       - set master volume [0-15]\n"\
  21. "  -v l,r       - set voice volume [0-15]\n"\
  22. "  -f l,r       - set FM volume [0-15]\n"\
  23. "  -c l,r       - set CD IN volume [0-15]\n"\
  24. "  -l l,r       - set LINE IN volume [0-15]\n"\
  25. "  -x l         - set MIC IN volume [0-7]\n"\
  26. "\n  -q           - run quietly (no output)\n"\
  27. "  -h -?        - this help message\n"\
  28. "\nNote: If you specify one number for the options requiring two, then\n"\
  29. "      both left and right channels will be set to that number.\n"};
  30.  
  31. /* parse argument in form "left,right" */
  32. int getlevels( char * sptr, BYTE * left, BYTE * right )
  33. {
  34.  
  35.   char * tptr;
  36.  
  37.  
  38.   /* see if there is a ',' in the argument */
  39.   if ((tptr=strstr(sptr,",")))
  40.     {
  41.       /* they specified a left,right combination */
  42.       *tptr = '\0';
  43.       *left = (BYTE) atoi(sptr);
  44.       *right = (BYTE) atoi(tptr+1);
  45.     }
  46.   else
  47.     *left = *right = (BYTE) atoi(sptr);
  48.  
  49.   return TRUE;
  50. }
  51.  
  52.  
  53.  
  54.  
  55. main(int argc, char **argv )
  56. {
  57.   BYTE   right, left, verbose;
  58.   USHORT status;
  59.   ULONG  datlen, parlen, action;
  60.   int    c;
  61.  
  62.   /* Strategy - read in current settings, parse commandline for changes
  63.    * to make, then make changes */
  64.   verbose=TRUE;
  65.  
  66.   /* open mixer */
  67.   status = DosOpen( "SBMIX$", &mixer_handle, &action, 0,
  68.            FILE_NORMAL, FILE_OPEN,
  69.    OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE | OPEN_FLAGS_WRITE_THROUGH,
  70.               NULL );
  71.  
  72.   if (status != 0)
  73.     {
  74.       printf("Error opening mixer device - be sure SBOS2.SYS is loaded.\n");
  75.       printf("This program will not work with a regular SB.\n");
  76.       exit (10);
  77.     }
  78.  
  79.   /* read current levels */
  80.   datlen=sizeof(struct sb_mixer_levels);
  81.   parlen=0;
  82.   status=DosDevIOCtl(mixer_handle, DSP_CAT, MIXER_IOCTL_READ_LEVELS,
  83.                     NULL, 0, &parlen,
  84.                     &sblevels, datlen, &datlen);
  85.   if (status != 0)
  86.     {
  87.       printf("Error reading mixer levels, exiting.\n");
  88.       exit (1);
  89.     }
  90.  
  91.   /* now parse commandline */
  92.   while ((c=getopt(argc, argv, "m:v:f:c:l:x:h?q"))!=EOF)
  93.     {
  94.       switch (c)
  95.     {
  96.     case 'm':
  97.     case 'M':
  98.       /* optarg should point at volume levels */
  99.       if (getlevels(optarg, &left, &right))
  100.         {
  101.           sblevels.master.l = left;
  102.           sblevels.master.r = right;
  103.         }
  104.       break;
  105.     case 'v':
  106.     case 'V':
  107.       /* optarg should point at volume levels */
  108.       if (getlevels(optarg, &left, &right))
  109.         {
  110.           sblevels.voc.l = left;
  111.           sblevels.voc.r = right;
  112.         }
  113.       break;
  114.     case 'f':
  115.     case 'F':
  116.       /* optarg should point at volume levels */
  117.       if (getlevels(optarg, &left, &right))
  118.         {
  119.           sblevels.fm.l = left;
  120.           sblevels.fm.r = right;
  121.         }
  122.       break;
  123.     case 'c':
  124.     case 'C':
  125.       /* optarg should point at volume levels */
  126.       if (getlevels(optarg, &left, &right))
  127.         {
  128.           sblevels.cd.l = left;
  129.           sblevels.cd.r = right;
  130.         }
  131.       break;
  132.     case 'x':
  133.     case 'X':
  134.       /* optarg should point at volume levels */
  135.       if (getlevels(optarg, &left, &right))
  136.         sblevels.mic = left;
  137.       break;
  138.     case 'q':
  139.     case 'Q':
  140.       verbose = FALSE;
  141.       break;
  142.  
  143.     case 'H':
  144.     case 'h':
  145.     case '?':
  146.       puts(USAGE);
  147.       exit(0);    
  148.       break;
  149.     default:
  150.       break;
  151.     }
  152.     }
  153.  
  154.  
  155.   /* see if there were any options */
  156.   if (optind==1)
  157.     {
  158.       puts(USAGE);
  159.       exit(0);
  160.     }
  161.  
  162.   /* now set mixer levels */
  163.   status=DosDevIOCtl(mixer_handle, DSP_CAT, MIXER_IOCTL_SET_LEVELS,
  164.                     NULL, 0, &parlen,
  165.                     &sblevels, datlen, &datlen);
  166.   if (status != 0)
  167.     {
  168.       printf("Error setting mixer levels, exiting\n");
  169.       exit (1);
  170.     }
  171.  
  172.  
  173.   /* read  in new settings */
  174.   datlen=sizeof(struct sb_mixer_levels);
  175.   parlen=0;
  176.   status=DosDevIOCtl(mixer_handle, DSP_CAT, MIXER_IOCTL_READ_LEVELS,
  177.                     NULL, 0, &parlen,
  178.                     &sblevels, datlen, &datlen);
  179.   if (status != 0)
  180.     {
  181.       printf("Error reading mixer levels, exiting.\n");
  182.       exit (1);
  183.     }
  184.  
  185.   /* output settings */
  186.   if (verbose)
  187.     {
  188.       printf("New settings:\n");
  189.       printf("MASTER:\t%d\t%d\n",sblevels.master.l,sblevels.master.r);
  190.       printf("VOICE :\t%d\t%d\n",sblevels.voc.l,sblevels.voc.r);
  191.       printf("FM    :\t%d\t%d\n",sblevels.fm.l,sblevels.fm.r);
  192.       printf("LINE  :\t%d\t%d\n",sblevels.line.l,sblevels.line.r);
  193.       printf("CD    :\t%d\t%d\n",sblevels.cd.l, sblevels.cd.r);
  194.       printf("MIC   :\t%d\n",sblevels.mic);
  195.     }
  196.  
  197. }
  198.  
  199.