sles_allinclusive.h revision 72a04d8e9e059dad969d166a6a70491fe1e65970
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"
28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
30773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
32773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
33773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
37773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
38773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <unistd.h>
39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
42773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
49773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
61773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // needed by all classes (class class, the superclass of all classes)
82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mInterfaceCount;
84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME not yet used
86773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //const char * const mName;
87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    StatusHook mRealize;
90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    StatusHook mResume;
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // append per-class data here
9372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Track describes each input to OutputMixer
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME not for Android
99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct Track {
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLDataFormat_PCM *mDfPcm;
102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferQueue_interface *mBufferQueue;
103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Play_interface *mPlay; // mixer examines this track if non-NULL
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mReader;    // pointer to next frame in BufferHeader.mBuffer
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mAvail;        // number of available bytes
106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct BufferHeader {
113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
114773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
115773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
116773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
122773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mIs0; // which buffer to use next
138773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME magic numbers
139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer0[512];
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short mBuffer1[512];
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
142773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
143773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
144773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
145773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
146773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
14872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
14972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SLObjectItf_ *mItf;
15072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME probably not needed for an Object, as it is always first,
15172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // but look for lingering code that assumes it is here before deleting
152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Object_interface *mThis;
15372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const ClassTable *mClass;
15472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    volatile SLuint32 mState;
15572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
15672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
15772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mExposedMask;  // exposed interfaces
15872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
15972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
16072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLboolean mPreemptable;
16172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
16272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
16372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME also an object ID for RPC
16472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME and a human-readable name for debugging
16572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
16672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
16772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
16872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
16972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
170773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
17132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
17272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
173773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
1757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
1767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
1777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
1787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
1797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
1807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
1817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
1827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
1837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
18472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
185773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
18672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
1877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
1887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
1897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
1907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
1917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
1927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
1937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
1947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
1957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
1967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
1977754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
1987754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
19932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
20032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
20132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
20232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
2037754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
20672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
20872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
209773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
21072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
211773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLObjectItf mGroup;
21272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
213773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten// FIXME move
2157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
2167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
2177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
2187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
2197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
2207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
2217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
2227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
22472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
225773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
22672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
2317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
2327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
2337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
2347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
24972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
250773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
25172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
252773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
25372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
254773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
255773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
256773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
257773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
258773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
259773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
261773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
262773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
263773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
265773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
266773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
267773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // FIXME no longer needed? was for optimization
2707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // SLuint32 mGeneration;
2717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
27572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
276773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
27772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
278773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
27972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
280773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
281773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
282773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
283773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
2857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
286773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
287773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
288773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
289773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
29072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
291773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
293773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
29472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
29572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
296773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
298773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
29972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
300773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
302773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
304773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
30672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
30872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
309773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
31072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
3137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
3147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
3157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
31772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
318773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
320773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
323773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
32472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
325773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
32872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
329773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLBufferQueueState mState;
330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
332773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumBuffers;
333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mArray;
334773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader *mFront, *mRear;
335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
336773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
34272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLint32 mVolume[2]; // FIXME Hard-coded for default in/out
34472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
34872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mAddedMask;    // added interfaces, a subset of exposed interfaces
350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
355773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
35672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
35872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
359773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME Move this elsewhere
361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_ENVIRONMENTALREVERB 0
363773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_PRESETREVERB        1
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define AUX_MAX                 2
365773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#if 0
367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistatic const unsigned char AUX_to_MPH[AUX_MAX] = {
368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_ENVIRONMENTALREVERB,
369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MPH_PRESETREVERB
370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
372773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
373773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
378773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
38272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
383773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct OutputMix_class *mOutputMix;
384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mDirectLevel;
385773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EnableLevel mEnableLevels[AUX_MAX];
38672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
38872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private
389773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
39272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME Per-class non-const data such as vector of created objects.
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Vector<Type> instances;
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten#define INSTANCE_MAX 32 // FIXME no magic numbers
40072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mInstances[INSTANCE_MAX];
40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
40572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
41172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
41372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// FIXME move
416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMax;
419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
420773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*TBD*/ int mLevel;
421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
42372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
42572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel *mLevels;
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mMin;
433773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mMax;
434773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EqualizerBand *mBands;
435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar * const *mPresetNames;
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*TBD*/ int mBandLevelRangeMin;
437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*TBD*/ int mBandLevelRangeMax;
43872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
441773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
44272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
443773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLHSL *mColor;
445773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
446773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
44772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
448773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
450773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
45172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
452773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*FIXME*/ int mKeyFilter;
45972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
46172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
46372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
465773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
467773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
47272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
473773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
474773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
475773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
477773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    int /*TBD*/ mMessageTypes;
47872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
479773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
481773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
48272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
485773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
486773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
487773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const ?
488773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
48972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
490773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
492773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
49372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
503773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
504773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
50572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
50972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMuteMask;
511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSoloMask;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
513773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mNumChannels;
51472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
515773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
517773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
51872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
5207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
522773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct Track mTracks[32];
524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
527773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
52872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
53072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
53172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
53672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
538773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
540773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
54172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
542773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
54572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    volatile SLuint32 mState;
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // unsigned mPositionSamples;  // position in sample units
550773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
552773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
554773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPropertyConstraints;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
566773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
56772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
57172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
575773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
577773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
58272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
583773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
58472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
590773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
59672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
604773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
60572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
60972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPos;
611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
61472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
61872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mWaiting;
621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
62272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
62672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
628773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
63472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
635773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
63772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
64172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mMute;
652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnableStereoPosition;
653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
65472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
65972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
66072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
66172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
66272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
66372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
66472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
66572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    // FIXME set of objects
66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} C3DGroup;
667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
669773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
670773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
674c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
675773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
677773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
678773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
68372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
68472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
68572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
68672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
68872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
69072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
69172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
69272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
69472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
69672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
69772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
69872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
70172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
70372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
70572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
70672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
70772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
70872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
70972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
711773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
712773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
713773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
714773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_ANDROID
715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
716773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    union {
717773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::AudioTrack *mAudioTrack;
718773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        android::MediaPlayer *mMediaPlayer;
719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    };
720773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mThread;
721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioPlayer;
723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
72672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
72772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
72972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
730773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
73172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
73372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
73472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
73572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
73672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder;
737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
74072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
74272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
74372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
74472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
74672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
74772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
74872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
75172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
75272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_t mFrameThread;
75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
75972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
76172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
762773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
764773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
76572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
76672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
76772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
770773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
772773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
77772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
779773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
781773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
78272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
78772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
78972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
79072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
79872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
79972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
80072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
801773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
80272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
80472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
80672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
80872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
80972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
81272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
81472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class {
815773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
81672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
81872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
819773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
821773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
827773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix;
831773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
833773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
83572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
837773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
838773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
840