AppleOnboardAudioUserClient.cpp [plain text]
#include "AppleOnboardAudioUserClient.h"
#include "AppleOnboardAudio.h"
#include "AudioHardwareUtilities.h"
#include "PlatformInterface.h"
const IOExternalMethod AppleOnboardAudioUserClient::sMethods[] =
{
{
NULL, ( IOMethod ) &AppleOnboardAudioUserClient::getState, kIOUCScalarIStructO, 2, kUserClientStateStructSize, },
{
NULL, ( IOMethod ) &AppleOnboardAudioUserClient::setState, kIOUCScalarIStructI, 2, kUserClientStateStructSize, },
{
NULL, ( IOMethod ) &AppleOnboardAudioUserClient::getCurrentSampleFrame, kIOUCScalarIScalarO, 0, 1 }
};
const IOItemCount AppleOnboardAudioUserClient::sMethodCount = sizeof (AppleOnboardAudioUserClient::sMethods) / sizeof (AppleOnboardAudioUserClient::sMethods[0]);
OSDefineMetaClassAndStructors( AppleOnboardAudioUserClient, IOUserClient )
AppleOnboardAudioUserClient * AppleOnboardAudioUserClient::Create( AppleOnboardAudio *inDriver, task_t inTask )
{
AppleOnboardAudioUserClient * userClient;
userClient = new AppleOnboardAudioUserClient;
if( !userClient )
{
debugIOLog (3, "[AppleOnboardAudio] create user client object failed" );
goto exit;
}
if( !userClient->initWithDriver( inDriver, inTask ) )
{
debugIOLog (3, "[AppleOnboardAudio] initWithDriver failed" );
userClient->release();
userClient = NULL;
goto exit;
}
exit:
return( userClient );
}
bool AppleOnboardAudioUserClient::initWithDriver( AppleOnboardAudio *inDriver, task_t inTask )
{
bool result;
result = false;
if( !initWithTask( inTask, NULL, 0 ) )
{
debugIOLog (3, " initWithTask failed" );
goto exit;
}
if( !inDriver )
{
debugIOLog (3, " initWithDriver failed (null input driver)" );
goto exit;
}
mDriver = inDriver;
mClientTask = inTask;
result = true;
exit:
return( result );
}
void AppleOnboardAudioUserClient::free( void )
{
IOUserClient::free();
}
IOReturn AppleOnboardAudioUserClient::clientClose( void )
{
if( !isInactive() )
{
mDriver = NULL;
}
return( kIOReturnSuccess );
}
IOReturn AppleOnboardAudioUserClient::clientDied( void )
{
return( clientClose() );
}
IOExternalMethod * AppleOnboardAudioUserClient::getTargetAndMethodForIndex( IOService **outTarget, UInt32 inIndex )
{
IOExternalMethod * methodPtr;
methodPtr = NULL;
if( inIndex <= sMethodCount ) {
*outTarget = this;
methodPtr = ( IOExternalMethod * ) &sMethods[ inIndex ];
} else {
debugIOLog (3, "[AppleOnboardAudio] getTargetAndMethodForIndex - bad index (index=%lu)", inIndex );
}
return( methodPtr );
}
IOReturn AppleOnboardAudioUserClient::getState (UInt32 selector, UInt32 arg2, void * outState) {
IOReturn err;
err = kIOReturnError;
if ( NULL != mDriver && NULL != outState ) {
switch (selector) {
case kPlatformSelector:
err = mDriver->getPlatformState ( arg2, (PlatformStateStructPtr)outState );
break;
case kHardwarePluginSelector:
err = mDriver->getPluginState ( (HardwarePluginType)arg2, (HardwarePluginDescriptorPtr)outState );
break;
case kDMASelector:
err = mDriver->getDMAStateAndFormat ( arg2, outState );
break;
case kSoftwareProcessingSelector:
err = mDriver->getSoftwareProcessingState ( arg2, outState );
break;
case kRealTimeCPUUsage:
err = mDriver->getRealTimeCPUUsage ( arg2, outState );
break;
case kAppleOnboardAudioSelector:
err = mDriver->getAOAState ( arg2, outState );
break;
case kTransportInterfaceSelector:
err = mDriver->getTransportInterfaceState ( arg2, outState );
break;
default:
debugIOLog (3, "Unknown user client selector (%ld)", selector);
break;
}
}
return (err);
}
IOReturn AppleOnboardAudioUserClient::setState (UInt32 selector, UInt32 arg2, void * inState) {
IOReturn err;
err = kIOReturnError;
if ( NULL != mDriver ) {
switch (selector) {
case kPlatformSelector:
err = mDriver->setPlatformState ( arg2, (PlatformStateStructPtr)inState );
break;
case kHardwarePluginSelector:
err = mDriver->setPluginState ( (HardwarePluginType)arg2, (HardwarePluginDescriptorPtr)inState );
break;
case kDMASelector:
err = mDriver->setDMAStateAndFormat ( arg2, inState );
break;
case kSoftwareProcessingSelector:
err = mDriver->setSoftwareProcessingState ( arg2, inState );
break;
case kAppleOnboardAudioSelector:
err = mDriver->setAOAState ( arg2, inState );
break;
case kTransportInterfaceSelector:
err = mDriver->setTransportInterfaceState ( arg2, inState );
break;
default:
debugIOLog (3, "Unknown user client selector (%ld)", selector);
break;
}
}
if ( kIOReturnSuccess != err ) {
debugIOLog ( 5, "AppleOnboardAudioUserClient::setState ( %d, %d, %p ) returns %lX", selector, arg2, inState, err );
}
return (err);
}
IOReturn AppleOnboardAudioUserClient::getCurrentSampleFrame (UInt32 * outCurrentSampleFrame) {
IOReturn err;
err = kIOReturnError;
if ( NULL != mDriver && NULL != outCurrentSampleFrame ) {
*outCurrentSampleFrame = mDriver->getCurrentSampleFrame ();
err = kIOReturnSuccess;
}
return (err);
}
#if 0
enum
{
kAOAUserClientGetStateIndex = 0, kAOAUserClientSetStateIndex, kAOAUserClientGetCurrentSampleFrame };
static IOReturn SetupUserClient( void );
static void TearDownUserClient( void );
static mach_port_t gMasterPort = 0;
static io_object_t gDriverObject = 0;
static io_connect_t gDataPort = 0;
static IOReturn SetupUserClient( void )
{
IOReturn err;
CFDictionaryRef matchingDictionary;
io_iterator_t serviceIter;
err = kIOReturnSuccess;
matchingDictionary = NULL;
serviceIter = NULL;
if( gDataPort )
{
goto exit;
}
err = IOMasterPort( NULL, &gMasterPort );
if( err != kIOReturnSuccess ) goto exit;
err = kIOReturnNotFound;
matchingDictionary = IOServiceNameMatching( "AppleOnboardAudio" );
if( !matchingDictionary ) goto exit;
err = IOServiceGetMatchingServices( gMasterPort, matchingDictionary, &serviceIter );
if( err != kIOReturnSuccess ) goto exit;
matchingDictionary = NULL;
err = kIOReturnNotFound;
gDriverObject = IOIteratorNext( serviceIter );
if( !gDriverObject ) goto exit;
err = IOServiceOpen( gDriverObject, mach_task_self(), 0, &gDataPort );
if( err != kIOReturnSuccess ) goto exit;
exit:
if( serviceIter )
{
IOObjectRelease( serviceIter );
}
if( matchingDictionary )
{
CFRelease( matchingDictionary );
}
if( err != kIOReturnSuccess )
{
TearDownUserClient();
}
return( err );
}
static void TearDownUserClient( void )
{
if( gDataPort )
{
IOServiceClose( gDataPort );
gDataPort = 0;
}
if( gDriverObject )
{
IOObjectRelease( gDriverObject );
gDriverObject = NULL;
}
if( gMasterPort )
{
mach_port_deallocate( mach_task_self(), gMasterPort );
gMasterPort = 0;
}
}
OSStatus getState( UInt32 selector, UInt32 target, UInt32 arg2, void * outState )
{
OSStatus err;
err = SetupUserClient();
if( err != noErr ) goto exit;
err = IOConnectMethodScalarIStructO( gDataPort, kGetStateIndex, 2, kAOAUserClientStructSize, selector, target, outState );
if( err != noErr ) goto exit;
exit:
return( err );
}
OSStatus setState( UInt32 selector, UInt32 target, UInt32 arg2 void * inState )
{
OSStatus err;
err = SetupUserClient();
if( err != noErr ) goto exit;
err = IOConnectMethodScalarIStructI( gDataPort, kSetStateIndex, 2, kAOAUserClientStructSize, selector, target, inState );
if( err != noErr ) goto exit;
exit:
return( err );
}
OSStatus getCurrentSampleFrame( UInt32 selector, UInt32 * outCurrentSampleFrame )
{
OSStatus err;
err = SetupUserClient();
if( err != noErr ) goto exit;
err = IOConnectMethodScalarIScalarO( gDataPort, kgpiogetAddressIndex, 2, selector, outCurrentSampleFrame );
if( err != noErr ) goto exit;
exit:
return( err );
}
#endif