sles_allinclusive.h revision 6fff2c605cdc46a10037e011d8fb47702ae70c37
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>
32773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
33773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
37773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38f517e6305d986d73ceae7a7eeb330ba01af375eeGlenn Kasten#if defined(USE_ANDROID)
39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
426fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
43b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
49773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
543d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
55b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
61773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // needed by all classes (class class, the superclass of all classes)
86773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mInterfaceCount;
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME not yet used
9076dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
933d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
943d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mResume;
95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // append per-class data here
9772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Track describes each input to OutputMixer
102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME not for Android
103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct Track {
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLDataFormat_PCM *mDfPcm;
106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferQueue_interface *mBufferQueue;
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Play_interface *mPlay; // mixer examines this track if non-NULL
108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mReader;    // pointer to next frame in BufferHeader.mBuffer
109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mAvail;        // number of available bytes
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
114773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
115773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
116773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct BufferHeader {
117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
122773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
138773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mIs0; // which buffer to use next
142773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME magic numbers
143773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer0[512];
144773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer1[512];
145773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
146773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#ifdef __cplusplus
150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#define this this_
151a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#endif
152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
153773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
154773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
15572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
15672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SLObjectItf_ *mItf;
15772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME probably not needed for an Object, as it is always first,
15872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // but look for lingering code that assumes it is here before deleting
159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Object_interface *mThis;
16072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const ClassTable *mClass;
16172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    volatile SLuint32 mState;
16272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
16372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
16472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mExposedMask;  // exposed interfaces
16572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
16672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
16772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLboolean mPreemptable;
16872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
16972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
17072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME also an object ID for RPC
17172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME and a human-readable name for debugging
17272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
17372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
175a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
17672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
17772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
17872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
179773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
18032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
18172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
182773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
1847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
1857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
1867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
1877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
1887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
1897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
1907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
1917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
1927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
19372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
194773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
19572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
1967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
1977754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
1987754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
1997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
2007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
2017754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
2027754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
2037754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
2047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
2057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
2067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
2077754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
20832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
20932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
21032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
21132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
2127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
214773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
21572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
216773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
21772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
218773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
21972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
220773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLObjectItf mGroup;
2210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // FIXME link to group's set
22272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
223773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
2317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
2327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
23472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
235773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
23672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
2467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
2477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
2487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
2497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
2517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
2527754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
2537754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
2547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
25972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
26172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
262773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
26372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
265773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
266773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
267773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
268773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
269773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
270773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
271773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
272773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
273773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
274773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
276773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
277773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // FIXME no longer needed? was for optimization
2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // SLuint32 mGeneration;
2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
28572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
286773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
28772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
288773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
28972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
290773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
291773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
292773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
293773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
2957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
296773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
298773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
299773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
301773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
303773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
30472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
306773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
308773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
30972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
310773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
31172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
312773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
314773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
31672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
317773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
319773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
32072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
3227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
3237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
32772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
328773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
33172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
332773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
33472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
33672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLBufferQueueState mState;
340773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumBuffers;
343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mArray;
344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mFront, *mRear;
3451ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
34972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
352773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
35372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
354773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLint32 mVolume[2]; // FIXME Hard-coded for default in/out
35572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
356773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
358773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
35972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mAddedMask;    // added interfaces, a subset of exposed interfaces
361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
36572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
36772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
36972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME Move this elsewhere
372773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
373773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_ENVIRONMENTALREVERB 0
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_PRESETREVERB        1
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_MAX                 2
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#if 0
378773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistatic const unsigned char AUX_to_MPH[AUX_MAX] = {
379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_ENVIRONMENTALREVERB,
380773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_PRESETREVERB
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
382773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
383773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
385773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
387773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
389773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
390773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
39372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct OutputMix_class *mOutputMix;
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mDirectLevel;
396773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EnableLevel mEnableLevels[AUX_MAX];
39772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private
400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME Per-class non-const data such as vector of created objects.
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Vector<Type> instances;
40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
41072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten#define INSTANCE_MAX 32 // FIXME no magic numbers
41172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mInstances[INSTANCE_MAX];
41272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
41472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
41672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
41872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
42072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
42272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
42472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
425773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME move
427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
4300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
434773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
43572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
4380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel *mLevels;
439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
441773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
4420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
443773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar * const *mPresetNames;
4440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
4450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
45072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
452773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLHSL *mColor;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
45572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
4570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// FIXME sort: MIDI goes here
4580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
45972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
46172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
463773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
465773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
467773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
468773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*FIXME*/ int mKeyFilter;
46972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
470773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
47372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
474773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
475773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
477773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
47872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
479773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
481773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
48272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
485773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
486773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
4870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
48872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
489773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
49272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const ?
498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
49972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
50372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
504773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
51072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
513773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
516773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
51972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMuteMask;
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSoloMask;
522773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mNumChannels;
52472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
525773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
52672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
527773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
52872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
5307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
531773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
5330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    struct Track mTracks[32]; // FIXME magic
534773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
53572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
536773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
53872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
54172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
542773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
543773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
545773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
550773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
55172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
552773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
554773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLuint32 mState;
557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
559773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // unsigned mPositionSamples;  // position in sample units
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
56572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
566773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
56972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
5720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
575773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
578773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
58172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
583773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
59872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
6000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
60372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
604773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
62072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPos;
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
624773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
62572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
628773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
62972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mWaiting;
632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
63372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
63772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
64172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
647773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
64872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
65272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
65672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
66072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mMute;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnableStereoPosition;
664773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
6656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#ifdef USE_ANDROID
6666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Amplification (can be attenuation) factor derived for the VolumeLevel
6686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromVolLevel;
6706a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6716a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
6726a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromStereoPos[2];
6746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are muted
6766a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6776a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelMutes;
6786a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6796a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are solo'ed
6806a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6816a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelSolos;
6826a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif
68372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
68872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
69072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
69172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
69272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
69472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} C3DGroup;
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
700773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
702773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
703c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
704773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
705773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
706773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
71272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
71472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
71572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
71972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
72172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
72372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
72672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
72772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
728773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
72972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
73172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
73372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
73472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
73572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
73672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
73772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
73872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    union {
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::AudioTrack *mAudioTrack;
747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::MediaPlayer *mMediaPlayer;
748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    };
7496fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    char* mUri;// FIXME temporary storage before we handle that correctly
7506fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    pthread_t mThread;
751773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
75272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioPlayer;
753773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
755773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
75672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
75972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
76172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
76272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
76572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
76672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder;
767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
769773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
775773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
77772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
780773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
782b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
784773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
78772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
78972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
792773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
794773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
79872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
79972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
800773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
802773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
80472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
80672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
80872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
809773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
811773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
81272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
81472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
81672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
81872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
831773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
83572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
83872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
84372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class {
845773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
84772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
84872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
85072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
851773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
85272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
85472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
85572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
857773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
85972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
86072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix;
861773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
86272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
863773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
86472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
86572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
86672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
867773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
868773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
86972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
870a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
87161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
87261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
87361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
87461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
87561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
87661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
87761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
87861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
879979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
880979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
881979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
882979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
883979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
884979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
885979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
886b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
887b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
888b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID)
889b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
890b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
891