sles_allinclusive.h revision daf661248ff6ea2e21799e5114c78b7c1d49630e
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License.
6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at
7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and
14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License.
15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
17773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OpenSLES.h"
18773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof
19773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc
20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp
21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h>  // debugging
22773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging
23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h>
2432918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep
25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h"
27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h"
28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h"
29773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
32daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "SndFile.h"
33773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
37773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
38773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#ifdef USE_ANDROID
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
42773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
436fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
44b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
45daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h>
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
49773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
563d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
57b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
61773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
64daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE        4
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // needed by all classes (class class, the superclass of all classes)
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mInterfaceCount;
90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME not yet used
9276dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
953d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
963d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mResume;
97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // append per-class data here
9972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct BufferHeader {
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
114773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
115773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
116773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
122773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mIs0; // which buffer to use next
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME magic numbers
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer0[512];
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer1[512];
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
136a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#ifdef __cplusplus
137a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#define this this_
138a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#endif
139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
14272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
14372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SLObjectItf_ *mItf;
14472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME probably not needed for an Object, as it is always first,
14572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // but look for lingering code that assumes it is here before deleting
146773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Object_interface *mThis;
14772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const ClassTable *mClass;
14872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    volatile SLuint32 mState;
14972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
15072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
15172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mExposedMask;  // exposed interfaces
15272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
15372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
15472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLboolean mPreemptable;
15572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
15672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
15772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME also an object ID for RPC
15872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME and a human-readable name for debugging
15972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
16072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
16372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
16472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
16572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
166773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
16732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
16872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
169773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
1717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
1727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
1737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
1747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
1757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
1767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
1777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
1787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
1797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
18072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
181773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
18272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
1837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
1847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
1857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
1867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
1877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
1887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
1897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
1907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
1917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
1927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
1937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
1947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
19532918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
19632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
19732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
19832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
1997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
203773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
20472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
20672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLObjectItf mGroup;
2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // FIXME link to group's set
20972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
210773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
2127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
2137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
2147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
2157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
2167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
2177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
2187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
2197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
22172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
222773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
22372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
2317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
2337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
2347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
2357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
24672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
247773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
24872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
249773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
25072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
251773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
252773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
253773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
254773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
255773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
256773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
257773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
258773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
259773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
261773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
262773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
263773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // FIXME no longer needed? was for optimization
2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // SLuint32 mGeneration;
2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
27272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
273773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
27472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
277773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
278773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
279773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
280773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
283773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
284773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
285773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
286773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
28772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
288773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
28972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
290773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
29172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
29272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
293773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
295773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
29672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
29872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
299773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
301773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
30272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
30372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
304773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
306773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
30772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
3097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
3107754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
3117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
3137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
31472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
315773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
317773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
31872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
319773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
320773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
324773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
32572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
326773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLBufferQueueState mState;
327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
328773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
329773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumBuffers;
330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mArray;
331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mFront, *mRear;
3321ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
334773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
33672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
34072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLint32 mVolume[2]; // FIXME Hard-coded for default in/out
34272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
34672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mAddedMask;    // added interfaces, a subset of exposed interfaces
348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
35072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
355773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
35672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
358773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME Move this elsewhere
359773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_ENVIRONMENTALREVERB 0
361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_PRESETREVERB        1
362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_MAX                 2
363773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#if 0
365773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistatic const unsigned char AUX_to_MPH[AUX_MAX] = {
366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_ENVIRONMENTALREVERB,
367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_PRESETREVERB
368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
372773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
373773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
37872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
38072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct OutputMix_class *mOutputMix;
382773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mDirectLevel;
383773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EnableLevel mEnableLevels[AUX_MAX];
38472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
38672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private
387773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
389773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
39072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME Per-class non-const data such as vector of created objects.
393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
39472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Vector<Type> instances;
39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
39772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten#define INSTANCE_MAX 32 // FIXME no magic numbers
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mInstances[INSTANCE_MAX];
39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
40572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
41172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME move
414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
4170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
42072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
42272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
4250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel *mLevels;
426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
4290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar * const *mPresetNames;
4310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
4320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
43372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
434773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
438773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLHSL *mColor;
440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
441773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
44272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
443773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
4440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// FIXME sort: MIDI goes here
4450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
450773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
452773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*FIXME*/ int mKeyFilter;
45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
46072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
461773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
463773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
46572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
468773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
46972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
470773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
473773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
4740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
47572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
47972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
481773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const ?
485773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
48672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
487773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
489773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
49072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
492773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
49372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
49772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
50272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
503773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMuteMask;
508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSoloMask;
509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mNumChannels;
51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
5177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
5200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    struct Track mTracks[32]; // FIXME magic
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
52272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
52872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
530773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
53172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
53372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
534773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
536773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
53872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
541773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
54272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
543773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLuint32 mState;
544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
545773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // unsigned mPositionSamples;  // position in sample units
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
550773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
55272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
555773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
55672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
5590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
56472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
567773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
56872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
578773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
57972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
58172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
58572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
5870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
588773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
59072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
60372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
604773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPos;
609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
61272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mWaiting;
619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
62072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
63972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
64372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mMute;
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnableStereoPosition;
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
6526a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#ifdef USE_ANDROID
6536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6546a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Amplification (can be attenuation) factor derived for the VolumeLevel
6556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromVolLevel;
6576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
6596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6606a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromStereoPos[2];
6616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are muted
6636a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6646a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelMutes;
6656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are solo'ed
6676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelSolos;
6696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif
67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
67672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
67972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
68072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
68172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} C3DGroup;
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
687773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
689773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
690c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
693773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
695773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
69872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
69972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
70172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
70372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
70572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
70672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
70772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
70872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
70972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
71072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
71272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
71472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
71972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
72172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
72372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
728773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
730773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
732773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    union {
733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::AudioTrack *mAudioTrack;
734773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::MediaPlayer *mMediaPlayer;
735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    };
7366fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    char* mUri;// FIXME temporary storage before we handle that correctly
7376fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    pthread_t mThread;
738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioPlayer;
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
74372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
74472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
74672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
74872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
75072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
75172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
75272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder;
754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
75972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
76072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
76172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
762773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
76572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
76672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
769b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
771773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
779773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
781773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
78272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
79072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
796773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
79972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
80072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
80272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
80472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
80672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
80872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
80972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
81272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
81472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
81672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
83172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class {
832773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
83572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
836773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
838773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
84372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
844773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
84772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix;
848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
84972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
850773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
85272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
854773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
857a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
85861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
85961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
86061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
86161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
86261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
86361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
86461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
86561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
866979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
867979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
868979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
869979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
870979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
871979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
872979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
873b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
874b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
875b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID)
876b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
877b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
878daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
879daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#ifdef USE_ANDROID
880daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "sles_to_android.h"
881daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif
882daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
883daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef union {
884daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLuint32 mLocatorType;
885daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_Address mAddress;
886daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
887daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_IODevice mIODevice;
888daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
889daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_OutputMix mOutputMix;
890daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataLocator_URI mURI;
891daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataLocator;
892daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
893daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef union {
894daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLuint32 mFormatType;
895daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataFormat_PCM mPCM;
896daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    SLDataFormat_MIME mMIME;
897daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataFormat;
898daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
899daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastentypedef struct {
900daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    DataLocator mLocator;
901daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten    DataFormat mFormat;
902daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten} DataLocatorFormat;
903daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
904daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, DataLocatorFormat *myDataSourceLocator);
905daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator);
906daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
907