sles_allinclusive.h revision b7154f2324c8ae44b820c07c69aaa80a4bb9e418
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"
42b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
533d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
54b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
61773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // needed by all classes (class class, the superclass of all classes)
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
86773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mInterfaceCount;
87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME not yet used
8976dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
923d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
933d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mResume;
94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // append per-class data here
9672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Track describes each input to OutputMixer
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME not for Android
102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct Track {
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLDataFormat_PCM *mDfPcm;
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferQueue_interface *mBufferQueue;
106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Play_interface *mPlay; // mixer examines this track if non-NULL
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mReader;    // pointer to next frame in BufferHeader.mBuffer
108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mAvail;        // number of available bytes
109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
114773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
115773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct BufferHeader {
116773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
122773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
138773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mIs0; // which buffer to use next
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME magic numbers
142773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer0[512];
143773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer1[512];
144773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
145773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
146773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#ifdef __cplusplus
149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#define this this_
150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#endif
151773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
153773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
15472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
15572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SLObjectItf_ *mItf;
15672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME probably not needed for an Object, as it is always first,
15772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // but look for lingering code that assumes it is here before deleting
158773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Object_interface *mThis;
15972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const ClassTable *mClass;
16072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    volatile SLuint32 mState;
16172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
16272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
16372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mExposedMask;  // exposed interfaces
16472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
16572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
16672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLboolean mPreemptable;
16772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
16872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
16972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME also an object ID for RPC
17072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME and a human-readable name for debugging
17172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
17272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
173a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
17572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
17672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
17772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
17932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
18072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
181773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
1837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
1847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
1857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
1867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
1877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
1887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
1897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
1907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
1917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
19272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
193773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
19472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
1957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
1967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
1977754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
1987754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
1997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
2007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
2017754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
2027754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
2037754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
2047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
2057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
2067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
20732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
20832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
20932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
21032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
2117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
213773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
21472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
215773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
21672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
217773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
21872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
219773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLObjectItf mGroup;
2200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // FIXME link to group's set
22172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
222773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
2317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
23372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
234773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
23572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
2467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
2477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
2487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
2507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
2517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
2527754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
2537754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
25872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
259773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
26072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
261773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
26272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
263773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
265773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
266773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
267773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
268773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
269773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
270773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
271773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
272773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
273773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
274773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
276773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
2777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // FIXME no longer needed? was for optimization
2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // SLuint32 mGeneration;
2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
28472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
285773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
28672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
287773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
28872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
289773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
290773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
291773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
292773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
2937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
295773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
296773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
298773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
29972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
300773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
302773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
30372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
30472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
305773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
30872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
309773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
31072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
311773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
313773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
31472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
316773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
318773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
3217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
3227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
3237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
32672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
329773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
33072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
332773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
33372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
334773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
33572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
336773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
33772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
338773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLBufferQueueState mState;
339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
340773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumBuffers;
342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mArray;
343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mFront, *mRear;
3441ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
34872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLint32 mVolume[2]; // FIXME Hard-coded for default in/out
35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
355773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
35872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
359773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mAddedMask;    // added interfaces, a subset of exposed interfaces
360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
36272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
363773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
36472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
365773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
36672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
36872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME Move this elsewhere
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
372773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_ENVIRONMENTALREVERB 0
373773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_PRESETREVERB        1
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_MAX                 2
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#if 0
377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistatic const unsigned char AUX_to_MPH[AUX_MAX] = {
378773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_ENVIRONMENTALREVERB,
379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_PRESETREVERB
380773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
382773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
383773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
385773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
387773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
389773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
39272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct OutputMix_class *mOutputMix;
394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mDirectLevel;
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EnableLevel mEnableLevels[AUX_MAX];
39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
39772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private
399773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
401773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
40272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
403773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME Per-class non-const data such as vector of created objects.
405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
40672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
407773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Vector<Type> instances;
40872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten#define INSTANCE_MAX 32 // FIXME no magic numbers
41072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mInstances[INSTANCE_MAX];
41172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
41372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
41572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
41772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
41972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
420773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
42172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
42372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
425773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME move
426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
4290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
433773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
43472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
4370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel *mLevels;
438773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
4410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar * const *mPresetNames;
4430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
4440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
44572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
446773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
448773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
44972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
450773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLHSL *mColor;
452773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
4560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// FIXME sort: MIDI goes here
4570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
45872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
46072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
461773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
463773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
465773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
467773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*FIXME*/ int mKeyFilter;
46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
47272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
473773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
474773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
475773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
48172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
485773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
4860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
48772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
488773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
490773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
49172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
492773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const ?
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
49872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
50272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
503773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
504773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
50572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
50972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
513773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
51472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
515773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
517773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
51872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMuteMask;
520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSoloMask;
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
522773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mNumChannels;
52372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
5297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
530773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
531773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
5320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    struct Track mTracks[32]; // FIXME magic
533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
536773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
53772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
538773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
53972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
541773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
542773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
54572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
55072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
55472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
555773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLuint32 mState;
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // unsigned mPositionSamples;  // position in sample units
559773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
56472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
567773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
56872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
5710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
575773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
57672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
577773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
58072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
583773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
58772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
588773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
590773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
59172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
592773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
59372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
594773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
59772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
5990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
60672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
607773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
61572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
616773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
61972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPos;
621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mWaiting;
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
635773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
63672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
637773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
64472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
65172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
65572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
658773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
65972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
660773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mMute;
662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnableStereoPosition;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
6646a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#ifdef USE_ANDROID
6656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Amplification (can be attenuation) factor derived for the VolumeLevel
6676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromVolLevel;
6696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6706a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
6716a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6726a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromStereoPos[2];
6736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are muted
6756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6766a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelMutes;
6776a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
6786a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are solo'ed
6796a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
6806a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelSolos;
6816a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif
68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
68872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
69072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
69172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
69272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
69472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} C3DGroup;
695773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
700773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
702c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
703773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
704773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
705773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
706773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
71072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
71272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
71472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
71572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
71972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
72172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
72372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
72672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
72972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
73172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
73372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
73472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
73572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
73672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
73772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    union {
745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::AudioTrack *mAudioTrack;
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::MediaPlayer *mMediaPlayer;
747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    };
7480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // pthread_t mThread;
749773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
75072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioPlayer;
751773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
753773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
75472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
75572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
75672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
758773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
75972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
76072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
76172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
76272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder;
765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
77772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
778773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
780b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
782773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
784773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
78772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
788773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
78972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
792773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
800773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
80272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
80472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
80672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
807773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
80872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
809773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
81272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
81472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
81672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
81872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
829773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
83172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
83572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
83872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class {
843773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
847773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
84872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
85072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
85272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
85472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
85772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix;
859773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
86072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
861773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
86272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
86372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
86472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
865773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
866773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
86772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
868a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
86961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
87061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
87161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
87261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
87361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
87461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
87561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
87661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
877979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
878979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
879979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
880979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
881979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
882979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
883979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
884b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
885b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
886b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID)
887b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
888b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
889