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