itfstruct.h revision 4ce38604afa7e4f629d568f400b0634504e60a2e
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;
240cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
241cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // saves a malloc in the typical case
242cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define BUFFER_HEADER_TYPICAL 4
243cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
244cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IBufferQueue;
245cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
246cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_DEVICE 2    // hard-coded array size for default in/out
247cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
248cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
249cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLDeviceVolumeItf_ *mItf;
250cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
251cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLint32 mVolume[MAX_DEVICE];
252cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IDeviceVolume;
253cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
254cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
255cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLDynamicInterfaceManagementItf_ *mItf;
256cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
257cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slDynamicInterfaceManagementCallback mCallback;
258cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
259cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IDynamicInterfaceManagement;
260cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
261cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
262cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLDynamicSourceItf_ *mItf;
263cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
264cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLDataSource *mDataSource;
265cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IDynamicSource;
266cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
267cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// private
268cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
269cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastenstruct EnableLevel {
270cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mEnable;
271cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mSendLevel;
272cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten};
273cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
274cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// indexes into IEffectSend.mEnableLevels
275cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
276cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0
277cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define AUX_PRESETREVERB        1
278cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define AUX_MAX                 2
279cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
280cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
281cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLEffectSendItf_ *mItf;
282cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
283cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
284cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IEffectSend;
285cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
286cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct Engine_interface {
287cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLEngineItf_ *mItf;
288cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
289cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mLossOfControlGlobal;
290cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_SDL
291cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
292cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
293cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // Each engine is its own universe.
294cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mInstanceCount;
295cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    unsigned mInstanceMask; // 1 bit per active object
296cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
297cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_INSTANCE 32     // maximum active objects per engine, see mInstanceMask
298cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mInstances[MAX_INSTANCE];
299cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mShutdown;
300cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mShutdownAck;
301cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // SLuint32 mVersion;      // 0xXXYYZZ where XX=major, YY=minor, ZZ=step
302cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IEngine;
303cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
304cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
305cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLEngineCapabilitiesItf_ *mItf;
306cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
307cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mThreadSafe;
308cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const
309cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mMaxIndexLED;
310cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mMaxIndexVibra;
311cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IEngineCapabilities;
312cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
313cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
314cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLEnvironmentalReverbItf_ *mItf;
315cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
316cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLEnvironmentalReverbSettings mProperties;
317faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
318cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    effect_descriptor_t mEnvironmentalReverbDescriptor;
319cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::sp<android::AudioEffect> mEnvironmentalReverbEffect;
320cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
321cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IEnvironmentalReverb;
322cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
323cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastenstruct EqualizerBand {
324cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmilliHertz mMin;
325cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmilliHertz mCenter;
326cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmilliHertz mMax;
327cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten};
328cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
329faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
330cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_EQ_BANDS 0
331cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#else
332cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
333cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
334cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
335cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
336cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLEqualizerItf_ *mItf;
337cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
338cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mEnabled;
339cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mPreset;
340cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#if 0 < MAX_EQ_BANDS
341cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
342cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
343cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const to end of struct
344cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mNumPresets;
345cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mNumBands;
346faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
347cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct EqualizerBand *mBands;
348cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct EqualizerPreset *mPresets;
349cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
350cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mBandLevelRangeMin;
351cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mBandLevelRangeMax;
352faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
353cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    effect_descriptor_t mEqDescriptor;
354cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::sp<android::AudioEffect> mEqEffect;
355cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
356cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IEqualizer;
357cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
358cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_LED_COUNT 32
359cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
360cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
361cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLLEDArrayItf_ *mItf;
362cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
363cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mLightMask;
364cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLHSL mColors[MAX_LED_COUNT];
365cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const
366cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mCount;
367cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} ILEDArray;
368cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
369cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
370cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMetadataExtractionItf_ *mItf;
371cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
372cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mKeySize;
373cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const void *mKey;
374cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mKeyEncoding;
375cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLchar *mValueLangCountry;
376cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mValueEncoding;
377cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mFilterMask;
378cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    int mKeyFilter;
379cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMetadataExtraction;
380cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
381cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
382cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMetadataTraversalItf_ *mItf;
383cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
384cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mIndex;
385cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mMode;
386cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mCount;
387cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mSize;
388cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMetadataTraversal;
389cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
390cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
391cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMIDIMessageItf_ *mItf;
392cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
393cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slMetaEventCallback mMetaEventCallback;
394cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mMetaEventContext;
395cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slMIDIMessageCallback mMessageCallback;
396cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mMessageContext;
397cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mMessageTypes;
398cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMIDIMessage;
399cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
400cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
401cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMIDIMuteSoloItf_ *mItf;
402cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
403cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mChannelMuteMask;
404cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mChannelSoloMask;
405cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mTrackMuteMask;
406cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mTrackSoloMask;
407cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const
408cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mTrackCount;
409cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMIDIMuteSolo;
410cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
411cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
412cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMIDITempoItf_ *mItf;
413cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
414cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mTicksPerQuarterNote;
415cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mMicrosecondsPerQuarterNote;
416cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMIDITempo;
417cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
418cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
419cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMIDITimeItf_ *mItf;
420cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
421cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mDuration;
422cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mPosition;
423cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mStartTick;
424cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mNumTicks;
425cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMIDITime;
426cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
427cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
428cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLMuteSoloItf_ *mItf;
429cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
430cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // fields that were formerly here are now at CAudioPlayer
431cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IMuteSolo;
432cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
433cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define MAX_TRACK 32        // see mActiveMask
434cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
435cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
436cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLOutputMixItf_ *mItf;
437cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
438cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slMixDeviceChangeCallback mCallback;
439cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
440cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IOutputMix;
441cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
442cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_OUTPUTMIXEXT
443cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
444cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLOutputMixExtItf_ *mItf;
445cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
446cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    unsigned mActiveMask;   // 1 bit per active track
447cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    Track mTracks[MAX_TRACK];
448cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
449cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IOutputMixExt;
450cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
451cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
452cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
453cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLPitchItf_ *mItf;
454cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
455cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mPitch;
456cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const
457cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMinPitch;
458cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMaxPitch;
459cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IPitch;
460cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
461cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct Play_interface {
462cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLPlayItf_ *mItf;
463cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
464cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mState;
465cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // next 2 fields are read-only to application
466cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mDuration;
467cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mPosition;
468cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slPlayCallback mCallback;
469cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
470cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mEventFlags;
471cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
472cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mMarkerPosition;
473cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0)
474cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef USE_OUTPUTMIXEXT
475cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mFrameUpdatePeriod;         // mPositionUpdatePeriod in frame units
476cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mLastSeekPosition;     // Last known accurate position, set at Seek
477cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mFramesSinceLastSeek;       // Frames mixed since last known accurate position
478cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback
479cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
480cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IPlay;
481cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
482cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
483cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLPlaybackRateItf_ *mItf;
484cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
485cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mRate;
486cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mProperties;
4876d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    // const after initialization
488cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMinRate;
489cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMaxRate;
490cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mStepSize;
491cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mCapabilities;
492cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IPlaybackRate;
493cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
494cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
495cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLPrefetchStatusItf_ *mItf;
496cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
497cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mStatus;
498cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mLevel;
499cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slPrefetchCallback mCallback;
500cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
501cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mCallbackEventsMask;
502cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mFillUpdatePeriod;
503a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten#ifdef ANDROID
504a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten    /** FIXME used to call PrefetchStatus callback with object unlocked prior to return from API */
505a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten    slPrefetchCallback mDeferredPrefetchCallback;
506a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten    void *mDeferredPrefetchContext;
507a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten    SLuint32 mDeferredPrefetchEvents;
508a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten#endif
509cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IPrefetchStatus;
510cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
511cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
512cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLPresetReverbItf_ *mItf;
513cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
514cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint16 mPreset;
515faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
516cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    effect_descriptor_t mPresetReverbDescriptor;
517cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::sp<android::AudioEffect> mPresetReverbEffect;
518cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
519cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IPresetReverb;
520cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
521cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
522cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLRatePitchItf_ *mItf;
523cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
524cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mRate;
525cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // const
526cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMinRate;
527cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mMaxRate;
528cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IRatePitch;
529cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
530cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
531cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLRecordItf_ *mItf;
532cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
533cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mState;
534cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mDurationLimit;
535cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mPosition;
536cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slRecordCallback mCallback;
537cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
538cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mCallbackEventsMask;
539cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mMarkerPosition;
540cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mPositionUpdatePeriod;
541cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IRecord;
542cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
543cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
544cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLSeekItf_ *mItf;
545cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
546cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
547cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mLoopEnabled;
548cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mStartPos;
549cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillisecond mEndPos;
550cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} ISeek;
551cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
552cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
553cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLThreadSyncItf_ *mItf;
554cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
555cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mInCriticalSection;
556cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mWaiting;  // number of threads waiting
557cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    pthread_t mOwner;
558cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IThreadSync;
559cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
560cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
561cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLVibraItf_ *mItf;
562cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
563cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mVibrate;
564cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmilliHertz mFrequency;
565cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mIntensity;
566cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IVibra;
567cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
568cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
569cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLVirtualizerItf_ *mItf;
570cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
571cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mEnabled;
572cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mStrength;
573faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
574cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    effect_descriptor_t mVirtualizerDescriptor;
575cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::sp<android::AudioEffect> mVirtualizerEffect;
576cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
577cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IVirtualizer;
578cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
579cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
580cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLVisualizationItf_ *mItf;
581cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
582cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slVisualizationCallback mCallback;
583cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
584cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmilliHertz mRate;
585cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IVisualization;
586cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
587cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct /*Volume_interface*/ {
588cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLVolumeItf_ *mItf;
589cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
590cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // Values as specified by the application
591cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mLevel;
592cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLpermille mStereoPosition;
593cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
594cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
595cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IVolume;
596cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
597cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
598cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct XAEngineItf_ *mItf;
599cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
600cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IXAEngine;
601cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
60237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#define NB_SUPPORTED_STREAMS 1 // only one (video) stream supported in this implementation
603321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivitypedef struct {
604321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    const struct XAStreamInformationItf_ *mItf;
605321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    IObject *mThis;
606321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    xaStreamEventChangeCallback mCallback;
607321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    void *mContext;
60837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    XAboolean mActiveStreams[NB_SUPPORTED_STREAMS];
609321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#ifdef ANDROID
610321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    android::Vector<StreamInfo> mStreamInfoTable;
611321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi#endif
612321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi} IStreamInformation;
613321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi
6146e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivitypedef struct {
6156e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi    const struct XAVideoDecoderCapabilitiesItf_ *mItf;
6166e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi    IObject *mThis;
6176e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi} IVideoDecoderCapabilities;
6186e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi
619cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/* Class structures */
620cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
621cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*typedef*/ struct C3DGroup_struct {
622cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject mObject;
623cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
624cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
625cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
626cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DLocation m3DLocation;
627cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DDoppler m3DDoppler;
628cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DSource m3DSource;
629cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    I3DMacroscopic m3DMacroscopic;
630cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // remaining are per-instance private fields not associated with an interface
631cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    unsigned mMemberMask;   // set of member objects
632cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} /*C3DGroup*/;
633cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
634cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#ifdef ANDROID
635cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
636cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// FIXME Move these into the I... section above
637cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
638cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
639cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLAndroidEffectItf_ *mItf;
640cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
641cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    android::KeyedVector<SLuint32, android::AudioEffect* > *mEffects;
642cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IAndroidEffect;
643cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
644cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
645cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLAndroidEffectCapabilitiesItf_ *mItf;
646cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
647cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLuint32 mNumFx;
648cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    effect_descriptor_t* mFxDescriptors;
649cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IAndroidEffectCapabilities;
650cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
651cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
652cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLAndroidEffectSendItf_ *mItf;
653cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
654cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // only one send per interface for now (1 bus)
655cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLboolean mEnabled;
656cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels;
657cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IAndroidEffectSend;
658cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
659cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
660cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLAndroidConfigurationItf_ *mItf;
661cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
662cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IAndroidConfiguration;
663cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
664cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastentypedef struct {
665cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const struct SLAndroidBufferQueueItf_ *mItf;
666cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    IObject *mThis;
667d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    SLAndroidBufferQueueState mState;
668cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    slAndroidBufferQueueCallback mCallback;
6691c853a41d9d9886e60618a7c878ce3912f46bf3cJean-Michel Trivi    SLuint32 mCallbackEventsMask;
670cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    void *mContext;
671d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    SLuint16 mNumBuffers;
67270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi    AndroidBufferType_type mBufferType;
673d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    AdvancedBufferHeader *mBufferArray;
674d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    AdvancedBufferHeader *mFront, *mRear;
675cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten} IAndroidBufferQueue;
676cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
677cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#endif
678