sles_allinclusive.h revision f156301680273e71e56e898f98798f5b5b2431f6
1193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/*
2193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi *
4193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * you may not use this file except in compliance with the License.
6193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * You may obtain a copy of the License at
7193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi *
8193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi *
10193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * See the License for the specific language governing permissions and
14193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * limitations under the License.
15193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */
16193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
17193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OpenSLES.h"
18193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stddef.h> // offsetof
19193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdlib.h> // malloc
20193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <string.h> // memcmp
21193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <stdio.h>  // debugging
22193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <assert.h> // debugging
23193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <pthread.h>
24d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten#include <unistd.h> // usleep
25437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include <errno.h>
26193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
27193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH.h"
28193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "MPH_to.h"
2982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "devices.h"
30437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten#include "ThreadPool.h"
31193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
324c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer;
33ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kastentypedef struct C3DGroup_struct C3DGroup;
3415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct COutputMix_struct COutputMix;
354c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
36193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE
37193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <sndfile.h>
38aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#include "SLSndFile.h"
39193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE
40193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
41193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SDL
42193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include <SDL/SDL_audio.h>
43193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SDL
44193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
459db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID
46ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include "OpenSLES_Android.h"
47193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h"
48193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h"
49193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h"
500263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h>
518a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
52f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h>
535d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h"
54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
55193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
5615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2
5715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
59193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h"
60193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
61193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
62193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions
63193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
64193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self);
65193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
668a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
674cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi
68193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Describes how an interface is related to a given class
69193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
70193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
71193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
72193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
73193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
74f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#define INTERFACE_UNAVAILABLE        4
75193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
76193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
77193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
78193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
79193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
80193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
81193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
82193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
83193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
84193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
85193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
86bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object
87bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
88bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_UNINITIALIZED 1  // not requested at object creation time
89bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_EXPOSED       2  // requested at object creation time
90bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1      3  // part 1 of asynchronous AddInterface, pending
91bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_2      4  // synchronous AddInterface, or part 2 of asynchronous
92bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDED         5  // AddInterface has completed
93bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_REMOVING      6  // unlocked phase of (synchronous) RemoveInterface
94bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDING    7  // suspend in progress
95bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDED     8  // suspend has completed
96bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1    9  // part 1 of asynchronous ResumeInterface, pending
97bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_2   10  // synchronous ResumeInterface, or part 2 of asynchronous
98bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1A    11  // part 1 of asynchronous AddInterface, aborted
99bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1A  12  // part 1 of asynchronous ResumeInterface, aborted
100bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
102193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
103193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable {
104193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned char mMPH;
105193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned char mInterface;   // relationship
106193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
107193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
108193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
109193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class
110193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
111903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
112193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
113bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
114193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const signed char *mMPH_to_index;
115193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // FIXME not yet used
116ee35e132113602e20012829377d16f0572c61195Glenn Kasten    const char * const mName;
117193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    size_t mSize;
118193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mObjectID;
119bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    // hooks
1208a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi    AsyncHook mRealize;
121bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    AsyncHook mResume;
122193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    VoidHook mDestroy;
123903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable;
124193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
125193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
126193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
127437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct {
128193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mBuffer;
129193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mSize;
130437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader;
131193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
132193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
133193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
134193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
135193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
136193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef struct {
137193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    short left;
138193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    short right;
139193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi} stereo;
140193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
141193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
142193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
143aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus
144aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_
145aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif
146aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten
147193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE
148193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
149ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
150ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2
151ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten
152193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile {
153193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // save URI also?
154193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLchar *mPathname;
155193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SNDFILE *mSNDFILE;
15615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    pthread_mutex_t mMutex; // protects mSNDFILE only
15715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mEOF;         // sf_read returned zero sample frames
158193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
159193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mRetryBuffer;
160193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mRetrySize;
161ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    SLuint32 mWhich;    // which buffer to use next
162ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
163193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
164193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
165193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE
166193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
1674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
1684c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1694c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union {
1704c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLuint32 mLocatorType;
1714c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_Address mAddress;
1724c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
1734c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_IODevice mIODevice;
1744c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
1754c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
1764c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_URI mURI;
177c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#ifdef ANDROID
178c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi    SLDataLocator_AndroidFD mFD;
179c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#endif
1804c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator;
1814c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1824c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union {
1834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLuint32 mFormatType;
1844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataFormat_PCM mPCM;
1854c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataFormat_MIME mMIME;
1864c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat;
1874c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1884c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct {
1894c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    union {
1904c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        SLDataSource mSource;
1914c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        SLDataSink mSink;
1924c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        struct {
1934c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten            DataLocator *pLocator;
1944c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten            DataFormat *pFormat;
1954c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        } mNeutral;
1964c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    } u;
1974c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocator mLocator;
1984c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataFormat mFormat;
1994c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat;
2004c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
201193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */
202193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
203903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface {
20415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    const struct SLObjectItf_ *mItf;    // const
20532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
20615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct Engine_interface *mEngine;   // const
20715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    const ClassTable *mClass;       // const
20815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint32 mInstanceID;           // const for debugger and for RPC
209903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    slObjectCallback mCallback;
210903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    void *mContext;
211bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    unsigned mGottenMask;           // interfaces which are exposed or added, and then gotten
212903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
21315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    unsigned mAttributesMask;       // attributes which have changed since last sync
214903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    SLint32 mPriority;
215903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    pthread_mutex_t mMutex;
216903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    pthread_cond_t mCond;
217bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
218bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
219bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    // for best alignment, do not add any fields here
220bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Default 2
221bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
22215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // do not add any fields here
223903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject;
224903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
22582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h"
22682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
227903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
228903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    const struct SL3DCommitItf_ *mItf;
229903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
230193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mDeferred;
231d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
232c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten    SLuint32 mWaiting;      // number of threads waiting in Commit
233903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit;
234193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
235d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive {
236d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
237d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
238d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
239d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
240d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
241d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
242d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten};
243d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten
244903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
245193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
246903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
247d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
248d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // But an implementation will likely prefer one or the other. So for
249d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // maximum portablity, we maintain both units and an indication of which
250d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
251d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // the other unit has been derived yet. It can take significant time
252d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // to compute the other unit, so this may be deferred to another thread.
253d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // For this reason we also keep an indication of whether the secondary
254d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // has been computed yet, and its accuracy.
255d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
256d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // the application might read in both units (not in 1.0.1),
257d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // and due to multi-threading concerns.
258d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mVelocityCartesian;
259d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten    struct {
260d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mAzimuth;
261d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mElevation;
262d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mSpeed;
263d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mVelocitySpherical;
264d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum CartesianSphericalActive mVelocityActive;
265193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mDopplerFactor;
266903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler;
267193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
268903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
269193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
270903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
271ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    C3DGroup *mGroup;   // link to associated group or NULL
272903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping;
273193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
274d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive {
275d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
276d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
277d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
278d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
279d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
280d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
281d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten};
282d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten
283903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
284193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
285903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
286d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mLocationCartesian;
287d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
288d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mAzimuth;
289d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mElevation;
290d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillimeter mDistance;
291d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mLocationSpherical;
292d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum CartesianSphericalActive mLocationActive;
293d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
294d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mHeading;
295d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mPitch;
296d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mRoll;
297d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mOrientationAngles;
298d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
299d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mFront;
300d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mAbove;
301d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mUp;
302d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mOrientationVectors;
303d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum AnglesVectorsActive mOrientationActive;
304d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Rotations can be slow, so are deferred.
305d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mTheta;
306d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mAxis;
307d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLboolean mRotatePending;
308903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation;
309193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
310903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
311193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
312903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
313193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
314193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mWidth;
315193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mHeight;
316193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mDepth;
317193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mSize;
318193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
319193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mHeading;
320193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mPitch;
321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mRoll;
322193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mOrientationAngles;
323193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
324193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLVec3D mFront;
325f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        SLVec3D mAbove;
326193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLVec3D mUp;
327193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mOrientationVectors;
328d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum AnglesVectorsActive mOrientationActive;
329d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Rotations can be slow, so are deferred.
330d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mTheta;
331d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mAxis;
332d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLboolean mRotatePending;
333903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic;
334193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
335903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
336193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
337903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
338193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mHeadRelative;
339193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
340193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillimeter mMaxDistance;
341193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillimeter mMinDistance;
342d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mConeInnerAngle;
343d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mConeOuterAngle;
344193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mConeOuterLevel;
345193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRolloffFactor;
346193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
347193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mDistanceModel;
348903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource;
349193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
350903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
351193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
352903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
353903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities;
354193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
355903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
356193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
357903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
358193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
359903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder;
360193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
361903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
362193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
363903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
364903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities;
365193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
366903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
367193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
368903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
369d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
370d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mAvailableAudioInputsChangedContext;
371d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
372d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mAvailableAudioOutputsChangedContext;
373d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
374d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mDefaultDeviceIDMapChangedContext;
375903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities;
376193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
377903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
378193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
379903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
380193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
381193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStrength;
382903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost;
383193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
384903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface {
385193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
386903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
38709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLBufferQueueState mState;
388193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slBufferQueueCallback mCallback;
389193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
390193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mNumBuffers;
391437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader *mArray;
392437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader *mFront, *mRear;
39315005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi    SLuint32 mSizeConsumed;
394193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // saves a malloc in the typical case
395193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
396437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
397903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue;
398193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
3997e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten#define MAX_DEVICE 2
4007e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten
401903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
403903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
4047e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out
405903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume;
406193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
407903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
408193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
409903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
410193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
411193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
412903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement;
413193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
414903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
416903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLDataSource *mDataSource;
418903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource;
419193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
420193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private
421193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
422193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel {
423193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnable;
424193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mSendLevel;
425193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
426193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
427bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels
428bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
429bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0
430bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB        1
431bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX                 2
432bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
433903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
434193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
435903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
43615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    COutputMix *mOutputMix;     // which output mix this effect send is attached to
43715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLmillibel mDirectLevel;    // dry volume
43815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
439903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend;
440903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
441d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface {
442193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
443903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
444193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
44599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL
44615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
44799cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif
448193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // Each engine is its own universe.
449903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    SLuint32 mInstanceCount;
45032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    unsigned mInstanceMask; // 1 bit per active object
45115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
45232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_INSTANCE 32     // see mInstanceMask
45332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    IObject *mInstances[MAX_INSTANCE];
454437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    SLboolean mShutdown;
45515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mShutdownAck;
45615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    pthread_cond_t mShutdownCond;
457437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
458903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine;
459193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
460903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
461193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
462903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
463193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mThreadSafe;
4647e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    // const
4657e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLuint32 mMaxIndexLED;
4667e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLuint32 mMaxIndexVibra;
467903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities;
468193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
469903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
470193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
471903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
472193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
473903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb;
474193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
475193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand {
476193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mMin;
477193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mCenter;
4784c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmilliHertz mMax;
479193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
480193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
48109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
48209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten
483903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
484193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
485903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
486193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
487193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mPreset;
48809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
48909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    // const to end of struct
490193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mNumPresets;
491193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mNumBands;
4924c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    const struct EqualizerBand *mBands;
49309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    const struct EqualizerPreset *mPresets;
4944c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmillibel mBandLevelRangeMin;
4954c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmillibel mBandLevelRangeMax;
496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer;
497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
49809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32
49909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten
500903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
501193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
502903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
503193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mLightMask;
50409f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLHSL mColors[MAX_LED_COUNT];
505193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // const
506193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mCount;
507903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray;
508193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
509903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
511903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
512193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mKeySize;
513193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mKey;
514193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mKeyEncoding;
515193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const SLchar *mValueLangCountry;
516193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mValueEncoding;
517193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mFilterMask;
518ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    int mKeyFilter;
519903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction;
520193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
521903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
522193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
523903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
524193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mIndex;
525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mMode;
526193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCount;
527193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mSize;
528903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal;
529193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
530903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
531193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
533193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
534193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mMetaEventContext;
535193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
536193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mMessageContext;
5374c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLuint8 mMessageTypes;
538903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage;
539193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
540903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
541193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
542903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
543193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mChannelMuteMask;
544193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mChannelSoloMask;
545193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTrackMuteMask;
546193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTrackSoloMask;
547437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    // const
548193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mTrackCount;
549903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo;
550193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
551903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
552193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
553903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
554193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
555193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
556903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo;
557193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
558903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
559193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
560903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
561193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDuration;
562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mPosition;
563193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mStartTick;
564193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mNumTicks;
565903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime;
566193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
567903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
568193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
569903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
5709c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten    // fields that were formerly here are now at CAudioPlayer
571903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo;
572193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
57332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32        // see mActiveMask
57432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
575903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
576193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
577903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
578d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slMixDeviceChangeCallback mCallback;
579d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mContext;
580193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
58232a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    struct Track mTracks[MAX_TRACK];
583193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
584903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix;
585193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
586193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
587903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
588193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
589903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
590903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt;
591193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
592193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
593903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
594193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
595903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
596193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mPitch;
597193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // const
598193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinPitch;
599193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxPitch;
600903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch;
601193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
602903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface {
603193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
604903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
60509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLuint32 mState;
60615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // next 2 fields are read-only to application
607193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mDuration;
608193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPosition;
609193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slPlayCallback mCallback;
610193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
611193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mEventFlags;
61215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
613193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mMarkerPosition;
61415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mMarkerIsSet;
615193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
616903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay;
617193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
618903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
619193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
620903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
621193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRate;
622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mProperties;
6234c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    // const
624193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinRate;
625193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxRate;
626193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStepSize;
627193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCapabilities;
628903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate;
629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
630903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
632903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
633193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mStatus;
634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mLevel;
635193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slPrefetchCallback mCallback;
636193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
637193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
638193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
639903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus;
640193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
641903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
642193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
643903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
644193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mPreset;
645903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb;
646193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
647903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
648193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
649903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
650193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRate;
6514c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    // const
652193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinRate;
653193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxRate;
654903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch;
655193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
656903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
657193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
658903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
659193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mState;
660193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mDurationLimit;
661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPosition;
662193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slRecordCallback mCallback;
663193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
664193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
665193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mMarkerPosition;
666193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
667903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord;
668193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
669903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
670193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
671903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
67215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
673193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mLoopEnabled;
674193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mStartPos;
675193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mEndPos;
676903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek;
677193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
678903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
679193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
680903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mInCriticalSection;
68215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint32 mWaiting;  // number of threads waiting
683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    pthread_t mOwner;
684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync;
685193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
686903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
687193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mVibrate;
690193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mFrequency;
691193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mIntensity;
692903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra;
693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
694903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
695193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
696903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
697193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStrength;
699903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer;
700193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
701903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
702193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
703903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
704193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slVisualizationCallback mCallback;
705193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
706193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mRate;
707903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization;
708193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
70915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ {
710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
711903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
71215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // Values as specified by the application
713193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mLevel;
714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStereoPosition;
71515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mMute;    // FIXME move inside each object that supports the interface
71615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
717903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume;
718193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
719193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */
720193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
721ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct {
722903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
723bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
724bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
725903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
726903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
727903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
728903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
729903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
730ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    unsigned mMemberMask;   // set of member objects
731ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/;
732193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
733b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID
734ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivitypedef struct {
735ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi    const struct SLAndroidStreamTypeItf_ *mItf;
736ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi    IObject *mThis;
737ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi    SLuint32 mStreamType;
738ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} IAndroidStreamType;
739ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi
740193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/*
741193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
742193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object
743193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */
744193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type {
745f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi    INVALID_TYPE     =-1,
746193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    MEDIAPLAYER      = 0,
747193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
748193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
749193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
751226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi
752b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state {
753b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
754b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREPARING,
755b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREPARED,
756b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREFETCHING,
757b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_READY,
758b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    NUM_ANDROID_STATES
759b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi};
760ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif //ifdef ANDROID
761ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi
762193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
7634c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
765ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID
766ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define INTERFACES_AudioPlayer 27 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
767ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else
768bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
769ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif
770bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
771903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
772903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlay mPlay;
773903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
774903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DGrouping m3DGrouping;
775903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
776903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
777903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBufferQueue mBufferQueue;
778903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEffectSend mEffectSend;
779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
780903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPrefetchStatus mPrefetchStatus;
782903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IRatePitch mRatePitch;
783903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ISeek mSeek;
784903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
78515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    IMuteSolo mMuteSolo;
786ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID
787ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi    IAndroidStreamType  mAndroidStreamType;
788ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif
789193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
790903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
791903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
792903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
793903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
794903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
795903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPitch mPitch;
796903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
797903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlaybackRate mPlaybackRate;
798903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
799903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
800193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // rest of fields are not related to the interfaces
8014c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocatorFormat mDataSource;
8024c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocatorFormat mDataSink;
803da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi    // cached data for this instance
80415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mMute;
8059c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten    // Formerly at IMuteSolo
8069c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
8079c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
8089c2a7b1e9f8203bf9de26efca0f1f805038b1f2bGlenn Kasten    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
8094bdead9570d01cd53a45ad1e0f6f94196d0e6058Jean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
810da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi    // implementation-specific data for this instance
81115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT
81215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct Track *mTrack;
81315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif
814193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE
815193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct SndFile mSndFile;
816193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE
817b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID
818060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi    android::Mutex          *mpLock;
819193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
820b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
821474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi    android::AudioTrack *mAudioTrack;
8225d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi    android::sp<android::SfPlayer> mSfPlayer;
8235d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi    android::sp<android::ALooper>  mRenderLooper;
82415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    /**
82515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     * Amplification (can be attenuation) factor derived for the VolumeLevel
82615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     */
82715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    float mAmplFromVolLevel;
82815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    /**
82915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
83015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     */
83115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    float mAmplFromStereoPos[STEREO_CHANNELS];
832193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
8334c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/;
834193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
835903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
836193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
837903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
838bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
839bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default];
840903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
841903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IRecord mRecord;
842903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioEncoder mAudioEncoder;
843193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
844903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
845903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
846903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
847903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
848903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
849d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    // rest of fields are not related to the interfaces
850d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    DataLocatorFormat mDataSource;
851d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    DataLocatorFormat mDataSink;
852903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CAudioRecorder;
853193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
854903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
855193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated implicit interfaces
856903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
857bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
858bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
859903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
860903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEngine mEngine;
861903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEngineCapabilities mEngineCapabilities;
862903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IThreadSync mThreadSync;
863193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated explicit interfaces
864903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
865903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
866903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
867903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DCommit m3DCommit;
868193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
869903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDeviceVolume mDeviceVolume;
870188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten    pthread_t mSyncThread;
871903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine;
872193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
873903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
874193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
875903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
876bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
877bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
878903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
879903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ILEDArray mLEDArray;
880193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDeviceID;
881903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice;
882193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
883903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
884193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
885903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
886bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
887bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
888903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
889903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
890903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
891903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener;
892193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
893903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
894193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
895903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
89615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
89715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten                                       // interfaces
898bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
899903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
900903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
901903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
902903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
903903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor;
904193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
905903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
906193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
907903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
908ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#ifdef ANDROID
909ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
910ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#else
911bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
912ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#endif
913bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
914903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
915903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlay mPlay;
916903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
917903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DGrouping m3DGrouping;
918903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
919903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
920903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBufferQueue mBufferQueue;
921903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEffectSend mEffectSend;
922903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
923903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
924903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDIMessage mMIDIMessage;
925903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDITime mMIDITime;
926903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDITempo mMIDITempo;
927903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
928903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPrefetchStatus mPrefetchStatus;
929903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ISeek mSeek;
930903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
93115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    IMuteSolo mMuteSolo;
932c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#ifdef ANDROID
933ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi    IAndroidStreamType mAndroidStreamType;
934c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#endif
935193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
936903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
937903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
938903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
939903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
940903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
941903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPitch mPitch;
942903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
943903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlaybackRate mPlaybackRate;
944903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
945903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
946903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer;
947903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
94815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct {
949193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
950903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
951bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
952bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
953903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
954903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IOutputMix mOutputMix;
955193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
956903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IOutputMixExt mOutputMixExt;
957193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
958903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
959903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
960903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
961903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
962903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
963193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
964903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
965903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
96615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/;
967193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
968903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
969193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
970903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
971bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
972bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
973903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
974903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVibra mVibra;
975193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    //
976193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDeviceID;
977903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice;
97882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
97923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init {
98023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    // unsigned char mMPH;
98123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    VoidHook mInit;
982bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    VoidHook mResume;
98323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    VoidHook mDeinit;
98423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten};
98523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
98623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
98723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
988492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
989492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
990492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
991492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__,
992492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
993492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
994492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
995188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
996188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten
99732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
99832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
99932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
1000188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten
1001188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
1002f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten
100332a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject.
100432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
100532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need.
100632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
100732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
100832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
1009da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
1010da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi
10119db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID
1012f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include "sles_to_android.h"
1013f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif
1014f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten
101515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc,
101615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    DataLocatorFormat *myDataSourceLocator);
1017f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator);
1018f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
101909f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
102009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self);
1021437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
1022437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self);
102399cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL
102499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kastenextern void SDL_start(IEngine *thisEngine);
102599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif
1026bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
1027bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
1028bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1029bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1030bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1031bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1032bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1033437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg);
1034437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err);
1035277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten
1036277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__
103732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz
1038277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else
1039277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned);
1040277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif
10417e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX];
104215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h"
104315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
104415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes
104515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
104615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_NONE       ((unsigned) 0x0)    // none
104715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_GAIN       ((unsigned) 0x1)    // player volume, channel mute, channel solo,
104815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten                                            // player stereo position, player mute
104915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_TRANSPORT  ((unsigned) 0x2)    // play state, requested position, looping
1050c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten
1051c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATALOCATOR_NULL 0    // application specified a NULL value for pLocator
1052c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten#define SL_DATAFORMAT_NULL 0     // application specified a NULL or undefined value for pFormat
1053f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
1054f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#ifdef NDEBUG
1055f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_GLOBAL { SLresult result;
1056f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_GLOBAL return result; }
1057f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE { SLresult result;
1058f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE return result; }
1059f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE_VOID {
1060f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE_VOID return; }
1061f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#else
1062f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterGlobal(const char *function);
1063f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveGlobal(const char *function, SLresult result);
1064f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterInterface(const char *function);
1065f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveInterface(const char *function, SLresult result);
1066f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slEnterInterfaceVoid(const char *function);
1067f156301680273e71e56e898f98798f5b5b2431f6Glenn Kastenextern void slLeaveInterfaceVoid(const char *function);
1068f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_GLOBAL { SLresult result; slEnterGlobal(__FUNCTION__);
1069f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_GLOBAL slLeaveGlobal(__FUNCTION__, result); return result; }
1070f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE { SLresult result; slEnterInterface(__FUNCTION__);
1071f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE slLeaveInterface(__FUNCTION__, result); return result; }
1072f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_ENTER_INTERFACE_VOID { slEnterInterfaceVoid(__FUNCTION__);
1073f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#define SL_LEAVE_INTERFACE_VOID slLeaveInterfaceVoid(__FUNCTION__); return; }
1074f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#endif
1075