IOCDAudioControlUserClient.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/IOLib.h>
#include <IOKit/storage/IOCDAudioControlUserClient.h>
#include <libkern/OSByteOrder.h>
#define super IOUserClient
OSDefineMetaClassAndStructors(IOCDAudioControlUserClient, IOUserClient)
IOCDAudioControl * IOCDAudioControlUserClient::getProvider() const
{
return (IOCDAudioControl *) IOService::getProvider();
}
IOCDAudioControlUserClient * IOCDAudioControlUserClient::withTask(task_t)
{
IOCDAudioControlUserClient * me = new IOCDAudioControlUserClient;
if ( me && me->init() == false )
{
me->release();
me = 0;
}
return me;
}
bool IOCDAudioControlUserClient::start(IOService * provider)
{
assert(OSDynamicCast(IOCDAudioControl, provider));
if ( super::start(provider) == false ) return false;
if ( provider->open(this) == false ) return false;
_methods[kIOCDAudioControlMethodGetStatus].func = (IOMethod) &IOCDAudioControlUserClient::getStatus;
_methods[kIOCDAudioControlMethodGetStatus].flags = kIOUCScalarIStructO;
_methods[kIOCDAudioControlMethodGetStatus].count0 = 0;
_methods[kIOCDAudioControlMethodGetStatus].count1 = sizeof(CDAudioStatus);
_methods[kIOCDAudioControlMethodGetStatus].object = this;
_methods[kIOCDAudioControlMethodGetTOC ].func = (IOMethod) &IOCDAudioControlUserClient::getTOC;
_methods[kIOCDAudioControlMethodGetTOC ].flags = kIOUCScalarIStructO;
_methods[kIOCDAudioControlMethodGetTOC ].count0 = 0;
_methods[kIOCDAudioControlMethodGetTOC ].count1 = 0xFFFFFFFF;
_methods[kIOCDAudioControlMethodGetTOC ].object = this;
_methods[kIOCDAudioControlMethodGetVolume].func = (IOMethod) &IOCDAudioControlUserClient::getVolume;
_methods[kIOCDAudioControlMethodGetVolume].flags = kIOUCScalarIScalarO;
_methods[kIOCDAudioControlMethodGetVolume].count0 = 0;
_methods[kIOCDAudioControlMethodGetVolume].count1 = 2;
_methods[kIOCDAudioControlMethodGetVolume].object = this;
_methods[kIOCDAudioControlMethodSetVolume].func = (IOMethod) &IOCDAudioControlUserClient::setVolume;
_methods[kIOCDAudioControlMethodSetVolume].flags = kIOUCScalarIScalarO;
_methods[kIOCDAudioControlMethodSetVolume].count0 = 2;
_methods[kIOCDAudioControlMethodSetVolume].count1 = 0;
_methods[kIOCDAudioControlMethodSetVolume].object = this;
_methods[kIOCDAudioControlMethodPause ].func = (IOMethod) &IOCDAudioControlUserClient::pause;
_methods[kIOCDAudioControlMethodPause ].flags = kIOUCScalarIScalarO;
_methods[kIOCDAudioControlMethodPause ].count0 = 1;
_methods[kIOCDAudioControlMethodPause ].count1 = 0;
_methods[kIOCDAudioControlMethodPause ].object = this;
_methods[kIOCDAudioControlMethodPlay ].func = (IOMethod) &IOCDAudioControlUserClient::play;
_methods[kIOCDAudioControlMethodPlay ].flags = kIOUCScalarIScalarO;
_methods[kIOCDAudioControlMethodPlay ].count0 = 2;
_methods[kIOCDAudioControlMethodPlay ].count1 = 0;
_methods[kIOCDAudioControlMethodPlay ].object = this;
_methods[kIOCDAudioControlMethodScan ].func = (IOMethod) &IOCDAudioControlUserClient::scan;
_methods[kIOCDAudioControlMethodScan ].flags = kIOUCScalarIScalarO;
_methods[kIOCDAudioControlMethodScan ].count0 = 2;
_methods[kIOCDAudioControlMethodScan ].count1 = 0;
_methods[kIOCDAudioControlMethodScan ].object = this;
_methods[kIOCDAudioControlMethodStop ].func = (IOMethod) &IOCDAudioControlUserClient::stop;
_methods[kIOCDAudioControlMethodStop ].flags = 0;
_methods[kIOCDAudioControlMethodStop ].count0 = 0;
_methods[kIOCDAudioControlMethodStop ].count1 = 0;
_methods[kIOCDAudioControlMethodStop ].object = this;
return true;
}
IOReturn IOCDAudioControlUserClient::clientClose()
{
IOCDAudioControl * provider = getProvider();
if ( provider && provider->isOpen(this) )
{
provider->close(this);
detach(provider);
}
return kIOReturnSuccess;
}
IOExternalMethod * IOCDAudioControlUserClient::getExternalMethodForIndex(
UInt32 index )
{
if (index >= kIOCDAudioControlMethodCount) return 0;
return _methods + index;
}
IOReturn IOCDAudioControlUserClient::getStatus( CDAudioStatus * status,
UInt32 * statusSize )
{
if ( *statusSize != sizeof(CDAudioStatus) ) return kIOReturnBadArgument;
return getProvider()->getStatus(status);
}
IOReturn IOCDAudioControlUserClient::getTOC(CDTOC * toc, UInt32 * tocMaxSize)
{
CDTOC * original = getProvider()->getTOC();
if (original == 0) return kIOReturnBadMedia;
*tocMaxSize = min(
OSSwapBigToHostInt16(original->length) + sizeof(original->length),
*tocMaxSize );
bcopy(original, toc, *tocMaxSize);
return kIOReturnSuccess;
}
IOReturn IOCDAudioControlUserClient::getVolume(UInt32 * left, UInt32 * right)
{
IOReturn status;
if ( ((*left) & ~0xFF) || ((*right) & ~0xFF) ) return kIOReturnBadArgument;
status = getProvider()->getVolume((UInt8 *) left, (UInt8 *) right);
*left = *((UInt8 *) left );
*right = *((UInt8 *) right);
return status;
}
IOReturn IOCDAudioControlUserClient::setVolume(UInt32 left, UInt32 right)
{
if ( (left & ~0xFF) || (right & ~0xFF) ) return kIOReturnBadArgument;
return getProvider()->setVolume((UInt8) left, (UInt8) right);
}
IOReturn IOCDAudioControlUserClient::pause(UInt32 pause)
{
return getProvider()->pause((bool) pause);
}
IOReturn IOCDAudioControlUserClient::play(UInt32 msfStart, UInt32 msfStop)
{
CDMSF timeStart;
CDMSF timeStop;
timeStart.minute = (msfStart >> 16) & 0xFF;
timeStart.second = (msfStart >> 8) & 0xFF;
timeStart.frame = (msfStart >> 0) & 0xFF;
timeStop.minute = (msfStop >> 16) & 0xFF;
timeStop.second = (msfStop >> 8) & 0xFF;
timeStop.frame = (msfStop >> 0) & 0xFF;
return getProvider()->play(timeStart, timeStop);
}
IOReturn IOCDAudioControlUserClient::scan(UInt32 msfStart, UInt32 reverse)
{
CDMSF timeStart;
timeStart.minute = (msfStart >> 16) & 0xFF;
timeStart.second = (msfStart >> 8) & 0xFF;
timeStart.frame = (msfStart >> 0) & 0xFF;
return getProvider()->scan(timeStart, reverse ? true : false);
}
IOReturn IOCDAudioControlUserClient::stop()
{
return getProvider()->stop();
}
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 0);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 1);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 2);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 3);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 4);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 5);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 6);
OSMetaClassDefineReservedUnused(IOCDAudioControlUserClient, 7);