|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.