sles_allinclusive.h revision 40d1c40832a448e23d0bb37512aee53222575c2e
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
25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h>
26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h"
28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h"
29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h"
30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h"
31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer;
336a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup;
34acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
35773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
36773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
377324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h"
38773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
42773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
486fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
49b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
50daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h>
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
60773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
613d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
62b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
63773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
69daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE        4
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
78773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
79773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object
82510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
83510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_UNINITIALIZED 1  // not requested at object creation time
84510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_EXPOSED       2  // requested at object creation time
85510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_1      3  // part 1 of asynchronous AddInterface, pending
86510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_2      4  // synchronous AddInterface, or part 2 of asynchronous
87510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDED         5  // AddInterface has completed
88510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_REMOVING      6  // unlocked phase of (synchronous) RemoveInterface
89510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_SUSPENDING    7  // suspend in progress
90510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_SUSPENDED     8  // suspend has completed
91510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_1    9  // part 1 of asynchronous ResumeInterface, pending
92510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_2   10  // synchronous ResumeInterface, or part 2 of asynchronous
93510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_ADDING_1A    11  // part 1 of asynchronous AddInterface, aborted
94510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACE_RESUMING_1A  12  // part 1 of asynchronous ResumeInterface, aborted
95510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
103773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
10672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
108510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // FIXME not yet used
11176dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
113773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
114510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // hooks
1153d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
116510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    AsyncHook mResume;
117773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
11872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
119773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
120773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
121773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
122d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct {
123773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
124773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
125d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader;
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
135773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1387324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus
1397324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_
1407324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif
1417324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten
142773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
143773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1446a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
1456a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2
1466a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten
147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
150773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
151773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
153773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
1546a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    SLuint32 mWhich;    // which buffer to use next
1556a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
156773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
157773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
158773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
160acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
161acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
162acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
163acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mLocatorType;
164acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_Address mAddress;
165acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
166acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_IODevice mIODevice;
167acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
168acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
169acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_URI mURI;
170acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator;
171acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
172acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
173acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mFormatType;
174acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_PCM mPCM;
175acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_MIME mMIME;
176acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat;
177acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
178acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct {
179acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    union {
180acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSource mSource;
181acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSink mSink;
182acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        struct {
183acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataLocator *pLocator;
184acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataFormat *pFormat;
185acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        } mNeutral;
186acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    } u;
187acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocator mLocator;
188acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataFormat mFormat;
189acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat;
190acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
191773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
192773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
19372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
19472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SLObjectItf_ *mItf;
195d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
196ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    struct Engine_interface *mEngine;
197d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    const ClassTable *mClass;
198d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLuint32 mInstanceID; // for debugger and for RPC
19972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
20072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
201510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    unsigned mGottenMask;           // interfaces which are exposed or added, and then gotten
20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
20372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
20472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
20572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
206510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
207510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
208510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // for best alignment, do not add any fields here
209510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2
210510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
21172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
21272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
213a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
21572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
21672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
21772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
218773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
21932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
22072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
221773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
2237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
2247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
2257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
2267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
2277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
2287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
2297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
23172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
23372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
2357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
2367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
2377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
2387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
2397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
2407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
2417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
2427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
2437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
2447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
2457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
24632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
24732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
24832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
24932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
2507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
252773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
25372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
254773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
25572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
256773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
25772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2586a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    C3DGroup *mGroup;   // link to associated group or NULL
25972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
2627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
2637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
2647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
27072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
271773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
27272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
2747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
2767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
2777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
2857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
2867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
2877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
2887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
2897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
2907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
2917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
2927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
2937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
29572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
296773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
298773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
29972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
300773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
301773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
302773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
303773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
304773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
305773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
306773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
308773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
309773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
310773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
311773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
312773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
313773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
3147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
3157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
320773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
324773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
325773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
326773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
327773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
330773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
331773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
332773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
333773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
33472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
335773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
33672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
337773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
33972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
340773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
34372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
34572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
34972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
35072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
35472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
3567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
3577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
3607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
36172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
362773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
36572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
367773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
36872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
37072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
37272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3733a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLBufferQueueState mState;
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumBuffers;
377d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mArray;
378d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mFront, *mRear;
3791ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
380773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
382d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
38372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2
38640d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten
38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
39040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out
39172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
39572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
396773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
399773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
401773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
40272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
403773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
40472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
407773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
409773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
413510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels
414510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
415510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0
416510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB        1
417510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX                 2
418510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
41972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
420773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
42172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct OutputMix_class *mOutputMix;
423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mDirectLevel;
424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct EnableLevel mEnableLevels[AUX_MAX];
42572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
42672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
42772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten// private
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
429ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface {
430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
43172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
43300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
43400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten    struct OutputMix_class *mOutputMix; // SDL pulls PCM from an arbitrary OutputMixExt
43500d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
438d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    unsigned mInstanceMask; // 1 bit per active object
439d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32     // see mInstanceMask
440d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    IObject *mInstances[MAX_INSTANCE];
441d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLboolean mShutdown;
442d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
446773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
44772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
448773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
44940d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    // const
45040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexLED;
45140d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexVibra;
45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
45872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
461773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
462773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
4630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
465773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
4663a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
4673a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
4733a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
4743a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    // const to end of struct
475773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
4770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
4783a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    const struct EqualizerPreset *mPresets;
4790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
4800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
48172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
4833a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32
4843a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
48572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
486773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
48772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
488773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
4893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLHSL mColors[MAX_LED_COUNT];
490773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
49272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
5036a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    int mKeyFilter;
50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
50872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
516773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
51772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
5220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
52372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
530773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
531773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
532d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
535773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
53672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
537773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
53872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
540773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
54172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
542773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
544773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
54572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
546773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
548773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
55072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
553773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
55472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
555773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMuteMask;
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSoloMask;
557773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mNumChannels;
55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
561d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32        // see mActiveMask
562d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
56372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
56572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
5677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
570d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    struct Track mTracks[MAX_TRACK];
571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
57272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
574773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
58372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
586773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5933a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLuint32 mState;
594773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // unsigned mPositionSamples;  // position in sample units
597773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
599773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
60672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
607773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
6090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
611773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
61472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
61872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
619773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
621773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
624773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
62572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
628773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
62972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
63172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
6370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
64472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
647773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
65372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
65772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
658773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPos;
659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
660773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
66272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
66472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mWaiting;
669773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
67272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
675773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
677773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
68572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
690773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
69772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mMute;
700773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnableStereoPosition;
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
702ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
7036a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
7046a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Amplification (can be attenuation) factor derived for the VolumeLevel
7056a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
7066a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromVolLevel;
7076a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
7086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
7096a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
7106a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float mAmplFromStereoPos[2];
7116a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
7126a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are muted
7136a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
7146a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelMutes;
7156a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    /**
7166a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     * Channel mask for which channels are solo'ed
7176a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi     */
7186a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    int mChannelSolos;
7196a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
722773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
7246a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct {
72572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
726510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
727510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
72972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
73172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
7336a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    unsigned mMemberMask;   // set of member objects
7346a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/;
735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
742c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
748f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
74980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state {
75080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
75180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARING,
75280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARED,
75380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREFETCHING,
75480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_READY,
75580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    NUM_ANDROID_STATES
75680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi};
75780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi
758f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivitypedef struct {
759f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    android::AudioTrack *mAudioTrack;
760f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} AudioTrackData;
761f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
762f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivitypedef struct {
763f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    android::MediaPlayer *mMediaPlayer;
764f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} MediaPlayerData;
765f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
767773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
768acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
770510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
771510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
77772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
78272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
78972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
79072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
79172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
79372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
79772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
799acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSource;
800acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSink;
801773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
802773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
803773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
80480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
80506a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    android::Mutex          *mpLock;
806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
80780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    union {
80906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        AudioTrackData      mAudioTrackData;
81006a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        MediaPlayerData     mMediaPlayerData;
811773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    };
812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
813acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/;
814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
816773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
818510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
819510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default];
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
829ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    // rest of fields are not related to the interfaces
830ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSource;
831ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSink;
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CAudioRecorder;
833773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
83472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
837510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
838510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
843773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
84772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
84972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
850b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
852773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
85372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
854773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
85572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
856510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
857510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
85972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
860773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
86172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
86372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
864773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
86572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
866510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
867510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
86872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
86972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
87072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
87172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
872773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
87372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
874773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
87572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
876510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of interfaces
877510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
87872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
87972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
88072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
88172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
88272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
883773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
885773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
88672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
887510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
888510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
88972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
89072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
89472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
89572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
89672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
89772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMuteSolo mMuteSolo;
89872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
89972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
90072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
90172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
90272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
90372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
90472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
90572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
90672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
907773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
90872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
90972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
91072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
91172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
91272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
91372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
91472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
91572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
91672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
91772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
91872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
91972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
92072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct OutputMix_class {
921773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
92272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
923510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
924510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
92572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
92672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
929773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
93072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
93272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
93472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
935773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
93672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
93772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} COutputMix;
939773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
94072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
941773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
94272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
943510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
944510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
94572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
94672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
947773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
948773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
950a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
95161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
95261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
95361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
954510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    VoidHook mResume;
95561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
95661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
95761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
95861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
95961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
960979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
961979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
962979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
963979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
964979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
965979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
966979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
967b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
968b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
969d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
970d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
971d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
972b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
973b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
974daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
975d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject.
976d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
977d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need.
978d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
979d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
980d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
981ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
982daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "sles_to_android.h"
983daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif
984daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
985daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, DataLocatorFormat *myDataSourceLocator);
986daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator);
987daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
9883a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
9893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self);
990d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
991d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self);
99200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
99300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kastenextern void SDL_start(IEngine *thisEngine);
99400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
995510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
996510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
997510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
998510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
999510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1000510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1001510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1002d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg);
1003d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err);
10047245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten
10057245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__
1006d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz
10077245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else
10087245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned);
10097245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif
101040d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX];
1011