Annotation of ntddk/src/mmedia/sndblst/driver/mvmix.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1992 Media Vision, Inc
                      4: 
                      5: Module Name:
                      6: 
                      7:     mvmix.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This module contains code for controlling the Media Vision Mixer
                     12:      hardware.  Media Vision has used only two software-controllable
                     13:      mixer chips so far.  The MV 508 is used on the PAS 16 only.  All
                     14:      other chips use the National part XXXX.  Programming the
                     15:      Nationial mixer chip is VOODOO BLACK MAGIC and will be very slow
                     16:      under NT.
                     17: 
                     18: Environment:
                     19: 
                     20:     Kernel mode
                     21: 
                     22: Revision History:
                     23: 
                     24:     27-Sep-1992
                     25:         Initial revision
                     26: 
                     27: --*/
                     28: 
                     29: #include <sound.h>
                     30: 
                     31: void SetEq(PFOUNDINFO pFI, USHORT P_output, USHORT P_EQtype,USHORT  P_level);
                     32: void SetEqMode(PFOUNDINFO pFI, USHORT P_loudness, USHORT P_enhance);
                     33: void NationalMix(PFOUNDINFO pFI, USHORT wData);
                     34: void NationalVolume(PFOUNDINFO pFI, USHORT wVolume,UCHAR wVolumeRegister);
                     35: ULONG Scale100ToFFFF(USHORT wVal);
                     36: BYTE ScaleFFFFTo100(USHORT wVal);
                     37: 
                     38: #ifdef ALLOC_PRAGMA
                     39: #pragma alloc_text(init,SetOutput)
                     40: #pragma alloc_text(init,SetFilter)
                     41: #endif
                     42: 
                     43: //
                     44: //-------------------------========================---------------------------
                     45: //------------------------====< DATA SECTION >====---------------------------
                     46: //-------------------------========================---------------------------
                     47: //
                     48: //
                     49: // These variables are DMA/Buffer control variables
                     50: //
                     51: 
                     52: //
                     53: // These variables mirror the hardware state
                     54: //
                     55: UCHAR audiomixr= SERIAL_MIX_CLOCK+SERIAL_MIX_DUALFM ;
                     56: UCHAR audiofilt;          //  B8A Audio Filter Control Register
                     57: 
                     58: //
                     59: // a linear table of filter values - from mute to high
                     60: //
                     61: UCHAR   FilterTable[]=
                     62:     {
                     63:     0x00,       //   000000b    mute - goes to PC speaker
                     64:     0x24,       //   100100b    20hz to  2.9khz
                     65:     0x39,       //   111001b    20hz to  5.9khz
                     66:     0x31,       //   110001b    20hz to  8.9khz
                     67:     0x29,       //   101001b    20hz to 11.9khz
                     68:     0x22,       //   100010b    20hz to 15.9khz
                     69:     0x21,       //   100001b    20hz to 17.8khz
                     70:     };
                     71: //
                     72: //Mixer settings (0 - 12)
                     73: //
                     74: UCHAR   mixersettings[]=
                     75:     {
                     76:     0x00,       // level 0
                     77:     0x20,       // level 1
                     78:     0x10,       // level 2
                     79:     0x08,       // level 3
                     80:     0x04,       // level 4
                     81:     0x02,       // level 5
                     82:     0x12,       // level 6
                     83:     0x2A,       // level 7
                     84:     0x16,       // level 8
                     85:     0x01,       // level 9
                     86:     0x29,       // level A
                     87:     0x1D,       // level B
                     88:     0x2F        // level C
                     89:     };
                     90: 
                     91: UCHAR   SampleFilterSetting=0;  // default setting based on sample rate
                     92: 
                     93: //
                     94: // Volume settings (0 - 12)
                     95: //
                     96: 
                     97: UCHAR volsettings[]=
                     98:     {
                     99:     0x00,       // level 0
                    100:     0x60,       // level 1
                    101:     0x50,       // level 2
                    102:     0x48,       // level 3
                    103:     0x44,       // level 4
                    104:     0x42,       // level 5
                    105:     0x52,       // level 6
                    106:     0x6A,       // level 7
                    107:     0x56,       // level 8
                    108:     0x41,       // level 9
                    109:     0x69,       // level A
                    110:     0x5D,       // level B
                    111:     0x6F        // level C
                    112:     };
                    113: 
                    114: //
                    115: // Xlat table   lookup= 0-31
                    116: //             result= 0-12
                    117: //
                    118: 
                    119: UCHAR Scale32To12[]=
                    120:     {
                    121:     0 , 1, 1, 2, 2, 3, 3, 3,    //  0- 7
                    122:     4 , 4, 4, 5, 5, 5, 6, 6,    //  8-15
                    123:     6 , 7, 7, 7, 8, 8, 8, 9,    // 16-23
                    124:     9 , 9,10,10,11,11,12,12     // 24-31
                    125:     };
                    126: 
                    127: 
                    128: UCHAR   Scale64To40[]=
                    129:     {
                    130:     0 , 1, 2, 3, 4, 5, 6, 7,   //  0- 7
                    131:     8 , 8, 9,10,10,11,12,12,   //  8-15
                    132:     13,14,14,15,16,16,17,18,   // 16-23
                    133:     18,19,20,20,21,22,22,23,   // 24-31
                    134:     24,24,25,26,26,27,28,28,   // 32-39
                    135:     29,29,30,30,31,31,32,32,   // 40-47
                    136:     32,33,33,34,34,35,35,35,   // 48-55
                    137:     36,36,37,37,38,38,39,40    // 56-63
                    138:     };
                    139: 
                    140: UCHAR   BassTreb32to13[]=
                    141:     {
                    142:     0 , 1, 1, 2, 2, 3, 3, 3,   //  0- 7
                    143:     4 , 4, 4, 5, 5, 5, 6, 6,   //  8-15
                    144:     6 , 7, 7, 7, 8, 8, 8, 9,   // 16-23
                    145:     9 , 9,10,10,11,11,12,12    // 24-31
                    146:     };
                    147: 
                    148: 
                    149:     /*\
                    150: ;---|*|-=< void SetInput (USHORT P_input_num, USHORT P_volume_lvl,USHORT P_channel,
                    151: ;---|*|            USHORT P_crossover,USHORT P_output_num )
                    152: ;---|*|
                    153: ;---|*|       Set the selected channel within the Input Mixer
                    154: ;---|*|
                    155: ;---|*| Entry Conditions:
                    156: ;---|*|       P_input_num   = Input  # (0-6 for serial mixer, 0-7 for 508)
                    157: ;---|*|       P_volume_lvl = volume level (0-FFFF)
                    158: ;---|*|       P_channel    = LEFT, RIGHT or BOTH
                    159: ;---|*|       P_crossover   = Crossover Info (required onlby for 508)
                    160: ;---|*|       P_output_num = Output #   (0-1 for either mixer)
                    161: ;---|*|
                    162: ;---|*| Exit Conditions:
                    163: ;---|*|       None
                    164: ;---|*|
                    165: ;   \*/
                    166: 
                    167: void
                    168: SetInput (PFOUNDINFO pFI, UCHAR P_input_num, USHORT P_volume_lvl,USHORT P_channel,
                    169:            USHORT P_crossover,UCHAR P_output_num )
                    170: {
                    171:     UCHAR   bTemp,bTemp1;
                    172: 
                    173:     P_volume_lvl>>=(16-5);              // convert 0-ffff to 0-31
                    174: 
                    175:     if (pFI->Caps.CapsBits.Mixer_508)
                    176:         {
                    177:         bTemp=(UCHAR) P_input_num;          // Channel #
                    178: 
                    179:         bTemp|=(P_channel<<5);              // get left/right
                    180:         bTemp|=MV_508_ADDRESS;              // 508 ADDRESS BIT
                    181:         bTemp|=MV_508_INPUT;                // 508 INPUT BIT
                    182: 
                    183:         dprintf4(("Input Mixer 508 Address   : %04x", bTemp));
                    184:         PASX_OUT(pFI, MIXER_508_REG, bTemp);
                    185: 
                    186:         bTemp=P_volume_lvl;     // get volume level reduced to (0-31 range)
                    187: 
                    188:         bTemp1=P_crossover;     // get CROSSOVER
                    189: 
                    190:         if (bTemp1==MIXCROSSCAPS_NORMAL_STEREO)
                    191:             {
                    192:             }
                    193:         else
                    194:             if (bTemp1 & MIXCROSSCAPS_REVERSE_STEREO)
                    195:                 {
                    196:                 bTemp |= MV_508_SWAP;       // this channel's swapped
                    197:                 }
                    198:             else
                    199:                 {
                    200:                 if (P_channel==_LEFT)
                    201:                     {
                    202:                     if (bTemp1 & MIXCROSSCAPS_LEFT_TO_RIGHT)
                    203:                         bTemp |= MV_508_SWAP;       // this channel's swapped
                    204:                     }
                    205:                 else
                    206:                     {
                    207:                     if (bTemp1 & MIXCROSSCAPS_LEFT_TO_RIGHT)
                    208:                         bTemp |= MV_508_SWAP;       // this channel's swapped
                    209:                     }
                    210:                 }
                    211: 
                    212:         bTemp|=((P_output_num & 1 )<<5);            // select output number
                    213:         dprintf4(("Input Mixer 508 Data   : %04x", bTemp));
                    214:         PASX_OUT(pFI, MIXER_508_REG,bTemp);
                    215: 
                    216:         }
                    217:     else    // National (serially programmed) mixer
                    218:         {
                    219:         dprintf2(("-----------Using Serial Mixer!"));
                    220:         //
                    221:         // send out the mixer channel #
                    222:         //
                    223: 
                    224:         bTemp=P_input_num;                      // Channel #
                    225:         bTemp++;                                // channel 0 was XXX
                    226: 
                    227:         if (P_channel==_RIGHT)
                    228:             bTemp+=7;    // this magic number is the offset to right channel
                    229: 
                    230:         bTemp|=NATIONAL_COMMAND;
                    231:         NationalMix(pFI, bTemp);
                    232: 
                    233:         // select the correct mixer
                    234:         bTemp1=P_output_num<<6;                 // get output number
                    235: 
                    236:         //
                    237:         // send out the mixer data
                    238:         //
                    239: 
                    240:         bTemp=P_volume_lvl &= 0x1F;                 // limit to 31
                    241:         bTemp=Scale32To12[bTemp];
                    242:         bTemp=mixersettings[bTemp];
                    243: 
                    244:         NationalMix(pFI, bTemp);
                    245:         }
                    246: }
                    247: 
                    248:     /*\
                    249: ;---|*|--------====< void SetOutput (line, level, channel ) >====--------
                    250: ;---|*|
                    251: ;---|*|       This routine outputs a new setting for a volume channel.
                    252: ;---|*|
                    253: ;---|*| Entry Conditions:
                    254: ;---|*|       WParm1 is a value from 0 - 1
                    255: ;---|*|       WParm2 is a value to be written to the control (0-63)
                    256: ;---|*|       WParm3 signifies left or right
                    257: ;---|*|
                    258: ;---|*| Exit Conditions:
                    259: ;---|*|       None
                    260: ;---|*|
                    261: ;   \*/
                    262: void
                    263: SetOutput (PFOUNDINFO pFI, UCHAR P_output_num,USHORT P_volume_lvl,USHORT P_channel )
                    264: {
                    265:     UCHAR   bTemp,bTemp1;
                    266: 
                    267:     dprintf2(("SetOutput Entered"));
                    268:     P_volume_lvl>>=(16-6);              // convert 0-ffff to 0-63
                    269: 
                    270:     if (pFI->Caps.CapsBits.Mixer_508)
                    271:         {
                    272:         //EnterCrit             /// don't interrupt me!
                    273: 
                    274:         // investigate keSynchronizeExecution
                    275: 
                    276:         bTemp=(UCHAR) P_output_num;
                    277:         bTemp++;                // Output number need to be 1 based
                    278: 
                    279:         bTemp|=(P_channel<<5);  // get left/right
                    280:         bTemp|=MV_508_ADDRESS;
                    281: 
                    282:         dprintf4(("Output Mixer 508 Address   : %04x", bTemp));
                    283:         PASX_OUT(pFI, MIXER_508_REG,bTemp);
                    284: 
                    285: #if 0
                    286:         if (fMuting)
                    287:             {
                    288:             bTemp=0;
                    289:             }
                    290:         else
                    291: #endif
                    292:             {
                    293:             bTemp=P_volume_lvl;     // get volume level (0-63 range)
                    294: 
                    295:             if (P_output_num!=OUT_AMPLIFIER)
                    296:                 bTemp>>=2;          // output B of MV508 has 0-15 range
                    297:             }
                    298:         dprintf4(("  Mixer 508 Data   : %04x", bTemp));
                    299:         PASX_OUT(pFI, MIXER_508_REG,bTemp);
                    300:         }
                    301:     else    // NATIONAL (SERIAL PROGRAMMED) MIXER
                    302:         {
                    303:         dprintf2(("Using Serial Mixer!"));
                    304:         if (P_output_num==0)    // serial device has volume on output 0 only
                    305:             {
                    306: #if 0
                    307:             if (fMuting)
                    308:                 {
                    309:                 bTemp=0;
                    310:                 }
                    311:             else
                    312: #endif
                    313:                 {
                    314:                 bTemp=Scale64To40[P_volume_lvl];
                    315:                 }
                    316:             NationalVolume(pFI, (USHORT)bTemp,(UCHAR)((P_channel&1)+NATIONAL_LEFT_VOL_REG)); // see Pas-1 spec p.15 (LEFT VOLUME CONTROL)
                    317:             }
                    318:         }
                    319: 
                    320: }
                    321: 
                    322:     /*\
                    323: ;---|*|--------====< void SetEQ (line, EQ, level ) >====--------
                    324: ;---|*|
                    325: ;---|*|       This routine outputs a new setting for a volume channel.
                    326: ;---|*|
                    327: ;---|*| Entry Conditions:
                    328: ;---|*|       WParm1 is line number (range 0 - 1; 1 is don't care)
                    329: ;---|*|       WParm2 is EQ type (ie. Loudness, Stereo Enhance, BMT)
                    330: ;---|*|       WParm3 is level (range 0-31)
                    331: ;---|*|
                    332: ;---|*| Exit Conditions:
                    333: ;---|*|       None
                    334: ;---|*|
                    335: ;   \*/
                    336: 
                    337: void
                    338: SetEq(PFOUNDINFO pFI, USHORT P_output, USHORT P_EQtype,USHORT  P_level)
                    339: {
                    340:     UCHAR bTemp;
                    341: 
                    342:     if (P_output!=0)
                    343:         return;
                    344: 
                    345:     if (pFI->Caps.CapsBits.Mixer_508)
                    346:         {
                    347:         switch (P_EQtype)
                    348:             {
                    349:             case _BASS:
                    350:                 PASX_OUT(pFI, MIXER_508_REG,MV_508_ADDRESS + MV_508_BASS);
                    351:                 PASX_OUT(pFI, MIXER_508_REG, BassTreb32to13[P_level]);
                    352:                 break;
                    353: 
                    354:             case _TREBLE:
                    355:                 PASX_OUT(pFI, MIXER_508_REG,MV_508_ADDRESS + MV_508_TREBLE);
                    356:                 PASX_OUT(pFI, MIXER_508_REG, BassTreb32to13[P_level]);
                    357:                 break;
                    358:             }
                    359:         }
                    360:     else    // NATIONAL (SERIAL PROGRAMMED) MIXER
                    361:         {
                    362:         bTemp=Scale32To12[P_level];
                    363:         NationalVolume(pFI, (USHORT)bTemp,(UCHAR)((P_EQtype&1)+NATIONAL_BASS_REG) );  // see Pas-1 spec p.15 (LEFT VOLUME CONTROL)
                    364:         }
                    365: }
                    366: 
                    367: 
                    368:     /*\
                    369: ;---|*|--------====< void SetEqMode (Loudness, Enhance ) >====--------
                    370: ;---|*|
                    371: ;---|*|       This routine sets loundess and stereo enhance modes
                    372: ;---|*|
                    373: ;---|*| Entry Conditions:
                    374: ;---|*|       loudness  (Z vs NZ)
                    375: ;---|*|       Stereo Enhance (range 0-3)
                    376: ;---|*|
                    377: ;---|*| Exit Conditions:
                    378: ;---|*|       None
                    379: ;---|*|
                    380: ;   \*/
                    381: 
                    382: void
                    383: SetEqMode(PFOUNDINFO pFI, USHORT P_loudness, USHORT P_enhance)
                    384: {
                    385:     UCHAR   bTemp=0;
                    386: 
                    387:     if (pFI->Caps.CapsBits.Mixer_508)
                    388:         {
                    389:         PASX_OUT(pFI, MIXER_508_REG,MV_508_ADDRESS + MV_508_EQMODE);
                    390:         if (P_loudness)
                    391:             bTemp+=MV_508_LOUDNESS;
                    392: 
                    393:         bTemp+=P_enhance & MV_508_ENHANCE;
                    394:         PASX_OUT(pFI, MIXER_508_REG,bTemp);
                    395:         }
                    396:     else
                    397:         {
                    398:         if (P_loudness)
                    399:             bTemp=NATIONAL_LOUDNESS;        // Loudness bit
                    400: 
                    401:         if (P_enhance)
                    402:         bTemp|=NATIONAL_ENHANCE;        // stereo enhance bit
                    403: 
                    404:         NationalVolume(pFI, bTemp,NATIONAL_LOUD_ENH_REG);    // see Pas-1 spec p.15 (LEFT VOLUME CONTROL)
                    405:         }
                    406: }
                    407: 
                    408:  /* ----------------------====< NationalMix >====-------------------------- */
                    409:     /*\                                                                         |
                    410: ;---|*| NationalMix -- Load The National Mixer                                  |
                    411: ;---|*|                                                                         |
                    412: ;---|*| Entry Conditions                                                            |
                    413: ;---|*| wData = index/data                                                          |
                    414: ;---|*|                                                                         |
                    415: ;   \*/
                    416: void
                    417: NationalMix(PFOUNDINFO pFI, USHORT wData)
                    418: {
                    419:     USHORT  i,bTemp=0;
                    420: 
                    421:     //  EnterCrit
                    422: 
                    423:     bTemp = audiomixr;                           // get current hardware state
                    424:     // bTemp &= SERIAL_MIX_REALSOUND+SERIAL_MIX_DUALFM;  // save state of only these bits
                    425:     bTemp|=~(SERIAL_MIX_REALSOUND+SERIAL_MIX_DUALFM); // turn on all other bits
                    426:                                                       // all clocks and strobes should be 1
                    427:     PASX_OUT(pFI, SERIAL_MIXER,bTemp);
                    428:     KeStallExecutionProcessor(5);       // wait 5 us
                    429: 
                    430:     for (i=0; i<8; i++) {
                    431: 
                    432:         // output clock is 0
                    433:         PASX_OUT(pFI, SERIAL_MIXER,bTemp & (~SERIAL_MIX_CLOCK));
                    434:         KeStallExecutionProcessor(5);       // wait 5 us
                    435: 
                    436:         PASX_OUT(pFI, SERIAL_MIXER,(wData>>i)& 1);   //send data, clock is 0
                    437:         KeStallExecutionProcessor(5);       // wait 5 us
                    438: 
                    439:         PASX_OUT(pFI, SERIAL_MIXER,
                    440:             ((wData>>i)& 1)^SERIAL_MIX_CLOCK);  //send data, clock is 1
                    441:         KeStallExecutionProcessor(5);       // wait 5 us
                    442:     }
                    443: 
                    444:     PASX_OUT(pFI, SERIAL_MIXER,
                    445:         ((wData>>i)& 1)|SERIAL_MIX_CLOCK|SERIAL_MIX_STROBE); //strobe it in
                    446:     KeStallExecutionProcessor(5);       // wait 5 us
                    447: 
                    448:     PASX_OUT(pFI, SERIAL_MIXER,bTemp);
                    449:     audiomixr=bTemp;                   // save the last state
                    450:     KeStallExecutionProcessor(5);       // wait 5 us
                    451: 
                    452: }
                    453:  /* ---;--------------------====< NationalVolume >====------------------------------- */
                    454:     /*\;
                    455: ;---|*|; NationalVolume -- Load Volume control Register
                    456: ;---|*|;
                    457: ;---|*|; Entry Conditions:
                    458: ;---|*|;    bl = parameter register (volume control channel 0-7)
                    459: ;---|*|;    ah = data to transfer   (new channel setting)
                    460: ;   \*/
                    461: 
                    462: void
                    463: NationalVolume(PFOUNDINFO pFI, USHORT wVolume, UCHAR wLeftRight)
                    464: {
                    465: //
                    466: // pass everything, but left/right volume directly to the device
                    467: //
                    468: // left & right volume are presented
                    469: // to the logical level as 0 - 40,
                    470: // where 0 is the lowest, and 40 is
                    471: // the highest. In reality, this
                    472: // is backwards, that is, 40 is the
                    473: // lowest, and 0 is the highest. We will
                    474: // correct the value here...
                    475: 
                    476:     USHORT  bTemp,i;
                    477:     short   sVolume=wVolume;
                    478: 
                    479: // Perform the volume control output
                    480: 
                    481: if (( wLeftRight==NATIONAL_LEFT_VOL_REG) ||
                    482:      (wLeftRight==NATIONAL_RIGHT_VOL_REG ))
                    483:     {
                    484:     sVolume -=0x40;     // is backwards, that is, 40 is the
                    485:     sVolume = -sVolume; // lowest, and 0 is the highest. We will
                    486:                         // correct the value here...
                    487:     }
                    488: //
                    489: // all 1s but volume enable and clock
                    490: //
                    491:     bTemp=audiomixr;           // save the realsound & dual fm bits
                    492:     bTemp &= SERIAL_MIX_REALSOUND+SERIAL_MIX_DUALFM;
                    493:     bTemp |= ~ (SERIAL_MIX_REALSOUND+SERIAL_MIX_DUALFM+SERIAL_MIX_MASTER+SERIAL_MIX_CLOCK);
                    494: 
                    495:     // EnterCrit
                    496:     PASX_OUT(pFI, SERIAL_MIXER,bTemp);       // note: clock is off
                    497: 
                    498:     for (i=0; i<8; i++) {
                    499: 
                    500:         bTemp=(wLeftRight>>i)& 1;
                    501:         PASX_OUT(pFI, SERIAL_MIXER,(bTemp | SERIAL_MIX_CLOCK)); // clock's on
                    502:         KeStallExecutionProcessor(5);       // wait 5 us
                    503: 
                    504:         PASX_OUT(pFI, SERIAL_MIXER,(bTemp));                       // clock's off
                    505:         KeStallExecutionProcessor(5);       // wait 5 us
                    506:     }
                    507: 
                    508:     // write with volume control enable
                    509:     // which starts data loading
                    510:     PASX_OUT(pFI, SERIAL_MIXER,bTemp|SERIAL_MIX_MASTER);
                    511:     KeStallExecutionProcessor(6);       // wait 6 us
                    512: 
                    513:     for (i=0; i<8; i++) {
                    514: 
                    515:         bTemp=bTemp & (~D0);            // mask off D0
                    516:         bTemp |= ((sVolume>>i) & D0);       // move current bit into D0
                    517: 
                    518:         PASX_OUT(pFI, SERIAL_MIXER,bTemp+SERIAL_MIX_CLOCK);
                    519:         KeStallExecutionProcessor(6);       // wait 6 us
                    520: 
                    521:         PASX_OUT(pFI, SERIAL_MIXER,bTemp);
                    522:         KeStallExecutionProcessor(6);       // wait 5 us
                    523:     }
                    524: 
                    525:     for (i=0; i<12; i++) {
                    526: 
                    527:         PASX_OUT(pFI, SERIAL_MIXER,bTemp);
                    528:         KeStallExecutionProcessor(6);       // wait 6 us
                    529:     }
                    530: 
                    531:     // toggle volume control enable
                    532: 
                    533:     PASX_OUT(pFI, SERIAL_MIXER,bTemp|SERIAL_MIX_MASTER);
                    534:     KeStallExecutionProcessor(6);       // wait 6 us
                    535: 
                    536:     PASX_OUT(pFI, SERIAL_MIXER,bTemp|SERIAL_MIX_MASTER);
                    537:     KeStallExecutionProcessor(6);       // wait 6 us
                    538: 
                    539:     PASX_OUT(pFI, SERIAL_MIXER,bTemp|SERIAL_MIX_MASTER);
                    540:     KeStallExecutionProcessor(6);       // wait 6 us
                    541: 
                    542:     PASX_OUT(pFI, SERIAL_MIXER,bTemp);
                    543:     KeStallExecutionProcessor(6);       // wait 6 us
                    544: 
                    545:     audiomixr=bTemp;               // save the last state
                    546: }
                    547: 
                    548:     /*\
                    549: ;---|*|--------------====< void SetFilter (int setting ) >===---------------
                    550: ;---|*|
                    551: ;---|*|       This routine selects a filter setting from mute to high freq filter.
                    552: ;---|*|
                    553: ;---|*| Entry Conditions:
                    554: ;---|*|       WParm1 is a value from 0 - 6
                    555: ;---|*|
                    556: ;---|*| Exit Conditions:
                    557: ;---|*|       None
                    558: ;---|*|
                    559: ;---|*|
                    560: ;   \*/
                    561: 
                    562: void
                    563: SetFilter(PFOUNDINFO pFI, USHORT wSetting)
                    564: {
                    565:     USHORT wTemp;
                    566: 
                    567:     if (wSetting <= FILTERMAX) {
                    568: 
                    569:         wSetting=FilterTable[wSetting];
                    570: 
                    571:         wTemp = audiofilt;                     // get current bits
                    572:         wTemp &= ~(fFIdatabits+fFImutebits);   // save everthing but
                    573: 
                    574:         wSetting|=wTemp;
                    575: 
                    576:         //  EnterCrit
                    577:         PASX_OUT(pFI, FILTER_REGISTER, wSetting);
                    578:         KeStallExecutionProcessor(6);           // wait 6 us
                    579: 
                    580:         audiofilt=wSetting;                    // set current bits
                    581:     }
                    582: 
                    583: }
                    584: #if 0
                    585: ULONG
                    586: Scale100ToFFFF(WORD wVal)
                    587: {
                    588:     ULONG dwScaled;
                    589: 
                    590:     dwScaled=((ULONG)wVal) * (0xFFFFL/100L);
                    591:     dwScaled=(dwScaled & 0xff00L)+ (dwScaled >>8);
                    592: 
                    593:     return(dwScaled);
                    594: }
                    595: 
                    596: UCHAR
                    597: ScaleFFFFTo100(WORD wVal)
                    598: {
                    599:     UCHAR bScaled;
                    600: 
                    601:     bScaled=((wVal>>8)*100)/255;
                    602: 
                    603:     return(bScaled);
                    604: }
                    605: #endif
                    606: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.