Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "Configuration.h"
     18 #ifdef ANDROID
     19 #include <jni.h>
     20 
     21 #include "media/AudioEffect.h"
     22 #endif
     23 
     24 /* Interface structures */
     25 
     26 typedef struct Object_interface {
     27     const struct SLObjectItf_ *mItf;    // const
     28     // field mThis would be redundant within an IObject, so we substitute mEngine
     29     CEngine *mEngine;               // const
     30     const ClassTable *mClass;       // const
     31     SLuint32 mInstanceID;           // const for debugger and for RPC, 0 means unpublished
     32     slObjectCallback mCallback;
     33     void *mContext;
     34     unsigned mGottenMask;           ///< bit-mask of interfaces exposed or added, then gotten
     35     unsigned mLossOfControlMask;    // interfaces with loss of control enabled
     36     unsigned mAttributesMask;       // attributes which have changed since last sync
     37 #if USE_PROFILES & USE_PROFILES_BASE
     38     SLint32 mPriority;
     39 #endif
     40     pthread_mutex_t mMutex;
     41 #ifdef USE_DEBUG
     42     // Only keep the pthread_t, not the kernel tid, because pthread_self() is very fast
     43     // (typically just arithmetic on the stack pointer). But a gettid() is a kernel call
     44     // and so too slow to do every time a mutex is acquired. However, we can determine
     45     // the kernel tid from the pthread_t.
     46     pthread_t mOwner;
     47     const char *mFile;
     48     int mLine;
     49     volatile int32_t mGeneration;   // read without a lock, incremented with a lock
     50 #endif
     51     pthread_cond_t mCond;
     52     SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
     53 #if USE_PROFILES & USE_PROFILES_BASE
     54     SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
     55 #else
     56     SLuint8 mPadding;
     57 #endif
     58     SLuint8 mStrongRefCount;        // number of strong references to this object
     59     // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state)
     60     // for best alignment, do not add any fields here
     61 #define INTERFACES_Default 1
     62     SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
     63     // do not add any fields here
     64 } IObject;
     65 
     66 #include "locks.h"
     67 
     68 typedef struct {
     69     const struct SL3DCommitItf_ *mItf;
     70     IObject *mThis;
     71     SLboolean mDeferred;
     72     SLuint32 mGeneration;   // incremented each master clock cycle
     73     SLuint32 mWaiting;      // number of threads waiting in Commit
     74 } I3DCommit;
     75 
     76 enum CartesianSphericalActive {
     77     CARTESIAN_COMPUTED_SPHERICAL_SET,
     78     CARTESIAN_REQUESTED_SPHERICAL_SET,
     79     CARTESIAN_UNKNOWN_SPHERICAL_SET,
     80     CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
     81     CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
     82     CARTESIAN_SET_SPHERICAL_UNKNOWN
     83 };
     84 
     85 typedef struct {
     86     const struct SL3DDopplerItf_ *mItf;
     87     IObject *mThis;
     88     // The API allows client to specify either Cartesian and spherical velocities.
     89     // But an implementation will likely prefer one or the other. So for
     90     // maximum portablity, we maintain both units and an indication of which
     91     // unit was set most recently. In addition, we keep a flag saying whether
     92     // the other unit has been derived yet. It can take significant time
     93     // to compute the other unit, so this may be deferred to another thread.
     94     // For this reason we also keep an indication of whether the secondary
     95     // has been computed yet, and its accuracy.
     96     // Though only one unit is primary at a time, a union is inappropriate:
     97     // the application might read in both units (not in 1.0.1),
     98     // and due to multi-threading concerns.
     99     SLVec3D mVelocityCartesian;
    100     struct {
    101         SLmillidegree mAzimuth;
    102         SLmillidegree mElevation;
    103         SLmillidegree mSpeed;
    104     } mVelocitySpherical;
    105     enum CartesianSphericalActive mVelocityActive;
    106     SLpermille mDopplerFactor;
    107 } I3DDoppler;
    108 
    109 typedef struct {
    110     const struct SL3DGroupingItf_ *mItf;
    111     IObject *mThis;
    112     C3DGroup *mGroup;   // strong reference to associated group or NULL
    113 } I3DGrouping;
    114 
    115 enum AnglesVectorsActive {
    116     ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
    117     ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
    118     ANGLES_UNKNOWN_VECTORS_SET,
    119     ANGLES_SET_VECTORS_COMPUTED,
    120     ANGLES_SET_VECTORS_REQUESTED,
    121     ANGLES_SET_VECTORS_UNKNOWN
    122 };
    123 
    124 typedef struct {
    125     const struct SL3DLocationItf_ *mItf;
    126     IObject *mThis;
    127     SLVec3D mLocationCartesian;
    128     struct {
    129         SLmillidegree mAzimuth;
    130         SLmillidegree mElevation;
    131         SLmillimeter mDistance;
    132     } mLocationSpherical;
    133     enum CartesianSphericalActive mLocationActive;
    134     struct {
    135         SLmillidegree mHeading;
    136         SLmillidegree mPitch;
    137         SLmillidegree mRoll;
    138     } mOrientationAngles;
    139     struct {
    140         SLVec3D mFront;
    141         SLVec3D mAbove;
    142         SLVec3D mUp;
    143     } mOrientationVectors;
    144     enum AnglesVectorsActive mOrientationActive;
    145     // Rotations can be slow, so are deferred.
    146     SLmillidegree mTheta;
    147     SLVec3D mAxis;
    148     SLboolean mRotatePending;
    149 } I3DLocation;
    150 
    151 typedef struct {
    152     const struct SL3DMacroscopicItf_ *mItf;
    153     IObject *mThis;
    154     struct {
    155         SLmillimeter mWidth;
    156         SLmillimeter mHeight;
    157         SLmillimeter mDepth;
    158     } mSize;
    159     struct {
    160         SLmillimeter mHeading;
    161         SLmillimeter mPitch;
    162         SLmillimeter mRoll;
    163     } mOrientationAngles;
    164     struct {
    165         SLVec3D mFront;
    166         SLVec3D mAbove;
    167         SLVec3D mUp;
    168     } mOrientationVectors;
    169     enum AnglesVectorsActive mOrientationActive;
    170     // Rotations can be slow, so are deferred.
    171     SLmillidegree mTheta;
    172     SLVec3D mAxis;
    173     SLboolean mRotatePending;
    174 } I3DMacroscopic;
    175 
    176 typedef struct {
    177     const struct SL3DSourceItf_ *mItf;
    178     IObject *mThis;
    179     SLboolean mHeadRelative;
    180     SLboolean mRolloffMaxDistanceMute;
    181     SLmillimeter mMaxDistance;
    182     SLmillimeter mMinDistance;
    183     SLmillidegree mConeInnerAngle;
    184     SLmillidegree mConeOuterAngle;
    185     SLmillibel mConeOuterLevel;
    186     SLpermille mRolloffFactor;
    187     SLpermille mRoomRolloffFactor;
    188     SLuint8 mDistanceModel;
    189 } I3DSource;
    190 
    191 typedef struct {
    192     const struct SLAudioDecoderCapabilitiesItf_ *mItf;
    193     IObject *mThis;
    194 } IAudioDecoderCapabilities;
    195 
    196 typedef struct {
    197     const struct SLAudioEncoderItf_ *mItf;
    198     IObject *mThis;
    199     SLAudioEncoderSettings mSettings;
    200 } IAudioEncoder;
    201 
    202 typedef struct {
    203     const struct SLAudioEncoderCapabilitiesItf_ *mItf;
    204     IObject *mThis;
    205 } IAudioEncoderCapabilities;
    206 
    207 typedef struct {
    208     const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
    209     IObject *mThis;
    210     slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
    211     void *mAvailableAudioInputsChangedContext;
    212     slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
    213     void *mAvailableAudioOutputsChangedContext;
    214     slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
    215     void *mDefaultDeviceIDMapChangedContext;
    216 } IAudioIODeviceCapabilities;
    217 
    218 typedef struct {
    219     const struct SLBassBoostItf_ *mItf;
    220     IObject *mThis;
    221     SLboolean mEnabled;
    222     SLpermille mStrength;
    223 #if defined(ANDROID)
    224     effect_descriptor_t mBassBoostDescriptor;
    225     android::sp<android::AudioEffect> mBassBoostEffect;
    226 #endif
    227 } IBassBoost;
    228 
    229 typedef struct BufferQueue_interface {
    230     const struct SLBufferQueueItf_ *mItf;
    231     IObject *mThis;
    232     SLBufferQueueState mState;
    233     slBufferQueueCallback mCallback;
    234     void *mContext;
    235     // originally SLuint32, but range-checked down to SLuint16
    236     SLuint16 mNumBuffers;
    237     /*SLboolean*/ SLuint16 mClearRequested;
    238     BufferHeader *mArray;
    239     BufferHeader *mFront, *mRear;
    240 #ifdef ANDROID
    241     SLuint32 mSizeConsumed;
    242     bool mCallbackPending;
    243 #endif
    244     // saves a malloc in the typical case
    245 #define BUFFER_HEADER_TYPICAL 4
    246     BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
    247 } IBufferQueue;
    248 
    249 #define MAX_DEVICE 2    // hard-coded array size for default in/out
    250 
    251 typedef struct {
    252     const struct SLDeviceVolumeItf_ *mItf;
    253     IObject *mThis;
    254     SLint32 mVolume[MAX_DEVICE];
    255 } IDeviceVolume;
    256 
    257 typedef struct {
    258     const struct SLDynamicInterfaceManagementItf_ *mItf;
    259     IObject *mThis;
    260     slDynamicInterfaceManagementCallback mCallback;
    261     void *mContext;
    262 } IDynamicInterfaceManagement;
    263 
    264 typedef struct {
    265     const struct SLDynamicSourceItf_ *mItf;
    266     IObject *mThis;
    267     SLDataSource *mDataSource;
    268 } IDynamicSource;
    269 
    270 // private
    271 
    272 struct EnableLevel {
    273     SLboolean mEnable;
    274     SLmillibel mSendLevel;
    275 };
    276 
    277 // indexes into IEffectSend.mEnableLevels
    278 
    279 #define AUX_ENVIRONMENTALREVERB 0
    280 #define AUX_PRESETREVERB        1
    281 #define AUX_MAX                 2
    282 
    283 typedef struct {
    284     const struct SLEffectSendItf_ *mItf;
    285     IObject *mThis;
    286     struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
    287 } IEffectSend;
    288 
    289 typedef struct Engine_interface {
    290     const struct SLEngineItf_ *mItf;
    291     IObject *mThis;
    292     SLboolean mLossOfControlGlobal;
    293 #ifdef USE_SDL
    294     COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
    295 #endif
    296     // Each engine is its own universe.
    297     SLuint32 mInstanceCount;
    298     unsigned mInstanceMask; // 1 bit per active object
    299     unsigned mChangedMask;  // objects which have changed since last sync
    300 #define MAX_INSTANCE 32     // maximum active objects per engine, see mInstanceMask
    301     IObject *mInstances[MAX_INSTANCE];
    302     SLboolean mShutdown;
    303     SLboolean mShutdownAck;
    304     // SLuint32 mVersion;      // 0xXXYYZZ where XX=major, YY=minor, ZZ=step
    305     SLuint32 mNativeEndianness; // one of SL_BYTEORDER_LITTLEENDIAN or SL_BYTEORDER_BIGENDIAN
    306 } IEngine;
    307 
    308 typedef struct {
    309     const struct SLEngineCapabilitiesItf_ *mItf;
    310     IObject *mThis;
    311     SLboolean mThreadSafe;
    312     // const
    313     SLuint32 mMaxIndexLED;
    314     SLuint32 mMaxIndexVibra;
    315 } IEngineCapabilities;
    316 
    317 typedef struct {
    318     const struct SLEnvironmentalReverbItf_ *mItf;
    319     IObject *mThis;
    320     SLEnvironmentalReverbSettings mProperties;
    321 #if defined(ANDROID)
    322     effect_descriptor_t mEnvironmentalReverbDescriptor;
    323     android::sp<android::AudioEffect> mEnvironmentalReverbEffect;
    324 #endif
    325 } IEnvironmentalReverb;
    326 
    327 struct EqualizerBand {
    328     SLmilliHertz mMin;
    329     SLmilliHertz mCenter;
    330     SLmilliHertz mMax;
    331 };
    332 
    333 #if defined(ANDROID)
    334 #define MAX_EQ_BANDS 0
    335 #else
    336 #define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
    337 #endif
    338 
    339 typedef struct {
    340     const struct SLEqualizerItf_ *mItf;
    341     IObject *mThis;
    342     SLboolean mEnabled;
    343     SLuint16 mPreset;
    344 #if 0 < MAX_EQ_BANDS
    345     SLmillibel mLevels[MAX_EQ_BANDS];
    346 #endif
    347     // const to end of struct
    348     SLuint16 mNumPresets;
    349     SLuint16 mNumBands;
    350 #if !defined(ANDROID)
    351     const struct EqualizerBand *mBands;
    352     const struct EqualizerPreset *mPresets;
    353 #endif
    354     SLmillibel mBandLevelRangeMin;
    355     SLmillibel mBandLevelRangeMax;
    356 #if defined(ANDROID)
    357     effect_descriptor_t mEqDescriptor;
    358     android::sp<android::AudioEffect> mEqEffect;
    359 #endif
    360 } IEqualizer;
    361 
    362 #define MAX_LED_COUNT 32
    363 
    364 typedef struct {
    365     const struct SLLEDArrayItf_ *mItf;
    366     IObject *mThis;
    367     SLuint32 mLightMask;
    368     SLHSL mColors[MAX_LED_COUNT];
    369     // const
    370     SLuint8 mCount;
    371 } ILEDArray;
    372 
    373 typedef struct {
    374     const struct SLMetadataExtractionItf_ *mItf;
    375     IObject *mThis;
    376     SLuint32 mKeySize;
    377     const void *mKey;
    378     SLuint32 mKeyEncoding;
    379     const SLchar *mValueLangCountry;
    380     SLuint32 mValueEncoding;
    381     SLuint8 mFilterMask;
    382     int mKeyFilter;
    383 } IMetadataExtraction;
    384 
    385 typedef struct {
    386     const struct SLMetadataTraversalItf_ *mItf;
    387     IObject *mThis;
    388     SLuint32 mIndex;
    389     SLuint32 mMode;
    390     SLuint32 mCount;
    391     SLuint32 mSize;
    392 } IMetadataTraversal;
    393 
    394 typedef struct {
    395     const struct SLMIDIMessageItf_ *mItf;
    396     IObject *mThis;
    397     slMetaEventCallback mMetaEventCallback;
    398     void *mMetaEventContext;
    399     slMIDIMessageCallback mMessageCallback;
    400     void *mMessageContext;
    401     SLuint8 mMessageTypes;
    402 } IMIDIMessage;
    403 
    404 typedef struct {
    405     const struct SLMIDIMuteSoloItf_ *mItf;
    406     IObject *mThis;
    407     SLuint16 mChannelMuteMask;
    408     SLuint16 mChannelSoloMask;
    409     SLuint32 mTrackMuteMask;
    410     SLuint32 mTrackSoloMask;
    411     // const
    412     SLuint16 mTrackCount;
    413 } IMIDIMuteSolo;
    414 
    415 typedef struct {
    416     const struct SLMIDITempoItf_ *mItf;
    417     IObject *mThis;
    418     SLuint32 mTicksPerQuarterNote;
    419     SLuint32 mMicrosecondsPerQuarterNote;
    420 } IMIDITempo;
    421 
    422 typedef struct {
    423     const struct SLMIDITimeItf_ *mItf;
    424     IObject *mThis;
    425     SLuint32 mDuration;
    426     SLuint32 mPosition;
    427     SLuint32 mStartTick;
    428     SLuint32 mNumTicks;
    429 } IMIDITime;
    430 
    431 typedef struct {
    432     const struct SLMuteSoloItf_ *mItf;
    433     IObject *mThis;
    434     // fields that were formerly here are now at CAudioPlayer
    435 } IMuteSolo;
    436 
    437 #define MAX_TRACK 32        // see mActiveMask
    438 
    439 typedef struct {
    440     const struct SLOutputMixItf_ *mItf;
    441     IObject *mThis;
    442     slMixDeviceChangeCallback mCallback;
    443     void *mContext;
    444 } IOutputMix;
    445 
    446 #ifdef USE_OUTPUTMIXEXT
    447 typedef struct {
    448     const struct SLOutputMixExtItf_ *mItf;
    449     IObject *mThis;
    450     unsigned mActiveMask;   // 1 bit per active track
    451     Track mTracks[MAX_TRACK];
    452     SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
    453 } IOutputMixExt;
    454 #endif
    455 
    456 typedef struct {
    457     const struct SLPitchItf_ *mItf;
    458     IObject *mThis;
    459     SLpermille mPitch;
    460     // const
    461     SLpermille mMinPitch;
    462     SLpermille mMaxPitch;
    463 } IPitch;
    464 
    465 typedef struct Play_interface {
    466     const struct SLPlayItf_ *mItf;
    467     IObject *mThis;
    468     SLuint32 mState;
    469     // next 2 fields are read-only to application
    470     SLmillisecond mDuration;
    471     SLmillisecond mPosition;
    472     slPlayCallback mCallback;
    473     void *mContext;
    474     SLuint32 mEventFlags;
    475     // the ISeek trick of using a distinct value doesn't work here because it's readable by app
    476     SLmillisecond mMarkerPosition;
    477     SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0)
    478 #ifdef USE_OUTPUTMIXEXT
    479     SLuint32 mFrameUpdatePeriod;         // mPositionUpdatePeriod in frame units
    480     SLmillisecond mLastSeekPosition;     // Last known accurate position, set at Seek
    481     SLuint32 mFramesSinceLastSeek;       // Frames mixed since last known accurate position
    482     SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback
    483 #endif
    484 } IPlay;
    485 
    486 typedef struct {
    487     const struct SLPlaybackRateItf_ *mItf;
    488     IObject *mThis;
    489     SLpermille mRate;
    490     SLuint32 mProperties;
    491     // const after initialization
    492     SLpermille mMinRate;
    493     SLpermille mMaxRate;
    494     SLpermille mStepSize;
    495     SLuint32 mCapabilities;
    496 } IPlaybackRate;
    497 
    498 typedef struct {
    499     const struct SLPrefetchStatusItf_ *mItf;
    500     IObject *mThis;
    501     SLuint32 mStatus;
    502     SLpermille mLevel;
    503     slPrefetchCallback mCallback;
    504     void *mContext;
    505     SLuint32 mCallbackEventsMask;
    506     SLpermille mFillUpdatePeriod;
    507 #ifdef ANDROID
    508     /** FIXME used to call PrefetchStatus callback with object unlocked prior to return from API */
    509     slPrefetchCallback mDeferredPrefetchCallback;
    510     void *mDeferredPrefetchContext;
    511     SLuint32 mDeferredPrefetchEvents;
    512 #endif
    513 } IPrefetchStatus;
    514 
    515 typedef struct {
    516     const struct SLPresetReverbItf_ *mItf;
    517     IObject *mThis;
    518     SLuint16 mPreset;
    519 #if defined(ANDROID)
    520     effect_descriptor_t mPresetReverbDescriptor;
    521     android::sp<android::AudioEffect> mPresetReverbEffect;
    522 #endif
    523 } IPresetReverb;
    524 
    525 typedef struct {
    526     const struct SLRatePitchItf_ *mItf;
    527     IObject *mThis;
    528     SLpermille mRate;
    529     // const
    530     SLpermille mMinRate;
    531     SLpermille mMaxRate;
    532 } IRatePitch;
    533 
    534 typedef struct {
    535     const struct SLRecordItf_ *mItf;
    536     IObject *mThis;
    537     SLuint32 mState;
    538     SLmillisecond mDurationLimit;
    539     SLmillisecond mPosition;
    540     slRecordCallback mCallback;
    541     void *mContext;
    542     SLuint32 mCallbackEventsMask;
    543     SLmillisecond mMarkerPosition;
    544     SLmillisecond mPositionUpdatePeriod;
    545 } IRecord;
    546 
    547 typedef struct {
    548     const struct SLSeekItf_ *mItf;
    549     IObject *mThis;
    550     SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
    551     SLboolean mLoopEnabled;
    552     SLmillisecond mStartPos;
    553     SLmillisecond mEndPos;
    554 } ISeek;
    555 
    556 typedef struct {
    557     const struct SLThreadSyncItf_ *mItf;
    558     IObject *mThis;
    559     SLboolean mInCriticalSection;
    560     SLuint32 mWaiting;  // number of threads waiting
    561     pthread_t mOwner;
    562 } IThreadSync;
    563 
    564 typedef struct {
    565     const struct SLVibraItf_ *mItf;
    566     IObject *mThis;
    567     SLboolean mVibrate;
    568     SLmilliHertz mFrequency;
    569     SLpermille mIntensity;
    570 } IVibra;
    571 
    572 typedef struct {
    573     const struct SLVirtualizerItf_ *mItf;
    574     IObject *mThis;
    575     SLboolean mEnabled;
    576     SLpermille mStrength;
    577 #if defined(ANDROID)
    578     effect_descriptor_t mVirtualizerDescriptor;
    579     android::sp<android::AudioEffect> mVirtualizerEffect;
    580 #endif
    581 } IVirtualizer;
    582 
    583 typedef struct {
    584     const struct SLVisualizationItf_ *mItf;
    585     IObject *mThis;
    586     slVisualizationCallback mCallback;
    587     void *mContext;
    588     SLmilliHertz mRate;
    589 } IVisualization;
    590 
    591 typedef struct /*Volume_interface*/ {
    592     const struct SLVolumeItf_ *mItf;
    593     IObject *mThis;
    594     // Values as specified by the application
    595     SLmillibel mLevel;
    596     SLpermille mStereoPosition;
    597     SLuint8 /*SLboolean*/ mMute;
    598     SLuint8 /*SLboolean*/ mEnableStereoPosition;
    599 } IVolume;
    600 
    601 typedef struct {
    602     const struct XAEngineItf_ *mItf;
    603     IObject *mThis;
    604 } IXAEngine;
    605 
    606 #define NB_SUPPORTED_STREAMS 1 // only one (video) stream supported in this implementation
    607 typedef struct {
    608     const struct XAStreamInformationItf_ *mItf;
    609     IObject *mThis;
    610     xaStreamEventChangeCallback mCallback;
    611     void *mContext;
    612     XAboolean mActiveStreams[NB_SUPPORTED_STREAMS];
    613 #ifdef ANDROID
    614     android::Vector<StreamInfo> mStreamInfoTable;
    615 #endif
    616 } IStreamInformation;
    617 
    618 typedef struct {
    619     const struct XAVideoDecoderCapabilitiesItf_ *mItf;
    620     IObject *mThis;
    621 } IVideoDecoderCapabilities;
    622 
    623 /* Class structures */
    624 
    625 /*typedef*/ struct C3DGroup_struct {
    626     IObject mObject;
    627 #define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
    628     SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
    629     IDynamicInterfaceManagement mDynamicInterfaceManagement;
    630     I3DLocation m3DLocation;
    631     I3DDoppler m3DDoppler;
    632     I3DSource m3DSource;
    633     I3DMacroscopic m3DMacroscopic;
    634     // remaining are per-instance private fields not associated with an interface
    635     unsigned mMemberMask;   // set of member objects
    636 } /*C3DGroup*/;
    637 
    638 #ifdef ANDROID
    639 
    640 // FIXME Move these into the I... section above
    641 
    642 typedef struct {
    643     const struct SLAndroidEffectItf_ *mItf;
    644     IObject *mThis;
    645     android::KeyedVector<SLuint32, android::sp<android::AudioEffect> > *mEffects;
    646 } IAndroidEffect;
    647 
    648 typedef struct {
    649     const struct SLAndroidEffectCapabilitiesItf_ *mItf;
    650     IObject *mThis;
    651     SLuint32 mNumFx;
    652     effect_descriptor_t* mFxDescriptors;
    653 } IAndroidEffectCapabilities;
    654 
    655 typedef struct {
    656     const struct SLAndroidEffectSendItf_ *mItf;
    657     IObject *mThis;
    658     // only one send per interface for now (1 bus)
    659     SLboolean mEnabled;
    660     SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels;
    661 } IAndroidEffectSend;
    662 
    663 typedef struct {
    664     const struct SLAndroidConfigurationItf_ *mItf;
    665     IObject *mThis;
    666     // only 1 each. When we support other Proxy types, we will need to get more clever about this.
    667     jobject mRoutingProxy;
    668 } IAndroidConfiguration;
    669 
    670 typedef struct {
    671     const struct SLAndroidBufferQueueItf_ *mItf;
    672     IObject *mThis;
    673     SLAndroidBufferQueueState mState;
    674     slAndroidBufferQueueCallback mCallback;
    675     SLuint32 mCallbackEventsMask;
    676     void *mContext;
    677     SLuint16 mNumBuffers;
    678     AndroidBufferType_type mBufferType;
    679     AdvancedBufferHeader *mBufferArray;
    680     AdvancedBufferHeader *mFront, *mRear;
    681     bool mEOS;  // whether EOS has been enqueued; never reset
    682 } IAndroidBufferQueue;
    683 
    684 typedef struct {
    685     const struct SLAndroidAcousticEchoCancellationItf_ *mItf;
    686     IObject *mThis;
    687     SLboolean mEnabled;
    688     effect_descriptor_t mAECDescriptor;
    689     android::sp<android::AudioEffect> mAECEffect;
    690 } IAndroidAcousticEchoCancellation;
    691 
    692 typedef struct {
    693     const struct SLAndroidAutomaticGainControlItf_ *mItf;
    694     IObject *mThis;
    695     SLboolean mEnabled;
    696      effect_descriptor_t mAGCDescriptor;
    697      android::sp<android::AudioEffect> mAGCEffect;
    698 } IAndroidAutomaticGainControl;
    699 
    700 typedef struct {
    701     const struct SLAndroidNoiseSuppressionItf_ *mItf;
    702     IObject *mThis;
    703     SLboolean mEnabled;
    704     effect_descriptor_t mNSDescriptor;
    705     android::sp<android::AudioEffect> mNSEffect;
    706 } IAndroidNoiseSuppression;
    707 
    708 #endif
    709