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