Annotation of XNU/iokit/Families/IOCDDrive/IOCDAudioNubClient.cpp, revision 1.1

1.1     ! root        1: #include <IOKit/IOUserClient.h>
        !             2: #include <IOKit/assert.h>
        !             3: #include "IOCDAudioNub.h"
        !             4: #include "IOCDAudioNubClient.h"
        !             5: 
        !             6: #define super IOUserClient
        !             7: 
        !             8: OSDefineMetaClassAndStructors(IOCDAudioNubClient, IOUserClient)
        !             9: 
        !            10: IOCDAudioNubClient *IOCDAudioNubClient::withTask(task_t owningTask)
        !            11: {
        !            12:     IOCDAudioNubClient *me;
        !            13: 
        !            14:     me = new IOCDAudioNubClient;
        !            15:     if(me) {
        !            16:         if(!me->init()) {
        !            17:             me->release();
        !            18:             return NULL;
        !            19:         }
        !            20:         me->fTask = owningTask;
        !            21:     }
        !            22:     return me;
        !            23: }
        !            24: 
        !            25: bool IOCDAudioNubClient::start( IOService * provider )
        !            26: {
        !            27:     kprintf("IOCDAudioNubClient::start\n");
        !            28: 
        !            29:     assert(OSDynamicCast(IOCDAudioNub, provider));
        !            30:     if(!super::start(provider))
        !            31:         return false;
        !            32:     fOwner = (IOCDAudioNub *)provider;
        !            33: 
        !            34:     fMethods[kTest].object = this;
        !            35:     fMethods[kTest].func =
        !            36:         (IOMethod)&IOCDAudioNubClient::CDAudioNubTest;
        !            37:     fMethods[kTest].count0 = 3;
        !            38:     fMethods[kTest].count1 = 1;
        !            39:     fMethods[kTest].flags = kIOUCScalarIScalarO;
        !            40: 
        !            41:     fMethods[kGetNumAudioTracks].object = this;
        !            42:     fMethods[kGetNumAudioTracks].func =
        !            43:         (IOMethod)&IOCDAudioNubClient::getNumAudioTracks;
        !            44:     fMethods[kGetNumAudioTracks].count0 = 0;
        !            45:     fMethods[kGetNumAudioTracks].count1 = 1;
        !            46:     fMethods[kGetNumAudioTracks].flags = kIOUCScalarIScalarO;
        !            47: 
        !            48:     fMethods[kGetMSF].object = this;
        !            49:     fMethods[kGetMSF].func =
        !            50:         (IOMethod)&IOCDAudioNubClient::getMSF;
        !            51:     fMethods[kGetMSF].count0 = 1;
        !            52:     fMethods[kGetMSF].count1 = 1;
        !            53:     fMethods[kGetMSF].flags = kIOUCScalarIScalarO;
        !            54: 
        !            55:     fMethods[kPlayTrack].object = this;
        !            56:     fMethods[kPlayTrack].func =
        !            57:         (IOMethod)&IOCDAudioNubClient::playTrack;
        !            58:     fMethods[kPlayTrack].count0 = 1;
        !            59:     fMethods[kPlayTrack].count1 = 1;
        !            60:     fMethods[kPlayTrack].flags = kIOUCScalarIScalarO;
        !            61: 
        !            62:     fMethods[kPause].object = this;
        !            63:     fMethods[kPause].func =
        !            64:         (IOMethod)&IOCDAudioNubClient::pause;
        !            65:     fMethods[kPause].count0 = 0;
        !            66:     fMethods[kPause].count1 = 1;
        !            67:     fMethods[kPause].flags = kIOUCScalarIScalarO;
        !            68: 
        !            69:     fMethods[kResume].object = this;
        !            70:     fMethods[kResume].func =
        !            71:         (IOMethod)&IOCDAudioNubClient::resume;
        !            72:     fMethods[kResume].count0 = 0;
        !            73:     fMethods[kResume].count1 = 1;
        !            74:     fMethods[kResume].flags = kIOUCScalarIScalarO;
        !            75: 
        !            76:     fMethods[kGetVolume].object = this;
        !            77:     fMethods[kGetVolume].func =
        !            78:         (IOMethod)&IOCDAudioNubClient::getVolume;
        !            79:     fMethods[kGetVolume].count0 = 0;
        !            80:     fMethods[kGetVolume].count1 = 1;
        !            81:     fMethods[kGetVolume].flags = kIOUCScalarIScalarO;
        !            82: 
        !            83:     fMethods[kSetVolume].object = this;
        !            84:     fMethods[kSetVolume].func =
        !            85:         (IOMethod)&IOCDAudioNubClient::setVolume;
        !            86:     fMethods[kSetVolume].count0 = 2;
        !            87:     fMethods[kSetVolume].count1 = 1;
        !            88:     fMethods[kSetVolume].flags = kIOUCScalarIScalarO;
        !            89: 
        !            90:     fMethods[kGetAudioStatus].object = this;
        !            91:     fMethods[kGetAudioStatus].func =
        !            92:         (IOMethod)&IOCDAudioNubClient::getAudioStatus;
        !            93:     fMethods[kGetAudioStatus].count0 = 0;
        !            94:     fMethods[kGetAudioStatus].count1 = 4;
        !            95:     fMethods[kGetAudioStatus].flags = kIOUCScalarIScalarO;
        !            96: 
        !            97:     fMethods[kPlayMSF].object = this;
        !            98:     fMethods[kPlayMSF].func =
        !            99:         (IOMethod)&IOCDAudioNubClient::playMSF;
        !           100:     fMethods[kPlayMSF].count0 = 2;
        !           101:     fMethods[kPlayMSF].count1 = 1;
        !           102:     fMethods[kPlayMSF].flags = kIOUCScalarIScalarO;
        !           103: 
        !           104:     return true;
        !           105: }
        !           106: 
        !           107: IOReturn IOCDAudioNubClient::clientClose( void )
        !           108: {
        !           109:     kprintf("IOCDAudioNubClient::clientClose\n");
        !           110:     if (fOwner) {
        !           111:         fOwner->close(this);
        !           112:         detach( fOwner);
        !           113:     }
        !           114:     return kIOReturnSuccess;
        !           115: }
        !           116: 
        !           117: IOReturn IOCDAudioNubClient::clientDied( void )
        !           118: {
        !           119:     return( clientClose());
        !           120: }
        !           121: 
        !           122: IOReturn IOCDAudioNubClient::connectClient( IOUserClient * client )
        !           123: {
        !           124:     return kIOReturnSuccess;
        !           125: }
        !           126: 
        !           127: IOExternalMethod * IOCDAudioNubClient::getExternalMethodForIndex( UInt32 index )
        !           128: {
        !           129:     kprintf("IOCDAudioNubClient::getExternalMethodForIndex: %d\n",index);
        !           130:     if(index >= kMethods) {
        !           131:         kprintf("IOCDAudioNubClient::getExternalMethodForIndex: bad index\n");
        !           132:        return NULL;
        !           133:     } else {
        !           134:         return &fMethods[index];
        !           135:     }
        !           136: }
        !           137: 
        !           138: IOReturn IOCDAudioNubClient::registerNotificationPort(
        !           139:             mach_port_t port, UInt32 type )
        !           140: {
        !           141:     return kIOReturnUnsupported;
        !           142: }
        !           143: 
        !           144: IOReturn IOCDAudioNubClient::clientMemoryForType( UInt32 type,
        !           145:     UInt32 * flags, IOMemoryDescriptor ** memory )
        !           146: {
        !           147:     return 1;
        !           148: }
        !           149:    
        !           150: IOReturn IOCDAudioNubClient::CDAudioNubTest(UInt32 opcode, UInt32 operand1, UInt32 operand2, UInt32 *status)
        !           151: {
        !           152:     // IOLog("IOCDAudioNubClient::CDAudioNubTest %d %d %d\n", opcode,operand1,operand2);
        !           153: 
        !           154:     if (!fOwner) return -2;
        !           155: 
        !           156:     switch(opcode) {
        !           157:         case 0:
        !           158:             return getNumAudioTracks(status);
        !           159:         case 1:
        !           160:             return getMSF(operand1-1,status);
        !           161:         case 2:
        !           162:             return playTrack(operand1-1,status);
        !           163:         case 3:
        !           164:             return pause(status);
        !           165:         case 4:
        !           166:             return resume(status);
        !           167:         case 5:
        !           168:             return getVolume(status);
        !           169:         case 6:
        !           170:             return setVolume((UInt8)operand1,(UInt8)operand2,status);
        !           171:         case 7:
        !           172:             return getAudioStatus(status,status,status,status);
        !           173:         case 8:
        !           174:             return playMSF(operand1,operand2,status);
        !           175:         case 9:
        !           176:             return readHeader(operand1,status);
        !           177:     }
        !           178:     
        !           179:     return -1;
        !           180: }
        !           181: 
        !           182: int subMSF(int m1, int m2)
        !           183: {   
        !           184:     int f1,f2;
        !           185:     int min,sec,frm;
        !           186: 
        !           187:     // convert to total frames
        !           188:     f1 = (m1 >> 16 & 0xff) * 75 * 60 +
        !           189:          (m1 >> 8 & 0xff) * 75 +
        !           190:          (m1  & 0xff);
        !           191:     f2 = (m2 >> 16 & 0xff) * 75 * 60 +
        !           192:          (m2 >> 8 & 0xff) * 75 +
        !           193:          (m2  & 0xff);
        !           194: 
        !           195:     // get the total difference in frames
        !           196:     m1 = f1 - f2;
        !           197: 
        !           198:     // convert make to MSF
        !           199:     min = (int)(m1 / (75 * 60));
        !           200:     m1 = m1 - min * 75 * 60;
        !           201:     sec = (int)(m1 / 75);
        !           202:     frm = m1 - sec * 75;
        !           203:     return (min << 16) | (sec << 8) | frm;
        !           204: }
        !           205: 
        !           206: IOReturn IOCDAudioNubClient::playTrack(UInt32 track,UInt32 *status)
        !           207: {
        !           208:     struct macEntireToc toc;
        !           209:     UInt32 starting_msf, ending_msf;
        !           210:     UInt32 starting_track, ending_track;
        !           211: 
        !           212:     if (!fOwner) return -2;
        !           213:     if (track > 101) return -1;
        !           214: 
        !           215:     // read the TOC
        !           216:     fOwner->readEntireTOC(&toc);
        !           217: 
        !           218:     // get the starting and ending MSF
        !           219:     starting_msf = (toc.entries[track].pMin << 16) |
        !           220:         (toc.entries[track].pSec << 8)  |
        !           221:         (toc.entries[track].pFrame);
        !           222: 
        !           223:     ending_msf = (toc.entries[track+1].pMin << 16) |
        !           224:         (toc.entries[track+1].pSec << 8)  |
        !           225:         (toc.entries[track+1].pFrame);
        !           226: 
        !           227:     if (ending_msf == 0) return -3;
        !           228: 
        !           229:     // subtrace one frame from the ending MSF
        !           230:     ending_msf = subMSF(ending_msf,1);
        !           231: 
        !           232:     // status returns the time
        !           233:     *status = subMSF(ending_msf,starting_msf);
        !           234: 
        !           235:     // IOLog("IOCDAudioNubClient::playTrack %d %x %x\n", track,starting_msf,ending_msf);
        !           236: 
        !           237:     // set the audio stop address
        !           238:     fOwner->setAudioStopAddress(kAbsoluteTime,(cdAddress)ending_msf);
        !           239: 
        !           240:    // send the play command and return immediately
        !           241:     return fOwner->audioPlay(kAbsoluteTime,(cdAddress)starting_msf,kNormalMode);
        !           242: }
        !           243: 
        !           244: IOReturn IOCDAudioNubClient::playMSF(
        !           245:              UInt32 starting_msf, UInt32 ending_msf, UInt32 *status)
        !           246: {
        !           247:     // status returns the time
        !           248:     *status = subMSF(ending_msf,starting_msf);
        !           249: 
        !           250:     // set the audio stop address
        !           251:     fOwner->setAudioStopAddress(kAbsoluteTime,(cdAddress)ending_msf);
        !           252: 
        !           253:    // send the play command and return immediately
        !           254:     return fOwner->audioPlay(kAbsoluteTime,(cdAddress)starting_msf,kNormalMode);
        !           255: }
        !           256: 
        !           257: IOReturn IOCDAudioNubClient::readHeader(UInt32 address, UInt32 *status)
        !           258: {
        !           259:     struct headerInfo buffer;
        !           260:     IOReturn ret;
        !           261: 
        !           262:     ret = fOwner->readHeader(address,&buffer);
        !           263:     *status = buffer.address;
        !           264:     return ret;
        !           265: }
        !           266: IOReturn IOCDAudioNubClient::getMSF(UInt32 track, UInt32 *status)
        !           267: {
        !           268:     struct macEntireToc toc;
        !           269:     UInt32 msf;
        !           270: 
        !           271:     if (!fOwner) return -2;
        !           272: 
        !           273:     // get the TOC
        !           274:     fOwner->readEntireTOC(&toc);
        !           275: 
        !           276:     // get the MSF
        !           277:     msf = (toc.entries[track].pMin << 16) |
        !           278:         (toc.entries[track].pSec << 8)  |
        !           279:         (toc.entries[track].pFrame);
        !           280: 
        !           281:    // status is the MSF
        !           282:    *status = msf;
        !           283: 
        !           284:    // IOLog("IOCDAudioNubClient::getMSF %d %x\n",track,msf);
        !           285:    return 0;
        !           286: }
        !           287: 
        !           288: IOReturn IOCDAudioNubClient::getNumAudioTracks(UInt32 *status)
        !           289: {
        !           290:     struct macEntireToc toc;
        !           291:     UInt32 track = 0;
        !           292: 
        !           293:     if (!fOwner) return -2;
        !           294: 
        !           295:     // get the TOC
        !           296:     fOwner->readEntireTOC(&toc);
        !           297: 
        !           298:     // count the number of tracks
        !           299:     for(;;) {
        !           300:          if (!toc.entries[track].trackPoint) break;
        !           301:          track++;
        !           302:     }
        !           303:     if (track) track--;
        !           304: 
        !           305:     // status returns the number of tracks
        !           306:     *status = track;
        !           307: 
        !           308:     // IOLog("IOCDAudioNubClient::getNumAudioTracks %d\n",track);
        !           309:     return 0;
        !           310: }
        !           311: 
        !           312: IOReturn IOCDAudioNubClient::pause(UInt32 *status)
        !           313: {
        !           314:     if (!fOwner) return -2;
        !           315:     *status = 0;
        !           316:     return fOwner->audioPause(true);
        !           317: }
        !           318: 
        !           319: IOReturn IOCDAudioNubClient::resume(UInt32 *status)
        !           320: {
        !           321:     if (!fOwner) return -2;
        !           322:     *status = 0;
        !           323:     return fOwner->audioPause(false);
        !           324: }
        !           325: 
        !           326: IOReturn IOCDAudioNubClient::getVolume(UInt32 *status)
        !           327: {
        !           328:     UInt8 right, left;
        !           329:     IOReturn ret;
        !           330: 
        !           331:     if (!fOwner) return -2;
        !           332:     ret = fOwner->readAudioVolume(&left,&right);
        !           333:     *status = (left << 8 & 0xff00) | (right & 0xff);
        !           334:     return ret;
        !           335: }
        !           336: 
        !           337: IOReturn IOCDAudioNubClient::setVolume(UInt8 left, UInt8 right, UInt32 *status)
        !           338: {
        !           339:     IOReturn ret;
        !           340: 
        !           341:     // IOLog("IOCDAudioNubClient::setVolume %d %d\n",left,right);
        !           342: 
        !           343:     if (!fOwner) return -2;
        !           344:     ret = fOwner->setVolume(left,right);
        !           345:     *status = (left << 8 & 0xff00) | (right & 0xff);
        !           346:     return ret;
        !           347: }
        !           348: 
        !           349: IOReturn IOCDAudioNubClient::getAudioStatus(UInt32 *status,
        !           350:              UInt32 *absAddress, UInt32 *relAddress, UInt32 *trackType)
        !           351: {
        !           352:     IOReturn ret;
        !           353:     struct audioStatus stat;
        !           354:     struct qSubcode buffer;
        !           355:     bool found;
        !           356:     UInt8 buf[15];
        !           357: 
        !           358:     ret = fOwner->getAudioStatus(&stat);
        !           359:     *status = stat.status;
        !           360:     *trackType = stat.type;
        !           361: 
        !           362:     ret = fOwner->readTheQSubcode(&buffer);
        !           363:     *relAddress = buffer.relAddress;
        !           364:     *absAddress = buffer.absAddress;
        !           365: 
        !           366:     // IOLog("IOCDAudioNubClient::getAudioStatus abs=0x%x rel=0x%x status=%d type=%x\n", *absAddress, *relAddress, *status, *trackType);
        !           367: 
        !           368:     return ret;
        !           369: }

unix.superglobalmegacorp.com

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