[plain text]
#ifndef _APPLEUSBAUDIODEVICE_H
#define _APPLEUSBAUDIODEVICE_H
#include <libkern/c++/OSCollectionIterator.h>
#include <IOKit/IOLocks.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOKitKeys.h>
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IOMessage.h>
#include <IOKit/audio/IOAudioDevice.h>
#include <IOKit/audio/IOAudioEngine.h>
#include <IOKit/audio/IOAudioPort.h>
#include <IOKit/audio/IOAudioControl.h>
#include <IOKit/audio/IOAudioStream.h>
#include <IOKit/audio/IOAudioDefines.h>
#include <IOKit/audio/IOAudioSelectorControl.h>
#include <IOKit/usb/USB.h>
#include <IOKit/usb/IOUSBInterface.h>
#include <IOKit/usb/IOUSBRootHubDevice.h>
#include "AppleUSBAudioEngine.h"
#include "AppleUSBAudioCommon.h"
#include "AppleUSBAudioDictionary.h"
#define kStringBufferSize 255
#define kNegativeInfinity 0x8000
enum {
kIOUSBVendorIDHarmonKardon = 0x05FC,
kIOUSBVendorMicronas = 0x074D
};
enum {
kVolumeControl = 1,
kMuteControl = 2
};
enum {
kStudioDisplay15CRT = 0x9115,
kStudioDisplay17CRT = 0x9113,
kCinemaDisplay = 0x9116,
kStudioDisplay17FP = 0x9117
};
class IOUSBInterface;
class AppleUSBAudioEngine;
#define kEngine "engine"
#define kInterface "interface"
#define kAltSetting "altsetting"
#define kInputGainControls "inputgaincontrols"
#define kInputMuteControls "inputmutecontrols"
#define kPassThruVolControls "passthrucontrols"
#define kOutputVolControls "outputvolcontrols"
#define kPassThruPathsArray "passthrupathsarray"
#define kWallTimeExtraPrecision 10000ull
#define kMaxWallTimePerUSBCycle 1001000ull
#define kMinWallTimePerUSBCycle 999000ull
class AppleUSBAudioDevice : public IOAudioDevice {
OSDeclareDefaultStructors (AppleUSBAudioDevice);
public:
IOUSBInterface * mControlInterface;
UInt64 mWallTimePerUSBCycle;
UInt64 mNewReferenceUSBFrame;
AbsoluteTime mNewReferenceWallTime;
UInt64 mLastUSBFrame;
UInt64 mLastWallTime_nanos;
#if DEBUGANCHORS
UInt64 mAnchorFrames[kAnchorsToAccumulate];
AbsoluteTime mAnchorTimes[kAnchorsToAccumulate];
#endif
protected:
AUAConfigurationDictionary * mConfigDictionary;
OSArray * mControlGraph;
OSArray * mClockGraph;
IORecursiveLock * mInterfaceLock;
Boolean mTerminatingDriver;
thread_call_t mInitHardwareThread;
thread_call_t mRetryEQDownloadThread;
Boolean mDeviceIsInMonoMode;
OSArray * mMonoControlsArray; OSArray * mRegisteredEngines;
UInt8 mAnchorResetCount;
IOTimerEventSource * mUpdateTimer;
bool mSingleSampleRateDevice;
AppleUSBAudioEngine * mFailingAudioEngine;
AppleUSBAudioEngine * mEngineToRestart;
bool mShouldAttemptDeviceRecovery;
public:
virtual bool start (IOService * provider);
virtual void free ();
virtual void stop (IOService *provider);
virtual bool initHardware (IOService * provider);
static void initHardwareThread (AppleUSBAudioDevice * aua, void * provider);
static IOReturn initHardwareThreadAction (OSObject * owner, void * provider, void * arg2, void * arg3, void * arg4);
virtual IOReturn protectedInitHardware (IOService * provider);
virtual Boolean ShouldUpdatePRAM (void);
Boolean FindSoundNode (void);
virtual IOReturn message (UInt32 type, IOService * provider, void * arg);
virtual bool ControlsStreamNumber (UInt8 streamNumber);
virtual IOReturn createControlsForInterface (IOAudioEngine *audioEngine, UInt8 interfaceNum, UInt8 altSettingNum);
virtual void setConfigurationApp (const char *bundleID);
virtual IOReturn performPowerStateChange (IOAudioDevicePowerState oldPowerState, IOAudioDevicePowerState newPowerState, UInt32 *microSecsUntilComplete);
virtual bool willTerminate (IOService * provider, IOOptionBits options);
virtual OSArray * BuildConnectionGraph (UInt8 controlInterfaceNum);
virtual OSArray * BuildPath (UInt8 controlInterfaceNum, UInt8 startingUnitID, OSArray *allPaths, OSArray * thisPath);
virtual OSArray * buildClockGraph (UInt8 controlInterfaceNum); virtual OSArray * buildClockPath (UInt8 controlInterfaceNum, UInt8 startingUnitID, OSArray *allPaths, OSArray * thisPath); virtual IOReturn addSampleRatesFromClockSpace ( void ); virtual IOReturn addSampleRatesFromClockPath ( OSArray * path, UInt8 streamInterface, UInt8 altSetting ); virtual IOReturn getClockSourceSampleRates ( OSArray ** sampleRates, UInt8 clockSource ); virtual OSArray * getOptimalClockPath ( AppleUSBAudioEngine * thisEngine, UInt8 streamInterface, UInt8 altSetting, UInt32 sampleRate, Boolean * otherEngineNeedSampleRateChange ); virtual Boolean supportSampleRateInClockPath ( OSArray * pathArray, UInt32 sampleRate ); virtual UInt32 determineClockPathUnitUsage ( AppleUSBAudioEngine * thisEngine, OSArray * thisClockPath ); virtual Boolean clockPathCrossed ( OSArray * clockPathA, OSArray * clockPathB ); virtual char * TerminalTypeString (UInt16 terminalType);
virtual SInt32 getEngineInfoIndex (AppleUSBAudioEngine * inAudioEngine);
virtual IOReturn doControlStuff (IOAudioEngine *audioEngine, UInt8 interfaceNum, UInt8 altSettingNum);
virtual IOReturn doPlaythroughSetup (AppleUSBAudioEngine * usbAudioEngine, OSArray * playThroughPaths, UInt8 interfaceNum, UInt8 altSettingNum);
virtual IOReturn addSelectorSourcesToSelectorControl (IOAudioSelectorControl * theSelectorControl, OSArray * arrayOfPathsFromOutputTerminal, UInt32 pathsToOutputTerminalN, UInt8 selectorIndex);
virtual OSString * getNameForPath (OSArray * arrayOfPathsFromOutputTerminal, UInt32 * pathIndex, UInt8 startingPoint);
virtual OSString * getNameForMixerPath (OSArray * arrayOfPathsFromOutputTerminal, UInt32 * pathIndex, UInt8 startingPoint);
static IOReturn controlChangedHandler (OSObject *target, IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOReturn protectedControlChangedHandler (IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOReturn doSelectorControlChange (IOAudioControl * audioControl, SInt32 oldValue, SInt32 newValue);
virtual UInt8 getSelectorSetting (UInt8 selectorID);
virtual IOReturn setSelectorSetting (UInt8 selectorID, UInt8 setting);
virtual IOReturn getFeatureUnitRange (UInt8 controlSelector, UInt8 unitID, UInt8 channelNumber, UInt8 requestType, SubRange16 * target) ;
virtual IOReturn getFeatureUnitSetting (UInt8 controlSelector, UInt8 unitID, UInt8 channelNumber, UInt8 requestType, SInt16 * target);
virtual IOReturn setFeatureUnitSetting (UInt8 controlSelector, UInt8 unitID, UInt8 channelNumber, UInt8 requestType, UInt16 newValue, UInt16 newValueLen);
virtual OSArray * getPlaythroughPaths ();
virtual UInt8 getBestFeatureUnitInPath (OSArray * thePath, UInt32 direction, UInt8 interfaceNum, UInt8 altSettingNum, UInt32 controlTypeWanted);
virtual void addVolumeControls (AppleUSBAudioEngine * usbAudioEngine, UInt8 featureUnitID, UInt8 interfaceNum, UInt8 altSettingNum, UInt32 usage);
virtual void addMuteControl (AppleUSBAudioEngine * usbAudioEngine, UInt8 featureUnitID, UInt8 interfaceNum, UInt8 altSettingNum, UInt32 usage);
virtual IOReturn getCurMute (UInt8 unitID, UInt8 channelNumber, SInt16 * target);
virtual IOReturn getCurVolume (UInt8 unitID, UInt8 channelNumber, SInt16 * target);
virtual IOReturn getMaxVolume (UInt8 unitID, UInt8 channelNumber, SInt16 * target);
virtual IOReturn getMinVolume (UInt8 unitID, UInt8 channelNumber, SInt16 * target);
virtual IOReturn getVolumeResolution (UInt8 unitID, UInt8 channelNumber, UInt16 * target);
virtual IOReturn setCurVolume (UInt8 unitID, UInt8 channelNumber, SInt16 volume);
virtual IOReturn setCurMute (UInt8 unitID, UInt8 channelNumber, SInt16 mute);
virtual IOReturn doInputSelectorChange (IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOReturn doVolumeControlChange (IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOReturn doToggleControlChange (IOAudioControl *audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOReturn doPassThruSelectorChange (IOAudioControl * audioControl, SInt32 oldValue, SInt32 newValue);
virtual IOFixed ConvertUSBVolumeTodB (SInt16 volume);
virtual void setMonoState (Boolean state);
virtual UInt8 getDeviceSpeed (); virtual bool detectSplitTransactions (); virtual Boolean checkForUHCI ();
virtual AUAConfigurationDictionary * getConfigDictionary (void) {return mConfigDictionary;}
virtual IOReturn deviceRequest (IOUSBDevRequest * request, IOUSBCompletion * completion = NULL); virtual IOReturn deviceRequest (IOUSBDevRequestDesc * request, IOUSBCompletion * completion = NULL);
static IOReturn deviceRequest (IOUSBDevRequest * request, AppleUSBAudioDevice * self, IOUSBCompletion * completion = 0);
#ifdef DEBUG
virtual void retain() const;
virtual void release() const;
#endif
virtual bool matchPropertyTable (OSDictionary * table, SInt32 *score);
virtual IOReturn getAnchorFrameAndTimeStamp (UInt64 *frame, AbsoluteTime *time);
virtual IOReturn getFrameAndTimeStamp (UInt64 *frame, AbsoluteTime *time);
virtual UInt64 getWallTimeInNanos (void);
virtual UInt64 jitterFilter (UInt64 invCoefficient, UInt64 prev, UInt64 curr);
virtual UInt32 formatChangeController (IOAudioEngine *audioEngine, IOAudioStream *audioStream, const IOAudioStreamFormat *newFormat, const IOAudioSampleRate *newSampleRate);
virtual bool getSingleSampleRateDevice (void) {return mSingleSampleRateDevice;};
virtual void setSingleSampleRateDevice (bool isSingleSampleRateDevice) {mSingleSampleRateDevice = isSingleSampleRateDevice;};
virtual void setShouldSyncSampleRates (AppleUSBAudioEngine * problemEngine) {mFailingAudioEngine = problemEngine;};
virtual void setShouldResetEngine ( AppleUSBAudioEngine * problemEngine ) { mEngineToRestart = problemEngine; };
virtual AppleUSBAudioEngine * otherEngine (AppleUSBAudioEngine * thisEngine);
virtual IOReturn getBothEngines (AppleUSBAudioEngine ** firstEngine, AppleUSBAudioEngine ** secondEngine);
virtual void attemptDeviceRecovery (void);
virtual void requestDeviceRecovery (void) {mShouldAttemptDeviceRecovery = true;};
virtual bool recoveryRequested (void) {return mShouldAttemptDeviceRecovery;};
virtual IOReturn getClockSetting (UInt8 controlSelector, UInt8 unitID, UInt8 requestType, void * target, UInt16 length);
virtual IOReturn setClockSetting (UInt8 controlSelector, UInt8 unitID, UInt8 requestType, void * target, UInt16 length);
virtual IOReturn getNumClockSourceSamplingFrequencySubRanges (UInt8 unitID, UInt16 * numSubRanges);
virtual IOReturn getIndexedClockSourceSamplingFrequencySubRange (UInt8 unitID, SubRange32 * subRange, UInt16 subRangeIndex);
virtual IOReturn getCurClockSourceSamplingFrequency (UInt8 unitID, UInt32 * samplingFrequency, bool * validity);
virtual IOReturn setCurClockSourceSamplingFrequency (UInt8 unitID, UInt32 samplingFrequency);
virtual IOReturn getCurClockSelector (UInt8 unitID, UInt8 * selector);
virtual IOReturn setCurClockSelector (UInt8 unitID, UInt8 selector);
virtual IOReturn getCurClockMultiplier (UInt8 unitID, UInt16 * numerator, UInt16 * denominator);
virtual IOReturn getNumSampleRatesForClockPath (UInt8 * numSampleRates, OSArray * clockPath);
virtual IOReturn getIndexedSampleRatesForClockPath (SubRange32 * sampleRates, OSArray * clockPath, UInt32 rangeIndex);
virtual IOReturn getClockPathCurSampleRate (UInt32 * sampleRate, Boolean * validity, OSArray * clockPath);
virtual IOReturn setClockPathCurSampleRate (UInt32 sampleRate, OSArray * clockPath);
private:
virtual void resetRateTimer (); virtual void updateWallTimePerUSBCycle ();
static void TimerAction (OSObject * owner, IOTimerEventSource * sender);
virtual void doTimerAction (IOTimerEventSource * timer);
#if DEBUGANCHORS
virtual void accumulateAnchor (UInt64 anchorFrame, AbsoluteTime timeStamp);
#endif
virtual UInt8 pathsContaining (UInt8 unitID);
};
#endif
Generated by GNU enscript 1.6.4.