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