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