AppleTAS3004Audio.h [plain text]
#ifndef _APPLETAS3004AUDIO_H
#define _APPLETAS3004AUDIO_H
#include "TAS_hw.h"
#include "AppleDBDMAAudio.h"
#include "AppleOnboardAudio.h"
#include "AudioHardwareObjectInterface.h"
#include "AppleOnboardAudioUserClient.h"
static UInt32 volumeTable[] = { 0x00000000, 0x00000015, 0x00000016, 0x00000017, 0x00000019, 0x0000001A, 0x0000001C, 0x0000001D, 0x0000001F, 0x00000021, 0x00000023, 0x00000025, 0x00000027, 0x00000029, 0x0000002C, 0x0000002E, 0x00000031, 0x00000034, 0x00000037, 0x0000003A, 0x0000003E, 0x00000042, 0x00000045, 0x0000004A, 0x0000004E, 0x00000053, 0x00000057, 0x0000005D, 0x00000062, 0x00000068, 0x0000006E, 0x00000075, 0x0000007B, 0x00000083, 0x0000008B, 0x00000093, 0x0000009B, 0x000000A5, 0x000000AE, 0x000000B9, 0x000000C4, 0x000000CF, 0x000000DC, 0x000000E9, 0x000000F6, 0x00000105, 0x00000114, 0x00000125, 0x00000136, 0x00000148, 0x0000015C, 0x00000171, 0x00000186, 0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB, 0x00000209, 0x00000227, 0x00000248, 0x0000026B, 0x0000028F, 0x000002B6, 0x000002DF, 0x0000030B, 0x00000339, 0x0000036A, 0x0000039E, 0x000003D5, 0x0000040F, 0x0000044C, 0x0000048D, 0x000004D2, 0x0000051C, 0x00000569, 0x000005BB, 0x00000612, 0x0000066E, 0x000006D0, 0x00000737, 0x000007A5, 0x00000818, 0x00000893, 0x00000915, 0x0000099F, 0x00000A31, 0x00000ACC, 0x00000B6F, 0x00000C1D, 0x00000CD5, 0x00000D97, 0x00000E65, 0x00000F40, 0x00001027, 0x0000111C, 0x00001220, 0x00001333, 0x00001456, 0x0000158A, 0x000016D1, 0x0000182B, 0x0000199A, 0x00001B1E, 0x00001CB9, 0x00001E6D, 0x0000203A, 0x00002223, 0x00002429, 0x0000264E, 0x00002893, 0x00002AFA, 0x00002D86, 0x00003039, 0x00003314, 0x0000361B, 0x00003950, 0x00003CB5, 0x0000404E, 0x0000441D, 0x00004827, 0x00004C6D, 0x000050F4, 0x000055C0, 0x00005AD5, 0x00006037, 0x000065EA, 0x00006BF4, 0x0000725A, 0x00007920, 0x0000804E, 0x000087EF, 0x00008FF6, 0x0000987D, 0x0000A186, 0x0000AB19, 0x0000B53C, 0x0000BFF9, 0x0000CB59, 0x0000D766, 0x0000E429, 0x0000F1AE, 0x00010000, 0x00010F2B, 0x00011F3D, 0x00013042, 0x00014249, 0x00015562, 0x0001699C, 0x00017F09, 0x000195BC, 0x0001ADC6, 0x0001C73D, 0x0001E237, 0x0001FECA, 0x00021D0E, 0x00023D1D, 0x00025F12, 0x0002830B, 0x0002A925, 0x0002D182, 0x0002FC42, 0x0003298B, 0x00035983, 0x00038C53, 0x0003C225, 0x0003FB28, 0x0004378B, 0x00047783, 0x0004BB44, 0x0005030A, 0x00054F10, 0x00059F98, 0x0005F4E5, 0x00064F40, 0x0006AEF6, 0x00071457, 0x00077FBB, 0x0007F17B };
static IOFixed volumedBTable[] = {
-70 << 16, -70 << 16, -69 << 16 | 0x8000, -69 << 16, -68 << 16 | 0x8000,
-68 << 16, -67 << 16 | 0x8000, -67 << 16, -66 << 16 | 0x8000,
-66 << 16, -65 << 16 | 0x8000, -65 << 16, -64 << 16 | 0x8000,
-64 << 16, -63 << 16 | 0x8000, -63 << 16, -62 << 16 | 0x8000,
-62 << 16, -61 << 16 | 0x8000, -61 << 16, -60 << 16 | 0x8000,
-60 << 16, -59 << 16 | 0x8000, -59 << 16, -58 << 16 | 0x8000,
-58 << 16, -57 << 16 | 0x8000, -57 << 16, -56 << 16 | 0x8000,
-56 << 16, -55 << 16 | 0x8000, -55 << 16, -54 << 16 | 0x8000,
-54 << 16, -53 << 16 | 0x8000, -53 << 16, -52 << 16 | 0x8000,
-52 << 16, -51 << 16 | 0x8000, -51 << 16, -50 << 16 | 0x8000,
-50 << 16, -49 << 16 | 0x8000, -49 << 16, -48 << 16 | 0x8000,
-48 << 16, -47 << 16 | 0x8000, -47 << 16, -46 << 16 | 0x8000,
-46 << 16, -45 << 16 | 0x8000, -45 << 16, -44 << 16 | 0x8000,
-44 << 16, -43 << 16 | 0x8000, -43 << 16, -42 << 16 | 0x8000,
-42 << 16, -41 << 16 | 0x8000, -41 << 16, -40 << 16 | 0x8000,
-40 << 16, -39 << 16 | 0x8000, -39 << 16, -38 << 16 | 0x8000,
-38 << 16, -37 << 16 | 0x8000, -37 << 16, -36 << 16 | 0x8000,
-36 << 16, -35 << 16 | 0x8000, -35 << 16, -34 << 16 | 0x8000,
-34 << 16, -33 << 16 | 0x8000, -33 << 16, -32 << 16 | 0x8000,
-32 << 16, -31 << 16 | 0x8000, -31 << 16, -30 << 16 | 0x8000,
-30 << 16, -29 << 16 | 0x8000, -29 << 16, -28 << 16 | 0x8000,
-28 << 16, -27 << 16 | 0x8000, -27 << 16, -26 << 16 | 0x8000,
-26 << 16, -25 << 16 | 0x8000, -25 << 16, -24 << 16 | 0x8000,
-24 << 16, -23 << 16 | 0x8000, -23 << 16, -22 << 16 | 0x8000,
-22 << 16, -21 << 16 | 0x8000, -21 << 16, -20 << 16 | 0x8000,
-20 << 16, -19 << 16 | 0x8000, -19 << 16, -18 << 16 | 0x8000,
-18 << 16, -17 << 16 | 0x8000, -17 << 16, -16 << 16 | 0x8000,
-16 << 16, -15 << 16 | 0x8000, -15 << 16, -14 << 16 | 0x8000,
-14 << 16, -13 << 16 | 0x8000, -13 << 16, -12 << 16 | 0x8000,
-12 << 16, -11 << 16 | 0x8000, -11 << 16, -10 << 16 | 0x8000,
-10 << 16, -9 << 16 | 0x8000, -9 << 16, -8 << 16 | 0x8000,
-8 << 16, -7 << 16 | 0x8000, -7 << 16, -6 << 16 | 0x8000,
-6 << 16, -5 << 16 | 0x8000, -5 << 16, -4 << 16 | 0x8000,
-4 << 16, -3 << 16 | 0x8000, -3 << 16, -2 << 16 | 0x8000,
-2 << 16, -1 << 16 | 0x8000, -1 << 16, 0 << 16 | 0x8000,
0 << 16, 0 << 16 | 0x8000, +1 << 16, +1 << 16 | 0x8000,
+2 << 16, +2 << 16 | 0x8000, +3 << 16, +3 << 16 | 0x8000,
+4 << 16, +4 << 16 | 0x8000, +5 << 16, +5 << 16 | 0x8000,
+6 << 16, +6 << 16 | 0x8000, +7 << 16, +7 << 16 | 0x8000,
+8 << 16, +8 << 16 | 0x8000, +9 << 16, +9 << 16 | 0x8000,
+10 << 16, +10 << 16 | 0x8000, +11 << 16, +11 << 16 | 0x8000,
+12 << 16, +12 << 16 | 0x8000, +13 << 16, +13 << 16 | 0x8000,
+14 << 16, +14 << 16 | 0x8000, +15 << 16, +15 << 16 | 0x8000,
+16 << 16, +16 << 16 | 0x8000, +17 << 16, +17 << 16 | 0x8000,
+18 << 16
};
#define kTAS3004_SLEEP_TIME_MICROSECONDS 976000
class IORegistryEntry;
class AppleTAS3004Audio : public AudioHardwareObjectInterface
{
OSDeclareDefaultStructors(AppleTAS3004Audio);
private:
SInt32 minVolume;
SInt32 maxVolume;
Boolean gVolMuteActive;
Boolean headphonesActive;
Boolean lineOutActive;
Boolean headphonesConnected;
Boolean lineOutConnected;
Boolean dallasSpeakersConnected;
UInt32 layoutID; UInt32 familyID; UInt32 speakerID; UInt32 detectCollection;
TAS3004_ShadowReg shadowTAS3004Regs; TAS3004_ShadowReg standbyTAS3004Regs; Boolean mSemaphores;
UInt32 deviceID;
AppleOnboardAudio * mAudioDeviceProvider;
Boolean mTAS_WasDead;
Boolean mEQDisabled;
static const UInt8 kDEQAddress;
public:
virtual bool init (OSDictionary *properties);
virtual void free ();
virtual bool start (IOService * provider);
virtual bool willTerminate (IOService * provider, IOOptionBits options);
virtual bool requestTerminate (IOService * provider, IOOptionBits options);
virtual bool preDMAEngineInit () ;
virtual void initPlugin (PlatformInterface* inPlatformObject);
virtual IOReturn setActiveInput (UInt32 input);
virtual IOReturn setCodecMute (bool mutestate); virtual IOReturn setCodecMute (bool muteState, UInt32 streamType); virtual bool hasAnalogMute (); virtual UInt32 getMaximumdBVolume (void);
virtual UInt32 getMinimumdBVolume (void);
virtual UInt32 getMaximumVolume (void);
virtual UInt32 getMinimumVolume (void);
virtual UInt32 getMaximumdBGain (void);
virtual UInt32 getMinimumdBGain (void);
virtual UInt32 getMaximumGain (void);
virtual UInt32 getMinimumGain (void);
virtual UInt32 getDefaultInputGain (void);
virtual UInt32 getDefaultOutputVolume (void);
virtual bool setCodecVolume (UInt32 leftVolume, UInt32 rightVolume);
virtual IOReturn setPlayThrough (bool playthroughstate);
virtual void setEQProcessing (void * inEQStructure, Boolean inRealtime);
virtual void setDRCProcessing (void * inDRCStructure, Boolean inRealtime);
virtual void disableProcessing (Boolean inRealtime);
virtual void enableProcessing (void);
virtual void notifyHardwareEvent ( UInt32 statusSelector, UInt32 newValue ) { return; }
virtual IOReturn recoverFromFatalError ( FatalRecoverySelector selector );
virtual IOReturn performSetPowerState ( UInt32 currentPowerState, UInt32 pendingPowerState ); virtual IOReturn performDeviceWake ();
virtual IOReturn performDeviceSleep ();
virtual IOReturn setSampleRate ( UInt32 sampleRate );
virtual IOReturn setSampleDepth ( UInt32 sampleDepth );
virtual UInt32 getClockLock ( void ) { return 0; }
virtual IOReturn breakClockSelect ( UInt32 clockSource );
virtual IOReturn makeClockSelect ( UInt32 clockSource );
virtual void poll ( void ) { return; }
virtual IOReturn requestSleepTime ( UInt32 * microsecondsUntilComplete );
virtual IOReturn getPluginState ( HardwarePluginDescriptorPtr outState );
virtual IOReturn setPluginState ( HardwarePluginDescriptorPtr inState );
virtual HardwarePluginType getPluginType ( void );
private:
IOReturn SetVolumeCoefficients (UInt32 left, UInt32 right);
IOReturn SetAmplifierMuteState (UInt32 ampID, Boolean muteState);
IOReturn InitEQSerialMode (UInt32 mode);
IOReturn GetShadowRegisterInfo( TAS3004_ShadowReg * shadowRegsPtr, UInt8 regAddr, UInt8 ** shadowPtr, UInt8* registerSize );
IOReturn CODEC_Initialize ();
void CODEC_Reset ( void );
IOReturn CODEC_ReadRegister (UInt8 regAddr, UInt8* registerData);
IOReturn CODEC_WriteRegister (UInt8 regAddr, UInt8* registerData, UInt8 mode);
void SetBiquadInfoToUnityAllPass (void);
void SetUnityGainAllPass (void);
IOReturn BuildCustomEQCoefficients ( void * eqPrefs );
IOReturn SndHWSetOutputBiquad( UInt32 streamID, UInt32 biquadRefNum, FourDotTwenty *biquadCoefficients );
IOReturn SndHWSetOutputBiquadGroup( UInt32 biquadFilterCount, FourDotTwenty *biquadCoefficients );
IOReturn SetOutputBiquadCoefficients (UInt32 streamID, UInt32 biquadRefNum, UInt8 *biquadCoefficients);
IOReturn setBiquadCoefficients ( void * biquadCoefficients );
IOReturn SetAnalogPowerDownMode( UInt8 mode );
IORegistryEntry * FindEntryByProperty (const IORegistryEntry * start, const char * key, const char * value);
IORegistryEntry * FindEntryByNameAndProperty (const IORegistryEntry * start, const char * name, const char * key, UInt32 value);
Boolean HasInput (void);
enum {
kMaximumVolume = 141,
kMinimumVolume = 0,
kInitialVolume = 101
};
enum {
kInternalSpeakerActive = 1,
kHeadphonesActive = 2,
kExternalSpeakersActive = 4
};
EQPrefsElement mEQPref;
};
#endif