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