Annotation of XNU/iokit/Families/IOAudio/IOAudioManager.cpp, revision 1.1

1.1     ! root        1: #include <IOKit/audio/IOAudioManager.h>
        !             2: 
        !             3: #include <libkern/c++/OSCollectionIterator.h>
        !             4: 
        !             5: #define DEFAULT_INITIAL_VOLUME                 MASTER_VOLUME_MAX
        !             6: #define DEFAULT_INITIAL_MUTE           false
        !             7: #define DEFAULT_INITIAL_INCREMENT      4096
        !             8: 
        !             9: static IOAudioManager *amInstance = NULL;
        !            10: 
        !            11: OSDefineMetaClassAndStructors(IOAudioManager, IOService);
        !            12: 
        !            13: IOAudioManager *IOAudioManager::sharedInstance()
        !            14: {
        !            15:     return amInstance;
        !            16: }
        !            17: 
        !            18: bool IOAudioManager::init(OSDictionary *properties)
        !            19: {
        !            20:     if (!IOService::init(properties)) {
        !            21:         return false;
        !            22:     }
        !            23: 
        !            24:     masterVolumeLeft = DEFAULT_INITIAL_VOLUME;
        !            25:     masterVolumeRight = DEFAULT_INITIAL_VOLUME;
        !            26:     masterMute = DEFAULT_INITIAL_MUTE;
        !            27:     masterVolumeIncrement = DEFAULT_INITIAL_INCREMENT;
        !            28: 
        !            29:     setProperty(kMasterVolumeLeft, (unsigned long long)masterVolumeLeft, sizeof(masterVolumeLeft)*8);
        !            30:     setProperty(kMasterVolumeRight, (unsigned long long)masterVolumeRight, sizeof(masterVolumeRight)*8);
        !            31:     setProperty(kMasterMute, (unsigned long long)masterMute, sizeof(masterMute)*8);
        !            32:     setProperty(kMasterVolumeIncrement, (unsigned long long)masterVolumeIncrement, sizeof(masterVolumeIncrement)*8);
        !            33: 
        !            34:     audioControllers = NULL;
        !            35:     publishNotify = NULL;
        !            36:     driverLock = NULL;
        !            37: 
        !            38:     return true;
        !            39: }
        !            40: 
        !            41: void IOAudioManager::free()
        !            42: {
        !            43:     if (audioControllers) {
        !            44:         audioControllers->release();
        !            45:     }
        !            46: 
        !            47:     if (publishNotify) {
        !            48:         publishNotify->release();
        !            49:     }
        !            50: 
        !            51:     if (driverLock) {
        !            52:         IOLockFree(driverLock);
        !            53:     }
        !            54:     
        !            55:     IOService::free();
        !            56: }
        !            57: 
        !            58: bool IOAudioManager::start(IOService *provider)
        !            59: {
        !            60:     bool success = false;
        !            61: 
        !            62:     amInstance = this;
        !            63: 
        !            64:     do {
        !            65:         if (!IOService::start(provider)) {
        !            66:             break;
        !            67:         }
        !            68: 
        !            69:         audioControllers = OSArray::withCapacity(1);
        !            70: 
        !            71:         driverLock = IOLockAlloc();
        !            72: 
        !            73:         publishNotify = addNotification(gIOPublishNotification,
        !            74:                                         serviceMatching("IOAudioController"),
        !            75:                                         (IOServiceNotificationHandler) &audioPublishNotificationHandler,
        !            76:                                         this,
        !            77:                                         0);
        !            78: 
        !            79:         if (!publishNotify || !driverLock) {
        !            80:             break;
        !            81:         }
        !            82: 
        !            83:         IOLockInit(driverLock);
        !            84: 
        !            85:         success = true;
        !            86:     } while (false);
        !            87: 
        !            88:     if (!success) {
        !            89:         amInstance = NULL;
        !            90:     }
        !            91: 
        !            92:     return success;
        !            93: }
        !            94: 
        !            95: IOReturn IOAudioManager::setProperties( OSObject * properties )
        !            96: {
        !            97:     OSDictionary *props;
        !            98:     IOReturn result = kIOReturnSuccess;
        !            99: 
        !           100:     if (properties && (props = OSDynamicCast(OSDictionary, properties))) {
        !           101:         OSCollectionIterator *iterator;
        !           102:         OSObject *iteratorKey;
        !           103: 
        !           104:         iterator = OSCollectionIterator::withCollection(props);
        !           105:         while ((iteratorKey = iterator->getNextObject())) {
        !           106:             OSSymbol *key;
        !           107: 
        !           108:             key = OSDynamicCast(OSSymbol, iteratorKey);
        !           109:             if (key) {
        !           110:                 OSNumber *value;
        !           111:                 value = OSDynamicCast(OSNumber, props->getObject(key));
        !           112: 
        !           113:                 if (value) {
        !           114:                     if (key->isEqualTo(kMasterVolumeLeft)) {
        !           115:                         setMasterVolumeLeft(value->unsigned16BitValue());
        !           116:                     } else if (key->isEqualTo(kMasterVolumeRight)) {
        !           117:                         setMasterVolumeRight(value->unsigned16BitValue());
        !           118:                     } else if (key->isEqualTo(kMasterMute)) {
        !           119:                         setMasterMute(value->unsigned8BitValue());
        !           120:                     } else if (key->isEqualTo(kMasterVolumeIncrement)) {
        !           121:                         setMasterVolumeIncrement(value->unsigned16BitValue());
        !           122:                     }
        !           123:                 } else {
        !           124:                     result = kIOReturnBadArgument;
        !           125:                     break;
        !           126:                 }
        !           127:             } else {
        !           128:                 result = kIOReturnBadArgument;
        !           129:                 break;
        !           130:             }
        !           131:         }
        !           132:     } else {
        !           133:         result = kIOReturnBadArgument;
        !           134:     }
        !           135: 
        !           136:     return result;
        !           137: }
        !           138: 
        !           139: bool IOAudioManager::audioPublishNotificationHandler(IOAudioManager *self,
        !           140:                                                      void *ref,
        !           141:                                                      IOService *newService)
        !           142: {
        !           143:     self->attach(newService);
        !           144: 
        !           145:     if (OSDynamicCast(IOAudioController, newService)) {
        !           146:         self->registerAudioController((IOAudioController *)newService);
        !           147:     }
        !           148: 
        !           149:     return true;
        !           150: }
        !           151: 
        !           152: bool IOAudioManager::registerAudioController(IOAudioController *controller)
        !           153: {
        !           154:     IOTakeLock(driverLock);
        !           155:     
        !           156:     audioControllers->setObject(controller);
        !           157: 
        !           158:     controller->setMasterMute(masterMute);
        !           159:     controller->setMasterVolumeLeft(masterVolumeLeft);
        !           160:     controller->setMasterVolumeRight(masterVolumeRight);
        !           161: 
        !           162:     IOUnlock(driverLock);
        !           163:     
        !           164:     return true;
        !           165: }
        !           166: 
        !           167: UInt16 IOAudioManager::getMasterVolumeLeft()
        !           168: {
        !           169:     return masterVolumeLeft;
        !           170: }
        !           171: 
        !           172: UInt16 IOAudioManager::getMasterVolumeRight()
        !           173: {
        !           174:     return masterVolumeRight;
        !           175: }
        !           176: 
        !           177: UInt16 IOAudioManager::setMasterVolumeLeft(UInt16 newMasterVolumeLeft)
        !           178: {
        !           179:     UInt16 oldMasterVolumeLeft;
        !           180: 
        !           181:     oldMasterVolumeLeft = masterVolumeLeft;
        !           182:     masterVolumeLeft = newMasterVolumeLeft;
        !           183: 
        !           184:     if (masterVolumeLeft != oldMasterVolumeLeft) {
        !           185:         OSCollectionIterator *iter;
        !           186: 
        !           187:         setProperty(kMasterVolumeLeft, (unsigned long long)masterVolumeLeft, sizeof(masterVolumeLeft)*8);
        !           188: 
        !           189:         IOTakeLock(driverLock);
        !           190:         
        !           191:         iter = OSCollectionIterator::withCollection(audioControllers);
        !           192:         if (iter) {
        !           193:             IOAudioController *controller;
        !           194: 
        !           195:             while ((controller = (IOAudioController *)iter->getNextObject()) != NULL) {
        !           196:                 controller->setMasterVolumeLeft(masterVolumeLeft);
        !           197:             }
        !           198: 
        !           199:             iter->release();
        !           200:         }
        !           201: 
        !           202:         IOUnlock(driverLock);
        !           203:     }
        !           204: 
        !           205:     return oldMasterVolumeLeft;
        !           206: }
        !           207: 
        !           208: UInt16 IOAudioManager::setMasterVolumeRight(UInt16 newMasterVolumeRight)
        !           209: {
        !           210:     UInt16 oldMasterVolumeRight;
        !           211: 
        !           212:     oldMasterVolumeRight = masterVolumeRight;
        !           213:     masterVolumeRight = newMasterVolumeRight;
        !           214: 
        !           215:     if (masterVolumeRight != oldMasterVolumeRight) {
        !           216:         OSCollectionIterator *iter;
        !           217: 
        !           218:         setProperty(kMasterVolumeRight, (unsigned long long)masterVolumeRight, sizeof(masterVolumeRight)*8);
        !           219: 
        !           220:         IOTakeLock(driverLock);
        !           221: 
        !           222:         iter = OSCollectionIterator::withCollection(audioControllers);
        !           223:         if (iter) {
        !           224:             IOAudioController *controller;
        !           225: 
        !           226:             while ((controller = (IOAudioController *)iter->getNextObject()) != NULL) {
        !           227:                 controller->setMasterVolumeRight(masterVolumeRight);
        !           228:             }
        !           229: 
        !           230:             iter->release();
        !           231:         }
        !           232: 
        !           233:         IOUnlock(driverLock);
        !           234:     }
        !           235: 
        !           236:     return oldMasterVolumeRight;
        !           237: }
        !           238: 
        !           239: bool IOAudioManager::getMasterMute()
        !           240: {
        !           241:     return masterMute;
        !           242: }
        !           243: 
        !           244: bool IOAudioManager::setMasterMute(bool newMasterMute)
        !           245: {
        !           246:     bool oldMasterMute;
        !           247: 
        !           248:     oldMasterMute = masterMute;
        !           249:     masterMute = newMasterMute;
        !           250: 
        !           251:     if (masterMute != oldMasterMute) {
        !           252:         OSCollectionIterator *iter;
        !           253: 
        !           254:         setProperty(kMasterMute, (unsigned long long)masterMute, sizeof(masterMute)*8);
        !           255: 
        !           256:         IOTakeLock(driverLock);
        !           257: 
        !           258:         iter = OSCollectionIterator::withCollection(audioControllers);
        !           259:         if (iter) {
        !           260:             IOAudioController *controller;
        !           261: 
        !           262:             while ((controller = (IOAudioController *)iter->getNextObject()) != NULL) {
        !           263:                 controller->setMasterMute(masterMute);
        !           264:             }
        !           265: 
        !           266:             iter->release();
        !           267:         }
        !           268: 
        !           269:         IOUnlock(driverLock);
        !           270:     }
        !           271: 
        !           272:     return oldMasterMute;
        !           273: }
        !           274: 
        !           275: UInt16 IOAudioManager::getMasterVolumeIncrement()
        !           276: {
        !           277:     return masterVolumeIncrement;
        !           278: }
        !           279: 
        !           280: UInt16 IOAudioManager::setMasterVolumeIncrement(UInt16 newMasterVolumeIncrement)
        !           281: {
        !           282:     UInt16 oldMasterVolumeIncrement;
        !           283: 
        !           284:     oldMasterVolumeIncrement = masterVolumeIncrement;
        !           285:     masterVolumeIncrement = newMasterVolumeIncrement;
        !           286: 
        !           287:     setProperty(kMasterVolumeIncrement, (unsigned long long)masterVolumeIncrement, sizeof(masterVolumeIncrement)*8);
        !           288: 
        !           289:     return oldMasterVolumeIncrement;
        !           290: }
        !           291: 
        !           292: UInt16 IOAudioManager::incrementMasterVolume()
        !           293: {
        !           294:     SInt32 newMasterVolumeLeft;
        !           295:     SInt32 newMasterVolumeRight;
        !           296: 
        !           297:     newMasterVolumeLeft = masterVolumeLeft + masterVolumeIncrement;
        !           298:     newMasterVolumeRight = masterVolumeRight + masterVolumeIncrement;
        !           299:     
        !           300:     if (newMasterVolumeLeft > MASTER_VOLUME_MAX) {
        !           301:         newMasterVolumeRight = newMasterVolumeRight - (newMasterVolumeLeft - MASTER_VOLUME_MAX);
        !           302:         newMasterVolumeLeft = MASTER_VOLUME_MAX;
        !           303:     }
        !           304: 
        !           305:     if (newMasterVolumeRight > MASTER_VOLUME_MAX) {
        !           306:         newMasterVolumeLeft = newMasterVolumeLeft - (newMasterVolumeRight - MASTER_VOLUME_MAX);
        !           307:         newMasterVolumeRight = MASTER_VOLUME_MAX;
        !           308:     }
        !           309: 
        !           310:     setMasterVolumeLeft(newMasterVolumeLeft);
        !           311:     setMasterVolumeRight(newMasterVolumeRight);
        !           312: 
        !           313:     return masterVolumeLeft > masterVolumeRight ? masterVolumeLeft : masterVolumeRight;
        !           314: }
        !           315: 
        !           316: UInt16 IOAudioManager::decrementMasterVolume()
        !           317: {
        !           318:     SInt32 newMasterVolumeLeft;
        !           319:     SInt32 newMasterVolumeRight;
        !           320: 
        !           321:     newMasterVolumeLeft = masterVolumeLeft - masterVolumeIncrement;
        !           322:     newMasterVolumeRight = masterVolumeRight - masterVolumeIncrement;
        !           323:     
        !           324:     if (newMasterVolumeLeft < MASTER_VOLUME_MIN) {
        !           325:         newMasterVolumeRight = newMasterVolumeRight + (MASTER_VOLUME_MIN - newMasterVolumeLeft);
        !           326:         newMasterVolumeLeft = MASTER_VOLUME_MIN;
        !           327:     }
        !           328: 
        !           329:     if (newMasterVolumeRight < MASTER_VOLUME_MIN) {
        !           330:         newMasterVolumeLeft = newMasterVolumeLeft + (MASTER_VOLUME_MIN - newMasterVolumeRight);
        !           331:         newMasterVolumeRight = MASTER_VOLUME_MIN;
        !           332:     }
        !           333: 
        !           334:     setMasterVolumeLeft(newMasterVolumeLeft);
        !           335:     setMasterVolumeRight(newMasterVolumeRight);
        !           336: 
        !           337:     return masterVolumeLeft > masterVolumeRight ? masterVolumeLeft : masterVolumeRight;
        !           338: }
        !           339: 
        !           340: bool IOAudioManager::toggleMasterMute()
        !           341: {
        !           342:     setMasterMute(!masterMute);
        !           343:     return masterMute;
        !           344: }

unix.superglobalmegacorp.com

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