Annotation of Examples/DriverKit/ProAudioSpectrum16/ProAudioSpectrum16_reloc.tproj/ProAudioSpectrum16Inline.h, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Copyright (c) 1993 NeXT Computer, Inc.  All rights reserved. 
        !             3:  */
        !             4:  
        !             5: #import "ProAudioSpectrum16Registers.h"
        !             6: #import <driverkit/i386/ioPorts.h>
        !             7: #import <driverkit/generalFuncs.h>
        !             8: 
        !             9: static inline
        !            10: void
        !            11: setBaseAddress(unsigned int baseAddress)
        !            12: {
        !            13:     /*
        !            14:      * To relocate the I/O addresses, two 8-bit values are written to the
        !            15:      * Master Address Pointer (0x9a01):
        !            16:      * (1) board ID value (valid settings are 0xbc-0xbf)
        !            17:      * (2) base address shifted right by two positions
        !            18:      */
        !            19:     outb(MASTER_ADDRESS_POINTER, FIRST_BOARD_ID);
        !            20:     outb(MASTER_ADDRESS_POINTER, (baseAddress) >> 2);
        !            21: }
        !            22: 
        !            23: static inline
        !            24: filterControl_t
        !            25: getFilterControl()
        !            26: {
        !            27:     union {
        !            28:        filterControl_t reg;
        !            29:        unsigned char   data;
        !            30:     } filterControl;
        !            31:     
        !            32:     filterControl.data = inb(FILTER_CONTROL);
        !            33:     
        !            34:     return (filterControl.reg);
        !            35: }
        !            36:  
        !            37: static inline
        !            38: void
        !            39: setFilterControl(filterControl_t reg)
        !            40: {
        !            41:     union {
        !            42:        filterControl_t reg;
        !            43:        unsigned char   data;
        !            44:     } filterControl;
        !            45:     
        !            46:     filterControl.reg = reg;
        !            47:     
        !            48:     outb(FILTER_CONTROL, filterControl.data);
        !            49: }
        !            50: 
        !            51: static inline
        !            52: void
        !            53: enableAudioOutput(boolean_t enable)
        !            54: {
        !            55:     filterControl_t    filterControl   = {0};
        !            56:     
        !            57:     filterControl = getFilterControl();
        !            58:     filterControl.enableAudioOutput = enable;
        !            59:     setFilterControl(filterControl);
        !            60: }
        !            61: 
        !            62: static inline
        !            63: interruptControl_t
        !            64: getInterruptControl()
        !            65: {
        !            66:     union {
        !            67:        interruptControl_t      reg;
        !            68:        unsigned char           data;
        !            69:     } interruptControl;
        !            70:     
        !            71:     interruptControl.data = inb(INTERRUPT_CONTROL);
        !            72:     
        !            73:     return (interruptControl.reg);
        !            74: }
        !            75:  
        !            76: static inline
        !            77: void
        !            78: setInterruptControl(interruptControl_t reg)
        !            79: {
        !            80:     union {
        !            81:        interruptControl_t      reg;
        !            82:        unsigned char           data;
        !            83:     } interruptControl;
        !            84:     
        !            85:     interruptControl.reg = reg;
        !            86:     
        !            87:     outb(INTERRUPT_CONTROL, interruptControl.data);
        !            88: }
        !            89: 
        !            90: static inline
        !            91: interruptStatus_t
        !            92: getInterruptStatus()
        !            93: {
        !            94:     union {
        !            95:        interruptStatus_t       reg;
        !            96:        unsigned char           data;
        !            97:     } interruptStatus;
        !            98:     
        !            99:     interruptStatus.data = inb(INTERRUPT_STATUS);
        !           100:     
        !           101:     return (interruptStatus.reg);
        !           102: }
        !           103:  
        !           104: static inline
        !           105: void
        !           106: setInterruptStatus(interruptStatus_t reg)
        !           107: {
        !           108:     union {
        !           109:        interruptStatus_t       reg;
        !           110:        unsigned char           data;
        !           111:     } interruptStatus;
        !           112:     
        !           113:     interruptStatus.reg = reg;
        !           114:     
        !           115:     outb(INTERRUPT_STATUS, interruptStatus.data);
        !           116: }
        !           117: 
        !           118: static inline
        !           119: crossChannelControl_t
        !           120: getCrossChannelControl()
        !           121: {
        !           122:     union {
        !           123:        crossChannelControl_t   reg;
        !           124:        unsigned char           data;
        !           125:     } crossChannelControl;
        !           126:     
        !           127:     crossChannelControl.data = inb(CROSS_CHANNEL_CONTROL);
        !           128:     
        !           129:     return (crossChannelControl.reg);
        !           130: }
        !           131:  
        !           132: static inline
        !           133: void
        !           134: setCrossChannelControl(crossChannelControl_t reg)
        !           135: {
        !           136:     union {
        !           137:        crossChannelControl_t   reg;
        !           138:        unsigned char           data;
        !           139:     } crossChannelControl;
        !           140:     
        !           141:     crossChannelControl.reg = reg;
        !           142:     
        !           143:     outb(CROSS_CHANNEL_CONTROL, crossChannelControl.data);
        !           144: }
        !           145: 
        !           146: static inline
        !           147: sampleCounterControl_t
        !           148: getSampleCounterControl()
        !           149: {
        !           150:     union {
        !           151:        sampleCounterControl_t  reg;
        !           152:        unsigned char           data;
        !           153:     } sampleCounterControl;
        !           154:     
        !           155:     sampleCounterControl.data = inb(SAMPLE_COUNTER_CONTROL);
        !           156:     
        !           157:     return (sampleCounterControl.reg);
        !           158: }
        !           159:  
        !           160: static inline
        !           161: void
        !           162: setSampleCounterControl(sampleCounterControl_t reg)
        !           163: {
        !           164:     union {
        !           165:        sampleCounterControl_t  reg;
        !           166:        unsigned char           data;
        !           167:     } sampleCounterControl;
        !           168:     
        !           169:     sampleCounterControl.reg = reg;
        !           170:     
        !           171:     outb(SAMPLE_COUNTER_CONTROL, sampleCounterControl.data);
        !           172: }
        !           173: 
        !           174: static inline
        !           175: systemConfiguration1_t
        !           176: getSystemConfiguration1()
        !           177: {
        !           178:     union {
        !           179:        systemConfiguration1_t  reg;
        !           180:        unsigned char           data;
        !           181:     } systemConfiguration1;
        !           182:     
        !           183:     systemConfiguration1.data = inb(SYSTEM_CONFIGURATION_1);
        !           184:     
        !           185:     return (systemConfiguration1.reg);
        !           186: }
        !           187:  
        !           188: static inline
        !           189: void
        !           190: setSystemConfiguration1(systemConfiguration1_t reg)
        !           191: {
        !           192:     union {
        !           193:        systemConfiguration1_t  reg;
        !           194:        unsigned char           data;
        !           195:     } systemConfiguration1;
        !           196:     
        !           197:     systemConfiguration1.reg = reg;
        !           198:     
        !           199:     outb(SYSTEM_CONFIGURATION_1, systemConfiguration1.data);
        !           200: }
        !           201: 
        !           202: static inline
        !           203: systemConfiguration2_t
        !           204: getSystemConfiguration2()
        !           205: {
        !           206:     union {
        !           207:        systemConfiguration2_t  reg;
        !           208:        unsigned char                   data;
        !           209:     } systemConfiguration2;
        !           210:     
        !           211:     systemConfiguration2.data = inb(SYSTEM_CONFIGURATION_2);
        !           212:     
        !           213:     return (systemConfiguration2.reg);
        !           214: }
        !           215:  
        !           216: static inline
        !           217: void
        !           218: setSystemConfiguration2(systemConfiguration2_t reg)
        !           219: {
        !           220:     union {
        !           221:        systemConfiguration2_t  reg;
        !           222:        unsigned char                   data;
        !           223:     } systemConfiguration2;
        !           224:     
        !           225:     systemConfiguration2.reg = reg;
        !           226:     
        !           227:     outb(SYSTEM_CONFIGURATION_2, systemConfiguration2.data);
        !           228: }
        !           229: 
        !           230: static inline
        !           231: DMAChannelConfiguration_t
        !           232: getDMAChannelConfiguration()
        !           233: {
        !           234:     union {
        !           235:        DMAChannelConfiguration_t       reg;
        !           236:        unsigned char                   data;
        !           237:     } DMAChannelConfiguration;
        !           238:     
        !           239:     DMAChannelConfiguration.data = inb(DMA_CHANNEL_CONFIGURATION);
        !           240:     
        !           241:     return (DMAChannelConfiguration.reg);
        !           242: }
        !           243:  
        !           244: static inline
        !           245: void
        !           246: setDMAChannelConfiguration(DMAChannelConfiguration_t reg)
        !           247: {
        !           248:     union {
        !           249:        DMAChannelConfiguration_t       reg;
        !           250:        unsigned char                   data;
        !           251:     } DMAChannelConfiguration;
        !           252:     
        !           253:     DMAChannelConfiguration.reg = reg;
        !           254:     
        !           255:     outb(DMA_CHANNEL_CONFIGURATION, DMAChannelConfiguration.data);
        !           256: }
        !           257: 
        !           258: static inline
        !           259: boolean_t
        !           260: setDMAChannel(int channel)
        !           261: {
        !           262:    static DMAChannelConfiguration_t    DMAChannelConfiguration = {0};
        !           263:    static const unsigned char DMAMap[] =       {
        !           264:                                        DMA_CHANNEL_0,
        !           265:                                         DMA_CHANNEL_1,
        !           266:                                         DMA_CHANNEL_2,
        !           267:                                         DMA_CHANNEL_3,
        !           268:                                         DMA_CHANNEL_NONE,
        !           269:                                         DMA_CHANNEL_5,
        !           270:                                         DMA_CHANNEL_6,
        !           271:                                         DMA_CHANNEL_7,
        !           272:                                        };
        !           273: 
        !           274:     if (DMAMap[channel] == DMA_CHANNEL_NONE)
        !           275:         return FALSE;
        !           276:        
        !           277:     DMAChannelConfiguration.channel = DMAMap[channel];
        !           278:     setDMAChannelConfiguration(DMAChannelConfiguration);
        !           279:     return TRUE;
        !           280:    
        !           281: }
        !           282: 
        !           283: static inline
        !           284: IRQConfiguration_t
        !           285: getIRQConfiguration()
        !           286: {
        !           287:     union {
        !           288:        IRQConfiguration_t      reg;
        !           289:        unsigned char           data;
        !           290:     } IRQConfiguration;
        !           291:     
        !           292:     IRQConfiguration.data = inb(IRQ_CONFIGURATION);
        !           293:     
        !           294:     return (IRQConfiguration.reg);
        !           295: }
        !           296:  
        !           297: static inline
        !           298: void
        !           299: setIRQConfiguration(IRQConfiguration_t reg)
        !           300: {
        !           301:     union {
        !           302:        IRQConfiguration_t      reg;
        !           303:        unsigned char           data;
        !           304:     } IRQConfiguration;
        !           305:     
        !           306:     IRQConfiguration.reg = reg;
        !           307:     
        !           308:     outb(IRQ_CONFIGURATION, IRQConfiguration.data);
        !           309: }
        !           310: 
        !           311: static inline
        !           312: boolean_t
        !           313: setInterrupt(int interrupt)
        !           314: {
        !           315: 
        !           316:    static IRQConfiguration_t   IRQConfiguration = {0};
        !           317:    static const unsigned char IRQMap[] =       {
        !           318:                                        INTERRUPT_NONE,
        !           319:                                         INTERRUPT_NONE,
        !           320:                                         INTERRUPT_2,
        !           321:                                         INTERRUPT_3,
        !           322:                                         INTERRUPT_4,
        !           323:                                         INTERRUPT_5,
        !           324:                                         INTERRUPT_6,
        !           325:                                         INTERRUPT_7,
        !           326:                                         INTERRUPT_NONE,
        !           327:                                         INTERRUPT_NONE,
        !           328:                                         INTERRUPT_10,
        !           329:                                         INTERRUPT_11,
        !           330:                                         INTERRUPT_12,
        !           331:                                         INTERRUPT_NONE,
        !           332:                                         INTERRUPT_14,
        !           333:                                         INTERRUPT_15
        !           334:                                        };
        !           335: 
        !           336:     if (IRQMap[interrupt] == INTERRUPT_NONE)
        !           337:         return FALSE;
        !           338:        
        !           339:     IRQConfiguration.interrupt = IRQMap[interrupt];
        !           340:     setIRQConfiguration(IRQConfiguration);
        !           341:     return TRUE;
        !           342: }
        !           343: 
        !           344: 
        !           345: static inline
        !           346: void
        !           347: setMasterOutputAttenuation(u_int channel, masterAttenuation_t attenuation)
        !           348: {
        !           349:     union {
        !           350:         channelSelection_t     reg;
        !           351:        unsigned char           data;
        !           352:     } channelSelection;
        !           353:     
        !           354:     // avoid a warning
        !           355:     channelSelection.data = 0;
        !           356:     
        !           357:     // select the master A mixer
        !           358:     channelSelection.reg.selectAddress = MIXER_A_MASTER;
        !           359:     channelSelection.reg.selectChannel = channel;
        !           360:     channelSelection.reg.isTransfer = TRUE;
        !           361: 
        !           362:     outb(MIXER_CONTROL, channelSelection.data);
        !           363:     
        !           364:     // set the attenuation
        !           365:     outb(MIXER_CONTROL, (char)attenuation);
        !           366: }
        !           367: 
        !           368: static inline
        !           369: void
        !           370: setOutputAttenuation(u_int address, u_int channel, u_int attenuation)
        !           371: {
        !           372: 
        !           373:     union {
        !           374:         channelSelection_t     reg;
        !           375:        unsigned char           data;
        !           376:     } channelSelection;
        !           377: 
        !           378:     union {
        !           379:         channelAttenuation_t   reg;
        !           380:        unsigned char           data;
        !           381:     } channelAttenuation;
        !           382:     
        !           383:     // avoid a warning
        !           384:     channelSelection.data = 0;
        !           385:     channelAttenuation.data = 0;
        !           386:     
        !           387:     channelSelection.reg.selectAddress = address;
        !           388:     channelSelection.reg.selectChannel = channel;
        !           389:     channelSelection.reg.isTransfer = TRUE;
        !           390:     outb(MIXER_CONTROL, channelSelection.data);
        !           391:     
        !           392:     channelAttenuation.reg.attenuation = attenuation;
        !           393:     channelAttenuation.reg.routeChannel = MIXER_A_ROUTE;
        !           394:     channelAttenuation.reg.swapChannels = NORMAL_STEREO;
        !           395:     outb(MIXER_CONTROL, channelAttenuation.data);
        !           396:  }
        !           397: 
        !           398: static inline
        !           399: void
        !           400: setMasterInputAttenuation(u_int channel, masterAttenuation_t attenuation)
        !           401: {
        !           402:     union {
        !           403:         channelSelection_t     reg;
        !           404:        unsigned char           data;
        !           405:     } channelSelection;
        !           406:     
        !           407:     // avoid a warning
        !           408:     channelSelection.data = 0;
        !           409:     
        !           410:     // select the master B mixer
        !           411:     channelSelection.reg.selectAddress = MIXER_B_MASTER;
        !           412:     channelSelection.reg.selectChannel = channel;
        !           413:     channelSelection.reg.isTransfer = TRUE;
        !           414:     outb(MIXER_CONTROL, channelSelection.data);
        !           415:     
        !           416:     // set the attenuation
        !           417:     outb(MIXER_CONTROL, (char)attenuation);
        !           418: }
        !           419: 
        !           420: static inline
        !           421: void
        !           422: setInputAttenuation(u_int address, u_int channel, u_int attenuation)
        !           423: {
        !           424:     union {
        !           425:         channelSelection_t     reg;
        !           426:        unsigned char           data;
        !           427:     } channelSelection;
        !           428: 
        !           429:     union {
        !           430:         channelAttenuation_t   reg;
        !           431:        unsigned char           data;
        !           432:     } channelAttenuation;
        !           433:     
        !           434:     // avoid a warning
        !           435:     channelSelection.data = 0;
        !           436:     channelAttenuation.data = 0;
        !           437:     
        !           438:     channelSelection.reg.selectAddress = address;
        !           439:     channelSelection.reg.selectChannel = channel;
        !           440:     channelSelection.reg.isTransfer = TRUE;
        !           441:     outb(MIXER_CONTROL, channelSelection.data);
        !           442:     
        !           443:     channelAttenuation.reg.attenuation = attenuation;
        !           444:     channelAttenuation.reg.routeChannel = MIXER_B_ROUTE;
        !           445:     channelAttenuation.reg.swapChannels = NORMAL_STEREO;
        !           446:     outb(MIXER_CONTROL, channelAttenuation.data);
        !           447: 
        !           448: }
        !           449: 
        !           450: /*
        !           451:  * In the 3.1 release, the driver set the sample rate using the technique
        !           452:  * described in the Developer Reference. Unfortunately, this was imprecise
        !           453:  * due to rounding errors. The values were calculated as follows:
        !           454:  *
        !           455:  * 1193180 / (sample rate * channel count)
        !           456:  * 1193180 / (44100 * 1) = 27          // 44.1 kHz mono
        !           457:  * 1193180 / (44100 * 2) = 13          // 44.1 kHz stereo
        !           458:  *
        !           459:  * MediaVision has provided us with the calculateRate function which calculates
        !           460:  * the sample rate with more precision. This technique (which also sets the
        !           461:  * prescale register) is undocumented in their reference manual.
        !           462:  *
        !           463:  */
        !           464: static inline
        !           465: void
        !           466: calculateRate(u_int sampleRate, u_int *timer, u_int *prescale)
        !           467: {
        !           468: long targetRatio;
        !           469: long bestRatio;
        !           470: long testRatio;
        !           471: long bestDifference;
        !           472: long lastDifference;
        !           473: long testDifference;
        !           474: long p;
        !           475: long t;
        !           476: 
        !           477:     targetRatio = (441000L << 10) / sampleRate;
        !           478:     bestRatio = 300L << 10;
        !           479:     bestDifference = 7000L << 10;
        !           480:     *prescale = 0;
        !           481:     *timer = 0;
        !           482:     
        !           483:     for (p = 2; p < 256; p++) {
        !           484:         lastDifference = 300L << 10;
        !           485:        
        !           486:        for (t = p+1; t < 256; t++) {
        !           487:            testRatio = (t << 10) / p;
        !           488:            
        !           489:            if (testRatio == targetRatio) {
        !           490:                bestRatio = testRatio;
        !           491:                *prescale = p;
        !           492:                *timer = t;
        !           493:                return;
        !           494:            }
        !           495:            
        !           496:            testDifference = testRatio - targetRatio;
        !           497:            
        !           498:            if (testDifference < 0)
        !           499:                testDifference = -testDifference;
        !           500:                
        !           501:            if (testDifference > lastDifference)
        !           502:                break;
        !           503:                
        !           504:            if (testDifference < bestDifference) {
        !           505:                bestRatio = testRatio;
        !           506:                bestDifference = testDifference;
        !           507:                *prescale = p;
        !           508:                *timer = t;
        !           509:           }
        !           510:           
        !           511:           lastDifference = testDifference;
        !           512:          }
        !           513:     }
        !           514: }
        !           515: 
        !           516: static inline
        !           517: void
        !           518: setSampleRateTimer(u_int rate)
        !           519: {
        !           520: 
        !           521:     u_int prescale;
        !           522:     u_int timer;
        !           523: 
        !           524:     union {
        !           525:         sampleRateTimer_t rate;
        !           526:         unsigned char   data[2];
        !           527:     } sampleRateTimer;
        !           528:     
        !           529:     
        !           530:     filterControl_t            filterControl           = {0};
        !           531:     sampleCounterControl_t     sampleCounterControl    = {0};
        !           532: 
        !           533:     /*
        !           534:      * Before setting the sample rate interval, be sure to select the
        !           535:      * Sample Rate Timer using Local Timer Control Register (0x138b). Also
        !           536:      * remember to set the Sample Rate Timer Gate of the Audio Filter Control
        !           537:      * Register (0xb8a) to 0 before programming the timer.
        !           538:      */
        !           539:     filterControl = getFilterControl();
        !           540:     filterControl.enableSampleRateTimer = FALSE;
        !           541:     setFilterControl(filterControl);
        !           542:     
        !           543:     sampleCounterControl.countFormat = BINARY_COUNT_FORMAT;
        !           544:     sampleCounterControl.selectMode = SAMPLE_RATE_MODE;
        !           545:     sampleCounterControl.latchCounter = 3;
        !           546:     sampleCounterControl.selectCounter = SAMPLE_RATE_COUNT;
        !           547:     setSampleCounterControl(sampleCounterControl);
        !           548: 
        !           549:     switch (rate) {
        !           550:     
        !           551:         case 44100:
        !           552:            timer = 20;
        !           553:            prescale = 2;
        !           554:            break;
        !           555:            
        !           556:        case 22050:
        !           557:            timer = 40;
        !           558:            prescale = 2;
        !           559:            break;
        !           560:            
        !           561:        case 8012:
        !           562:            timer = 110;
        !           563:            prescale = 2;
        !           564:            break;
        !           565:            
        !           566:        default:
        !           567:            calculateRate(rate, &timer, &prescale);
        !           568:            break;
        !           569:     }    
        !           570:   
        !           571:     sampleRateTimer.rate = timer;
        !           572: 
        !           573:     outb(SAMPLE_RATE_TIMER, sampleRateTimer.data[0]);
        !           574:     outb(SAMPLE_RATE_TIMER, sampleRateTimer.data[1]);
        !           575: 
        !           576:     outb(PRESCALE_DIVIDER, prescale & 0x0F);
        !           577: 
        !           578: }
        !           579:     
        !           580: static inline
        !           581: void
        !           582: setSampleBufferCounter(sampleBufferCounter_t count)
        !           583: {
        !           584:     union {
        !           585:         sampleBufferCounter_t count;
        !           586:        unsigned char data[2];
        !           587:     } sampleBufferCounter;
        !           588: 
        !           589:     filterControl_t            filterControl           = {0};
        !           590:     sampleCounterControl_t     sampleCounterControl    = {0};
        !           591: 
        !           592:     filterControl = getFilterControl();
        !           593:     filterControl.enableSampleBufferCounter = FALSE;
        !           594:     setFilterControl(filterControl);
        !           595: 
        !           596:     sampleCounterControl.countFormat = BINARY_COUNT_FORMAT;
        !           597:     sampleCounterControl.latchCounter = 3;
        !           598:     sampleCounterControl.selectMode = SAMPLE_BUFFER_MODE;
        !           599:     sampleCounterControl.selectCounter = SAMPLE_BUFFER_COUNT;
        !           600:     setSampleCounterControl(sampleCounterControl);
        !           601: 
        !           602:     sampleBufferCounter.count = count;
        !           603:     outb(SAMPLE_BUFFER_COUNTER, sampleBufferCounter.data[0]);
        !           604:     outb(SAMPLE_BUFFER_COUNTER, sampleBufferCounter.data[1]);
        !           605: }
        !           606: 
        !           607: static inline
        !           608: void
        !           609: setMasterModeControl(masterModeControl_t mode)
        !           610: {
        !           611:     union {
        !           612:         masterModeControl_t reg;
        !           613:        unsigned char data;
        !           614:     } masterModeControl;
        !           615:     
        !           616:     union {
        !           617:         channelSelection_t     reg;
        !           618:        unsigned char           data;
        !           619:     } channelSelection;
        !           620: 
        !           621:     
        !           622:     // avoid a warning
        !           623:     channelSelection.data = 0;
        !           624:     
        !           625:     channelSelection.reg.selectAddress = MASTER_MODE_CONTROL;
        !           626:     channelSelection.reg.selectChannel = BOTH_CHANNELS;
        !           627:     channelSelection.reg.isTransfer = TRUE;
        !           628:     outb(MIXER_CONTROL, channelSelection.data);
        !           629:     
        !           630:     masterModeControl.reg = mode;
        !           631:     outb(MIXER_CONTROL, masterModeControl.data);
        !           632: }
        !           633: 
        !           634: static inline
        !           635: void
        !           636: setLoudnessFilter(boolean_t flag)
        !           637: {
        !           638:     masterModeControl_t                masterModeControl = {0};
        !           639: 
        !           640:     masterModeControl.loudnessFilter = flag;
        !           641:     setMasterModeControl(masterModeControl);
        !           642: }  
        !           643:     
        !           644: 
        !           645: static inline
        !           646: void
        !           647: setBassControl(unsigned char boost)
        !           648: {
        !           649:     union {
        !           650:         channelSelection_t     reg;
        !           651:        unsigned char           data;
        !           652:     } channelSelection;
        !           653: 
        !           654:     // avoid a warning
        !           655:     channelSelection.data = 0;
        !           656:     
        !           657:     channelSelection.reg.selectAddress = BASS_CONTROL;
        !           658:     channelSelection.reg.selectChannel = BOTH_CHANNELS;
        !           659:     channelSelection.reg.isTransfer = TRUE;
        !           660:     outb(MIXER_CONTROL, channelSelection.data);
        !           661:     
        !           662:     outb(MIXER_CONTROL, boost);
        !           663: }
        !           664: 
        !           665: static inline
        !           666: void
        !           667: setTrebleControl(unsigned char boost)
        !           668: {
        !           669:     union {
        !           670:         channelSelection_t     reg;
        !           671:        unsigned char           data;
        !           672:     } channelSelection;
        !           673: 
        !           674:     // avoid a warning
        !           675:     channelSelection.data = 0;
        !           676:     
        !           677:     channelSelection.reg.selectAddress = TREBLE_CONTROL;
        !           678:     channelSelection.reg.selectChannel = BOTH_CHANNELS;
        !           679:     channelSelection.reg.isTransfer = TRUE;
        !           680:     outb(MIXER_CONTROL, channelSelection.data);
        !           681:     
        !           682:     outb(MIXER_CONTROL, boost);
        !           683: }
        !           684: 
        !           685: static inline
        !           686: void
        !           687: resetMixer()
        !           688: {
        !           689:     setMasterOutputAttenuation(BOTH_CHANNELS,
        !           690:          DEFAULT_MASTER_OUTPUT_ATTENUATION);
        !           691:          
        !           692:     setOutputAttenuation(PCM,
        !           693:        BOTH_CHANNELS,
        !           694:        DEFAULT_OUTPUT_ATTENUATION);
        !           695: 
        !           696:     /*
        !           697:      * mute all other output channels
        !           698:      */
        !           699:     setOutputAttenuation(INPUT_MIXER_LOOPBACK,
        !           700:        BOTH_CHANNELS,
        !           701:        MUTE);
        !           702:     
        !           703:     setMasterInputAttenuation(BOTH_CHANNELS,
        !           704:         DEFAULT_MASTER_INPUT_ATTENUATION);
        !           705:        
        !           706:     setInputAttenuation(MICROPHONE,
        !           707:        BOTH_CHANNELS,
        !           708:        DEFAULT_MICROPHONE_ATTENUATION);
        !           709:        
        !           710:     setInputAttenuation(EXTERNAL_LINE_IN,
        !           711:         BOTH_CHANNELS, 
        !           712:        DEFAULT_INPUT_ATTENUATION);
        !           713: 
        !           714:     /*
        !           715:      * mute all other input channels
        !           716:      */
        !           717:     setInputAttenuation(FM_SYNTHESIS,
        !           718:         BOTH_CHANNELS,
        !           719:        MUTE);
        !           720:        
        !           721:     setInputAttenuation(INTERNAL_LINE_IN,
        !           722:          BOTH_CHANNELS,
        !           723:         MUTE);
        !           724:         
        !           725:     setInputAttenuation(SPEAKER,
        !           726:         BOTH_CHANNELS,
        !           727:        MUTE);
        !           728:        
        !           729:     setInputAttenuation(SOUNDBLASTER,
        !           730:         BOTH_CHANNELS,
        !           731:        MUTE);
        !           732:     
        !           733:     /*
        !           734:      * set treble and bass boost to 0db
        !           735:      */
        !           736:      setBassControl(DEFAULT_BASS_BOOST);
        !           737:      setTrebleControl(DEFAULT_TREBLE_BOOST);
        !           738: }
        !           739: 
        !           740: 
        !           741: 
        !           742: /*
        !           743:  * resetHardware uses "magic" values recommended by MediaVision. These 
        !           744:  * settings are not always documented in the reference guide. In addition,
        !           745:  * some of the values are specific to a particular version of the hardware.
        !           746:  */
        !           747: static inline
        !           748: boolean_t
        !           749: resetHardware()
        !           750: {
        !           751:     systemConfiguration1_t     systemConfiguration1;
        !           752:     
        !           753:     union {
        !           754:        interruptControl_t      reg;
        !           755:        unsigned char           data;
        !           756:     } interruptControl;
        !           757:     
        !           758:     unsigned char              version;
        !           759:     
        !           760:     /*
        !           761:      * The presence of the hardware is verified. The version bits in the
        !           762:      * interrupt control register are read only. 
        !           763:      */
        !           764:     interruptControl.data = inb(INTERRUPT_CONTROL);
        !           765:     
        !           766:     if (interruptControl.data == 0xff)
        !           767:        return FALSE;
        !           768:     
        !           769:     version = interruptControl.reg.version;
        !           770:     interruptControl.reg.version = 0;
        !           771:     
        !           772:     outb(INTERRUPT_CONTROL, interruptControl.data);
        !           773:     interruptControl.data = inb(INTERRUPT_CONTROL);
        !           774:     
        !           775:     if (interruptControl.reg.version != version)
        !           776:         return FALSE;
        !           777: 
        !           778:     /*
        !           779:      * Turn off MPU and SoundBlaster emulation
        !           780:      *
        !           781:     outb(COMPATIBILITY_ENABLE, 0);
        !           782:    
        !           783:     /*
        !           784:      * Turn off MPU and SoundBlaster interrupts
        !           785:      */   
        !           786:     outb(EMULATION_CONFIGURATION, 0);
        !           787: 
        !           788:     /*
        !           789:      * Sets wait state to 140ns period
        !           790:      */
        !           791:     outb(WAIT_STATE, WAIT_STATE_RESET);
        !           792: 
        !           793:     /*
        !           794:      * D0 - resets FM
        !           795:      * D1 - resets Codec
        !           796:      * D2 - resets SoundBlaster
        !           797:      * D4 - resets MVA508 Mixer
        !           798:      */
        !           799:     outb(AUDIO_MIXER, 0);
        !           800:     outb(AUDIO_MIXER, AUDIO_MIXER_RESET);
        !           801: 
        !           802:     /*
        !           803:      * This is required when using the prescale register for more precise
        !           804:      * sample rate timing.
        !           805:      */
        !           806:     systemConfiguration1 = getSystemConfiguration1();
        !           807:     systemConfiguration1.selectCompatibleClock = TRUE;
        !           808:     setSystemConfiguration1(systemConfiguration1);
        !           809: 
        !           810:     outb(SYSTEM_CONFIGURATION_2, SYSTEM_CONFIGURATION_2_RESET);
        !           811:     /*
        !           812:      * D3 (invert bclk output)
        !           813:      * D4 (use codec sync output)
        !           814:      */ 
        !           815:     outb(SYSTEM_CONFIGURATION_3, SYSTEM_CONFIGURATION_3_RESET);
        !           816: 
        !           817:     outb(SYSTEM_CONFIGURATION_4, SYSTEM_CONFIGURATION_4_RESET);
        !           818:     
        !           819:     /*
        !           820:      * When a 16 bit Codec is attached, the Prescale counter is used to
        !           821:      * set the ratio between the incoming Codec bit clock and the outgoing
        !           822:      * master clock.
        !           823:      */
        !           824:     outb(PRESCALE_DIVIDER, PRESCALE_DIVIDER_RESET);
        !           825:     
        !           826:     resetMixer();
        !           827:     return TRUE;
        !           828: }
        !           829: 

unix.superglobalmegacorp.com

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