Annotation of XNU/iokit/IOKit/audio/IOAudioController.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: 
                     23: /*!
                     24:  * @header AudioController
                     25:  * For controlling audio hardware, known as "codecs" to CPU S/W or "sound chips" or cards in the vernacular
                     26:  * Including but not limited to streaming of data in and out, as well as control parameters and topology
                     27:  */
                     28: 
                     29: #ifndef _IOAUDIOCONTOLLER_H
                     30: #define _IOAUDIOCONTOLLER_H
                     31: 
                     32: #include <IOKit/IORegistryEntry.h>
                     33: #include <IOKit/IOService.h>
                     34: #include <IOKit/IOUserClient.h>
                     35: #include <IOKit/audio/IOAudioParts.h>
                     36: 
                     37: /*!
                     38:  * @class IOAudioController
                     39:  * @abstract Base class for abstracting streaming, control, and topology of audio hardware
                     40:  * @discussion Pressent a shared memory ring buffer for the DMA engine and provides auto erase capability
                     41:  */
                     42: class IOAudioController : public IOAudio
                     43: {      
                     44:     OSDeclareDefaultStructors(IOAudioController)
                     45: 
                     46: public:
                     47:     /*!
                     48:      * @function getMap
                     49:      * @abstract Get access to sample buffer and status for a stream
                     50:      * @param index
                     51:      * @param map
                     52:      * @result void
                     53:      */
                     54:     virtual void getMap(AudioStreamIndex index, IOAudioStreamMap * map);
                     55: 
                     56:     /*!
                     57:      * @function releaseMap
                     58:      * @abstract Call when done with stream
                     59:      * @param index
                     60:      * @result void
                     61:      */
                     62:     virtual void releaseMap(AudioStreamIndex index);
                     63:     
                     64:     /*!
                     65:      * @function setFlow
                     66:      * @abstract Control stream flow
                     67:      * @param index
                     68:      * @param flowing
                     69:      * @result void
                     70:      */
                     71:      virtual void setFlow(AudioStreamIndex index, bool flowing);
                     72: 
                     73:     /*
                     74:      * @function flushStream
                     75:      * @abstract Set the ending stream position gauranteed to be played after all clients have disconnected
                     76:      * @param endingPosition Ending position for the audio stream - gauranteed to be played
                     77:      * @result void
                     78:      */
                     79:     virtual void flushStream(AudioStreamIndex index, IOAudioStreamPosition *endingPosition);
                     80: 
                     81: 
                     82:     /*!
                     83:      * @function SetControl
                     84:      * @abstract Set a control to a value
                     85:      * @discussion Called by IOAudioControls, on the workloop thread.
                     86:      * @param id
                     87:      * @param val
                     88:      * @result IOReturn
                     89:      */
                     90:     virtual IOReturn SetControl(UInt16 id, int val) = 0;
                     91: 
                     92:     /*!
                     93:      * @function getWorkLoop
                     94:      * @result IOWorkLoop
                     95:      */
                     96:     virtual IOWorkLoop *getWorkLoop() const;
                     97: 
                     98:     /*!
                     99:      * @function setMasterVolumeLeft
                    100:      * @param newMasterVolumeLeft
                    101:      * @result void
                    102:      */
                    103:     virtual void setMasterVolumeLeft(UInt16 newMasterVolumeLeft);
                    104: 
                    105:     /*!
                    106:      * @function setMasterVolumeRight
                    107:      * @param newMasterVolumeRight
                    108:      * @result void
                    109:      */
                    110:     virtual void setMasterVolumeRight(UInt16 newMasterVolumeRight);
                    111: 
                    112:     /*!
                    113:      * @function setMasterMute
                    114:      * @param newMasterMute
                    115:      * @result void
                    116:      */
                    117:     virtual void setMasterMute(bool newMasterMute);
                    118: 
                    119: protected:
                    120:     /*!
                    121:      * @function free
                    122:      * @result void
                    123:      */
                    124:     virtual void free();
                    125: 
                    126:     /*!
                    127:      * @function createAudioStream
                    128:      * @abstract Create an audio stream.
                    129:      * @discussion Streams represent hardware input/output connectors such as headphone jacks,
                    130:      *  speakers, CD analog input etc. or I/O channels that the CPU can directly access such as
                    131:      *  simple D->A and A->D converters and more complex codecs.
                    132:      *  IOAudioController::createAudioStream can handle simple stream types
                    133:      *  (implemented by IOAudioStream and IOAudioMappedStream).
                    134:      *  Fancy things like streams with 3D positioning will probably need a new IOAudioStream subclass.
                    135:      * @param index
                    136:      * @result IOAudioStream A pointer if successful, NULL otherwise 
                    137:      */
                    138:     virtual IOAudioStream *createAudioStream(AudioStreamIndex index);
                    139: 
                    140:     /*!
                    141:      * @function getStreamProperties
                    142:      * @abstract Get properties of a (possibly not yet created) stream.
                    143:      * @discussion Properties are:
                    144:      *  Input or Output
                    145:      *  Directly Accessable by CPU
                    146:      *  Data type (16 bit samples, AC3 compressed etc)
                    147:      *  Sample size
                    148:      *  Channels (Mono/Stereo/5 channel/3D etc.
                    149:      *
                    150:      *  Must be provided by the driver.
                    151:      * @param index
                    152:      * @result OSDictionary
                    153:      */
                    154:     virtual OSDictionary * getStreamProperties(AudioStreamIndex index) = 0;
                    155: 
                    156:     /*!
                    157:      * @function probeStreams
                    158:      * @abstract How many cpu accessable streams does the device have?
                    159:      * @result int number of streams
                    160:      */
                    161:     virtual int probeStreams() = 0;
                    162: 
                    163:     /*!
                    164:      * @function CreateAudioTopology
                    165:      * @abstract Create all the AudioControls and AudioComponents for the device
                    166:      * @discussion This method is caled after creating the streams
                    167:      * @param queue
                    168:      * @result void
                    169:      */
                    170:     virtual void CreateAudioTopology(IOCommandQueue *queue) = 0;
                    171: 
                    172:     /*!
                    173:      * @function buildComponentAndAttach
                    174:      * @param parent
                    175:      * @param child
                    176:      * @param serialProps
                    177:      * @param queue
                    178:      * @result IOAudioComponentImpl
                    179:      */
                    180:     virtual IOAudioComponentImpl * buildComponentAndAttach(
                    181:                IORegistryEntry *parent, IORegistryEntry *child, 
                    182:                const char *serialProps, IOCommandQueue *queue);
                    183: 
                    184:     /*!
                    185:      * @function AttachComponents
                    186:      * @param parent
                    187:      * @param child
                    188:      * @result void
                    189:      */
                    190:     virtual void AttachComponents(IORegistryEntry *parent,
                    191:                        IORegistryEntry *child);
                    192: 
                    193:     /*!
                    194:      * @function createWorkLoop
                    195:      * @abstract Get the workloop object for the hardware.
                    196:      * @discussion The default implementation creates a new workloop.
                    197:      *  Drivers may want to override this
                    198:      *  eg. USBAudio will probably want to use an existing USB workloop.
                    199:      * @result IOWorkLoop
                    200:      */
                    201:     virtual IOWorkLoop * createWorkLoop();
                    202: 
                    203:     /*!
                    204:      * @function startWorkLoop
                    205:      * @abstract Called from the device's start() method after hardware is initialized
                    206:      * @result void
                    207:      */
                    208:     virtual void startWorkLoop();
                    209: 
                    210:     /*!
                    211:      * @function getSharedStatus
                    212:      * @param index
                    213:      * @result IOAudioStreamStatus
                    214:      */
                    215:     virtual IOAudioStreamStatus * getSharedStatus(AudioStreamIndex index) = 0;
                    216: 
                    217:     /*!
                    218:      * @function getSampleBuffer
                    219:      * @param index
                    220:      * @result void *
                    221:      */
                    222:     virtual void * getSampleBuffer(AudioStreamIndex index) = 0;
                    223: 
                    224:     /*!
                    225:      * @function allocateMixBuffer
                    226:      * @abstract Allocates the mix buffer for the given stream.
                    227:      * @discussion Only called by execCommand()
                    228:      * @param index
                    229:      * @result void *
                    230:      */
                    231: 
                    232:     virtual void *allocateMixBuffer(AudioStreamIndex index);
                    233: 
                    234:     /*!
                    235:      * @function getMixBuffer
                    236:      * @param index
                    237:      * @result void *
                    238:      */
                    239: 
                    240:     virtual void *getMixBuffer(AudioStreamIndex index);
                    241: 
                    242:     /*!
                    243:      * @function startStream
                    244:      * @abstract Start a stream
                    245:      * @param index Stream index
                    246:      * @result IOAudioStreamStatus
                    247:      */
                    248:     virtual IOAudioStreamStatus * startStream(AudioStreamIndex index) = 0;
                    249: 
                    250:     /*!
                    251:      * @function startStream
                    252:      * @abstract Stop a stream
                    253:      * @param index Stream index
                    254:      * @result void
                    255:      */
                    256:     virtual void stopStream(AudioStreamIndex index) = 0;
                    257: 
                    258:     /*!
                    259:      * @function pauseStream
                    260:      * @abstract Control stream flow
                    261:      * @param index Audio stream
                    262:      * @result void
                    263:      */
                    264:     virtual void pauseStream(AudioStreamIndex index) = 0;
                    265: 
                    266:     /*!
                    267:      * @function resumeStream
                    268:      * @abstract Control stream flow
                    269:      * @param index Audio stream
                    270:      * @result void
                    271:      */
                    272:     virtual void resumeStream(AudioStreamIndex index) = 0;
                    273: 
                    274:     /*!
                    275:      * @function DoClockTick
                    276:      * @param IOTimerEventSource
                    277:      * @result void
                    278:      */
                    279:     virtual void DoClockTick(IOTimerEventSource *);
                    280: 
                    281:     /*!
                    282:      * @function calculateTickInterval
                    283:      * @param tickInterval
                    284:      * @result void
                    285:      */
                    286:     virtual void calculateTickInterval(AbsoluteTime *tickInterval);
                    287: 
                    288:     /*!
                    289:      * @function execCommand
                    290:      * @param cmd
                    291:      * @param field2
                    292:      * @param field3
                    293:      * @result void
                    294:      */
                    295:     virtual void execCommand(IOAudioCmd cmd, void *field2, void *field3);
                    296: 
                    297:     /*!
                    298:      * @function GetStream
                    299:      * @param index Audio stream index
                    300:      * @result IOAudioStream
                    301:      */
                    302:     IOAudioStream * GetStream(AudioStreamIndex index) const;
                    303: 
                    304:     /*!
                    305:      * @function init
                    306:      * @param properties
                    307:      * @result bool
                    308:      */
                    309:     virtual bool init(OSDictionary *properties);
                    310: 
                    311:     /*!
                    312:      * @function start
                    313:      * @param provider
                    314:      * @result bool
                    315:      */
                    316:     virtual bool start( IOService * provider );
                    317: 
                    318: public:
                    319:     static const IORegistryPlane * gIOAudioPlane;
                    320: 
                    321:     // Common IOSymbols, precooked and ready to use.
                    322:     static const OSSymbol * gValSym;
                    323:     static const OSSymbol * gInputsSym;
                    324:     static const OSSymbol * gControlsSym;
                    325:     static const OSSymbol * gJackSym;
                    326:     static const OSSymbol * gSpeakerSym;
                    327:     static const OSSymbol * gHeadphonesSym;
                    328:     static const OSSymbol * gLineOutSym;
                    329:     static const OSSymbol * gTypeSym;
                    330:     static const OSSymbol * gMuteSym;
                    331:     static const OSSymbol * gIdSym;
                    332:     static const OSSymbol * gMasterSym;
                    333: 
                    334: protected:
                    335:     OSArray *fStreams;
                    336: 
                    337:     IOService *fDevice;
                    338: 
                    339:     IOTimerEventSource *       fTimer;
                    340:     IOCommandQueue *           fQueue;
                    341:     IOWorkLoop *               fWorkLoop;
                    342:     AbsoluteTime               fTickPeriod;
                    343:     AbsoluteTime               fNextTick;
                    344:     bool                       fTimerInUse;
                    345:     AbsoluteTime               fMaxPollInterval;
                    346:     OSSet *                    fMasterVolumeComponents;
                    347:     UInt32                     fNumStreamsInUse;
                    348: 
                    349:     static void execAndSignal(OSObject * obj, void *field0, void *field1, void *field2, void *field3);
                    350:     static void clockTick(OSObject *, IOTimerEventSource *sender);
                    351: 
                    352:     void setMasterComponentsProperties(OSDictionary *properties);
                    353: };
                    354: 
                    355: inline IOAudioStream * 
                    356: IOAudioController::GetStream(AudioStreamIndex index) const
                    357: {
                    358:     return (IOAudioStream *)fStreams->getObject(index);
                    359: }
                    360: 
                    361: #endif /* _IOAUDIOCONTOLLER_H */

unix.superglobalmegacorp.com

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