sles_allinclusive.h revision 15f9f5e609265dff9d6036af38bea084c42a702a
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
46193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioSystem.h"
47193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/AudioTrack.h"
48193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "media/mediaplayer.h"
490263d22efc4ad9420b367ec61b5a1d1ec72cebb9Jean-Michel Trivi#include <utils/String8.h>
508a307c7272108766eebabc7fa7044d7510d65f77Jean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
51f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include <binder/ProcessState.h>
525d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi#include "android_SfPlayer.h"
53193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
54193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
5515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define STEREO_CHANNELS 2
5615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
57193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
58193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#include "OutputMixExt.h"
59193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
60193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
61193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Hook functions
62193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
63193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef void (*VoidHook)(void *self);
64193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
658a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
664cf440cd9f6106db00571345af7aa02529c9a10aJean-Michel Trivi
67193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Describes how an interface is related to a given class
68193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
69193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
70193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
71193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
72193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
73f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#define INTERFACE_UNAVAILABLE        4
74193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
75193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
76193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
77193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
78193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
79193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
80193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
81193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
82193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
83193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
84193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
85bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// Describes how an interface is related to a given object
86bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
87bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_UNINITIALIZED 1  // not requested at object creation time
88bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_EXPOSED       2  // requested at object creation time
89bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1      3  // part 1 of asynchronous AddInterface, pending
90bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_2      4  // synchronous AddInterface, or part 2 of asynchronous
91bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDED         5  // AddInterface has completed
92bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_REMOVING      6  // unlocked phase of (synchronous) RemoveInterface
93bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDING    7  // suspend in progress
94bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_SUSPENDED     8  // suspend has completed
95bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1    9  // part 1 of asynchronous ResumeInterface, pending
96bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_2   10  // synchronous ResumeInterface, or part 2 of asynchronous
97bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_ADDING_1A    11  // part 1 of asynchronous AddInterface, aborted
98bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACE_RESUMING_1A  12  // part 1 of asynchronous ResumeInterface, aborted
99bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
100193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
101193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
102193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct iid_vtable {
103193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned char mMPH;
104193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned char mInterface;   // relationship
105193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
106193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
107193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
108193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// Per-class const data shared by all instances of the same class
109193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
110903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
111193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
112bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
113193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const signed char *mMPH_to_index;
114193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // FIXME not yet used
115ee35e132113602e20012829377d16f0572c61195Glenn Kasten    const char * const mName;
116193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    size_t mSize;
117193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mObjectID;
118bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    // hooks
1198a47ad52488855f50b95da649744dde3a254698bJean-Michel Trivi    AsyncHook mRealize;
120bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    AsyncHook mResume;
121193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    VoidHook mDestroy;
122903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ClassTable;
123193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
124193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
125193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
126437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastentypedef struct {
127193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mBuffer;
128193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mSize;
129437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten} BufferHeader;
130193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
131193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
132193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
133193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
134193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
135193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivitypedef struct {
136193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    short left;
137193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    short right;
138193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi} stereo;
139193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
140193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
141193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
142aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#ifdef __cplusplus
143aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#define this this_
144aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten#endif
145aee4409e59584f8e8d0ddaf7e44dc80ec5b80444Glenn Kasten
146193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE
147193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
148ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
149ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten#define SndFile_NUMBUFS 2
150ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten
151193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct SndFile {
152193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // save URI also?
153193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLchar *mPathname;
154193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SNDFILE *mSNDFILE;
15515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    pthread_mutex_t mMutex; // protects mSNDFILE only
15615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mEOF;         // sf_read returned zero sample frames
157193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
158193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mRetryBuffer;
159193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mRetrySize;
160ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    SLuint32 mWhich;    // which buffer to use next
161ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
162193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
163193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
164193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE
165193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
1664c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
1674c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1684c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union {
1694c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLuint32 mLocatorType;
1704c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_Address mAddress;
1714c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
1724c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_IODevice mIODevice;
1734c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
1744c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
1754c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataLocator_URI mURI;
1764c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocator;
1774c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1784c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef union {
1794c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLuint32 mFormatType;
1804c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataFormat_PCM mPCM;
1814c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    SLDataFormat_MIME mMIME;
1824c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataFormat;
1834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
1844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kastentypedef struct {
1854c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    union {
1864c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        SLDataSource mSource;
1874c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        SLDataSink mSink;
1884c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        struct {
1894c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten            DataLocator *pLocator;
1904c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten            DataFormat *pFormat;
1914c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten        } mNeutral;
1924c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    } u;
1934c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocator mLocator;
1944c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataFormat mFormat;
1954c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} DataLocatorFormat;
1964c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten
197193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Interface structures */
198193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
199903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Object_interface {
20015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    const struct SLObjectItf_ *mItf;    // const
20132a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
20215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct Engine_interface *mEngine;   // const
20315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    const ClassTable *mClass;       // const
20415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint32 mInstanceID;           // const for debugger and for RPC
205903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    slObjectCallback mCallback;
206903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    void *mContext;
207bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    unsigned mGottenMask;           // interfaces which are exposed or added, and then gotten
208903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
20915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    unsigned mAttributesMask;       // attributes which have changed since last sync
210903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    SLint32 mPriority;
211903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    pthread_mutex_t mMutex;
212903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    pthread_cond_t mCond;
213bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
214bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
215bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    // for best alignment, do not add any fields here
216bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Default 2
217bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
21815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // do not add any fields here
219903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IObject;
220903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
22182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "locks.h"
22282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
223903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
224903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    const struct SL3DCommitItf_ *mItf;
225903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
226193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mDeferred;
227d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
228903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DCommit;
229193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
230d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum CartesianSphericalActive {
231d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
232d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
233d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
234d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
235d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
236d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
237d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten};
238d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten
239903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
240193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
241903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
242d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
243d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // But an implementation will likely prefer one or the other. So for
244d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // maximum portablity, we maintain both units and an indication of which
245d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
246d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // the other unit has been derived yet. It can take significant time
247d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // to compute the other unit, so this may be deferred to another thread.
248d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // For this reason we also keep an indication of whether the secondary
249d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // has been computed yet, and its accuracy.
250d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
251d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // the application might read in both units (not in 1.0.1),
252d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // and due to multi-threading concerns.
253d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mVelocityCartesian;
254d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten    struct {
255d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mAzimuth;
256d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mElevation;
257d8d51367a2ad6005786b5ac904575cc7a4d9b728Glenn Kasten        SLmillidegree mSpeed;
258d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mVelocitySpherical;
259d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum CartesianSphericalActive mVelocityActive;
260193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mDopplerFactor;
261903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DDoppler;
262193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
263903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
264193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
265903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
266ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    C3DGroup *mGroup;   // link to associated group or NULL
267903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DGrouping;
268193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
269d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kastenenum AnglesVectorsActive {
270d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
271d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
272d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
273d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
274d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
275d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
276d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten};
277d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten
278903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
279193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
280903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
281d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mLocationCartesian;
282d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
283d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mAzimuth;
284d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mElevation;
285d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillimeter mDistance;
286d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mLocationSpherical;
287d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum CartesianSphericalActive mLocationActive;
288d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
289d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mHeading;
290d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mPitch;
291d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLmillidegree mRoll;
292d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mOrientationAngles;
293d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    struct {
294d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mFront;
295d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mAbove;
296d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten        SLVec3D mUp;
297d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    } mOrientationVectors;
298d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum AnglesVectorsActive mOrientationActive;
299d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Rotations can be slow, so are deferred.
300d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mTheta;
301d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mAxis;
302d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLboolean mRotatePending;
303903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DLocation;
304193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
305903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
306193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
307903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
308193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
309193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mWidth;
310193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mHeight;
311193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mDepth;
312193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mSize;
313193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
314193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mHeading;
315193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mPitch;
316193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLmillimeter mRoll;
317193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mOrientationAngles;
318193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct {
319193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLVec3D mFront;
320193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi        SLVec3D mUp;
321193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    } mOrientationVectors;
322d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    enum AnglesVectorsActive mOrientationActive;
323d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    // Rotations can be slow, so are deferred.
324d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mTheta;
325d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLVec3D mAxis;
326d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLboolean mRotatePending;
327903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DMacroscopic;
328193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
329903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
330193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
331903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
332193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mHeadRelative;
333193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
334193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillimeter mMaxDistance;
335193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillimeter mMinDistance;
336d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mConeInnerAngle;
337d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    SLmillidegree mConeOuterAngle;
338193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mConeOuterLevel;
339193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRolloffFactor;
340193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
341193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mDistanceModel;
342903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} I3DSource;
343193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
344903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
345193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
346903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
347903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioDecoderCapabilities;
348193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
349903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
350193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
351903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
352193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
353903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoder;
354193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
355903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
356193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
357903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
358903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioEncoderCapabilities;
359193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
360903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
361193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
362903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
363d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
364d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mAvailableAudioInputsChangedContext;
365d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
366d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mAvailableAudioOutputsChangedContext;
367d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
368d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mDefaultDeviceIDMapChangedContext;
369903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IAudioIODeviceCapabilities;
370193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
371903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
372193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
373903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
374193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
375193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStrength;
376903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBassBoost;
377193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
378903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct BufferQueue_interface {
379193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
380903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
38109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLBufferQueueState mState;
382193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slBufferQueueCallback mCallback;
383193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
384193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mNumBuffers;
385437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader *mArray;
386437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader *mFront, *mRear;
38715005fc0b676f8b4091528b8a9eb2705dd3820c2Jean-Michel Trivi    SLuint32 mSizeConsumed;
388193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // saves a malloc in the typical case
389193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
390437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
391903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IBufferQueue;
392193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
3937e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten#define MAX_DEVICE 2
3947e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten
395903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
396193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
397903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
3987e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLint32 mVolume[MAX_DEVICE]; // FIXME Hard-coded for default in/out
399903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDeviceVolume;
400193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
401903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
402193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
403903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
404193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
405193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
406903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicInterfaceManagement;
407193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
408903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
409193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
410903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
411193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLDataSource *mDataSource;
412903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IDynamicSource;
413193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
414193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi// private
415193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
416193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EnableLevel {
417193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnable;
418193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mSendLevel;
419193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
420193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
421bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten// indexes into IEffectSend.mEnableLevels
422bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
423bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_ENVIRONMENTALREVERB 0
424bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_PRESETREVERB        1
425bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define AUX_MAX                 2
426bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten
427903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
428193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
429903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
43015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    COutputMix *mOutputMix;     // which output mix this effect send is attached to
43115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLmillibel mDirectLevel;    // dry volume
43215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
433903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEffectSend;
434903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
435d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kastentypedef struct Engine_interface {
436193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
437903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
438193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
43999cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL
44015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
44199cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif
442193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // Each engine is its own universe.
443903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    SLuint32 mInstanceCount;
44432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    unsigned mInstanceMask; // 1 bit per active object
44515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
44632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_INSTANCE 32     // see mInstanceMask
44732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    IObject *mInstances[MAX_INSTANCE];
448437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    SLboolean mShutdown;
44915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mShutdownAck;
45015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    pthread_cond_t mShutdownCond;
451437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
452903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngine;
453193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
454903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
455193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
456903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
457193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mThreadSafe;
4587e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    // const
4597e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLuint32 mMaxIndexLED;
4607e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    SLuint32 mMaxIndexVibra;
461903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEngineCapabilities;
462193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
463903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
464193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
465903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
466193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
467903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEnvironmentalReverb;
468193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
469193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivistruct EqualizerBand {
470193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mMin;
471193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mCenter;
4724c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmilliHertz mMax;
473193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
474193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
47509f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
47609f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten
477903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
478193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
479903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
480193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
481193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mPreset;
48209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
48309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    // const to end of struct
484193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mNumPresets;
485193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mNumBands;
4864c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    const struct EqualizerBand *mBands;
48709f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    const struct EqualizerPreset *mPresets;
4884c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmillibel mBandLevelRangeMin;
4894c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLmillibel mBandLevelRangeMax;
490903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IEqualizer;
491193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
49209f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten#define MAX_LED_COUNT 32
49309f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten
494903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
495193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
496903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
497193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mLightMask;
49809f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLHSL mColors[MAX_LED_COUNT];
499193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // const
500193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mCount;
501903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ILEDArray;
502193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
503903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
504193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
505903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
506193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mKeySize;
507193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const void *mKey;
508193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mKeyEncoding;
509193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const SLchar *mValueLangCountry;
510193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mValueEncoding;
511193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint8 mFilterMask;
512ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    int mKeyFilter;
513903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataExtraction;
514193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
515903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
516193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
517903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
518193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mIndex;
519193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mMode;
520193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCount;
521193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mSize;
522903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMetadataTraversal;
523193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
524903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
525193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
526903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
527193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
528193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mMetaEventContext;
529193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
530193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mMessageContext;
5314c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLuint8 mMessageTypes;
532903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMessage;
533193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
534903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
535193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
536903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
537193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mChannelMuteMask;
538193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mChannelSoloMask;
539193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTrackMuteMask;
540193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTrackSoloMask;
541437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    // const
542193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mTrackCount;
543903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDIMuteSolo;
544193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
545903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
546193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
547903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
548193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
549193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
550903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITempo;
551193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
552903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
553193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
554903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
555193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDuration;
556193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mPosition;
557193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mStartTick;
558193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mNumTicks;
559903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMIDITime;
560193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
561903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
562193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
563903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
56415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
56515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
56615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
567903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IMuteSolo;
568193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
56932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define MAX_TRACK 32        // see mActiveMask
57032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
571903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
572193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
573903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
574d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    slMixDeviceChangeCallback mCallback;
575d1f90e7f51a10550537ccb1376e2aa6f7cbd0215Glenn Kasten    void *mContext;
576193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
577193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
57832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten    struct Track mTracks[MAX_TRACK];
579193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
580903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMix;
581193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
582193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
583903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
584193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
585903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
586903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IOutputMixExt;
587193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
588193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
589903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
590193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
591903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
592193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mPitch;
593193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // const
594193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinPitch;
595193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxPitch;
596903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPitch;
597193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
598903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct Play_interface {
599193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
600903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
60109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kasten    SLuint32 mState;
60215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // next 2 fields are read-only to application
603193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mDuration;
604193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPosition;
605193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slPlayCallback mCallback;
606193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
607193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mEventFlags;
60815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
609193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mMarkerPosition;
61015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLboolean mMarkerIsSet;
611193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
612903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlay;
613193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
614903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
615193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
616903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
617193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRate;
618193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mProperties;
6194c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    // const
620193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinRate;
621193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxRate;
622193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStepSize;
623193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCapabilities;
624903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPlaybackRate;
625193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
626903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
627193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
628903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
629193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mStatus;
630193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mLevel;
631193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slPrefetchCallback mCallback;
632193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
633193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
634193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
635903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPrefetchStatus;
636193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
637903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
638193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
639903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
640193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint16 mPreset;
641903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IPresetReverb;
642193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
643903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
644193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
645903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
646193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mRate;
6474c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    // const
648193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMinRate;
649193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mMaxRate;
650903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRatePitch;
651193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
652903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
653193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
654903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
655193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mState;
656193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mDurationLimit;
657193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPosition;
658193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slRecordCallback mCallback;
659193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
660193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
661193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mMarkerPosition;
662193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
663903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IRecord;
664193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
665903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
666193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
667903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
66815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
669193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mLoopEnabled;
670193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mStartPos;
671193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillisecond mEndPos;
672903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} ISeek;
673193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
674903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
675193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
676903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
677193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mInCriticalSection;
67815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint32 mWaiting;  // number of threads waiting
679193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    pthread_t mOwner;
680903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IThreadSync;
681193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
682903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
683193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
684903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
685193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mVibrate;
686193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mFrequency;
687193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mIntensity;
688903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVibra;
689193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
690903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
691193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
692903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
693193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLboolean mEnabled;
694193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStrength;
695903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVirtualizer;
696193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
697903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
698193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
699903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
700193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    slVisualizationCallback mCallback;
701193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    void *mContext;
702193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmilliHertz mRate;
703903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVisualization;
704193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
70515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastentypedef struct /*Volume_interface*/ {
706193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
707903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject *mThis;
70815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    // Values as specified by the application
709193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLmillibel mLevel;
710193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLpermille mStereoPosition;
71115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mMute;    // FIXME move inside each object that supports the interface
71215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
713903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} IVolume;
714193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
715193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/* Class structures */
716193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
717ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten/*typedef*/ struct C3DGroup_struct {
718903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
719bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
720bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
721903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
722903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
723903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
724903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
725903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
726ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten    unsigned mMemberMask;   // set of member objects
727ffeb2e16c2886eefa88d6eaf4c7be78c2eced82bGlenn Kasten} /*C3DGroup*/;
728193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
729b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID
730193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi/*
731193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
732193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi * media framework object
733193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi */
734193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivienum AndroidObject_type {
735f2a9b6c9fc2e5a35fd5dc19e82729eb3f894534aJean-Michel Trivi    INVALID_TYPE     =-1,
736193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    MEDIAPLAYER      = 0,
737193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
738193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
739193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
740193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi};
741226ce6a635c4a333a66b8e0ea28316a6d405ee33Jean-Michel Trivi
742b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivienum AndroidObject_state {
743b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
744b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREPARING,
745b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREPARED,
746b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_PREFETCHING,
747b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    ANDROID_READY,
748b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    NUM_ANDROID_STATES
749b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi};
750193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
751193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
7524c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
753903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
754bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
755bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
756903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
757903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlay mPlay;
758903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
759903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DGrouping m3DGrouping;
760903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
761903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
762903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBufferQueue mBufferQueue;
763903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEffectSend mEffectSend;
764903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
765903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
766903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPrefetchStatus mPrefetchStatus;
767903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IRatePitch mRatePitch;
768903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ISeek mSeek;
769903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
77015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    IMuteSolo mMuteSolo;
771193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
772903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
773903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
774903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
775903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
776903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
777903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPitch mPitch;
778903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
779903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlaybackRate mPlaybackRate;
780903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
781903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
782193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // rest of fields are not related to the interfaces
7834c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocatorFormat mDataSource;
7844c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten    DataLocatorFormat mDataSink;
785da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi    // cached data for this instance
786da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi    SLuint8 mNumChannels;
78715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    SLuint8 /*SLboolean*/ mMute;
788da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi    // implementation-specific data for this instance
78915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#ifdef USE_OUTPUTMIXEXT
79015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    struct Track *mTrack;
79115f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#endif
792193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_SNDFILE
793193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    struct SndFile mSndFile;
794193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif // USE_SNDFILE
795b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi#ifdef ANDROID
796060adae7c9af5b1470ca12f44d8f36a27987efcbJean-Michel Trivi    android::Mutex          *mpLock;
797193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
798b3a9572c70375e02b15d2ffb0e28d4c36ec269b0Jean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
799474bc3d17dc75cbaf3f553d16fe21ef35071ddadJean-Michel Trivi    android::AudioTrack *mAudioTrack;
8005d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi    android::sp<android::SfPlayer> mSfPlayer;
8015d9e8432d0217fe139987703b8e1f129296171ffJean-Michel Trivi    android::sp<android::ALooper>  mRenderLooper;
80215f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    /**
80315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     * Amplification (can be attenuation) factor derived for the VolumeLevel
80415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     */
80515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    float mAmplFromVolLevel;
80615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    /**
80715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
80815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten     */
80915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    float mAmplFromStereoPos[STEREO_CHANNELS];
810193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
8114c0d2128c7c0a8b40803026d92083b6affc417d2Glenn Kasten} /*CAudioPlayer*/;
812193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
813903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
814193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
815903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
816bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
817bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default];
818903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
819903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IRecord mRecord;
820903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioEncoder mAudioEncoder;
821193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
822903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
823903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
824903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
825903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
826903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
827d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    // rest of fields are not related to the interfaces
828d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    DataLocatorFormat mDataSource;
829d55d250a016c1400cc00b5e1ac5baaa095702585Glenn Kasten    DataLocatorFormat mDataSink;
830903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CAudioRecorder;
831193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
832903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
833193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated implicit interfaces
834903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
835bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
836bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
837903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
838903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEngine mEngine;
839903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEngineCapabilities mEngineCapabilities;
840903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IThreadSync mThreadSync;
841193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated explicit interfaces
842903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
843903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
844903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
845903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DCommit m3DCommit;
846193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
847903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDeviceVolume mDeviceVolume;
848188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten    pthread_t mSyncThread;
849903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CEngine;
850193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
851903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
852193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
853903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
854bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
855bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
856903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
857903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ILEDArray mLEDArray;
858193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDeviceID;
859903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CLEDDevice;
860193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
861903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
862193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
863903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
864bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
865bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
866903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
867903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
868903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
869903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CListener;
870193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
871903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
872193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
873903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
87415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
87515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten                                       // interfaces
876bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
877903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
878903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
879903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
880903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
881903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMetadataExtractor;
882193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
883903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
884193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
885903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
886bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
887bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
888903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
889903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlay mPlay;
890903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DDoppler m3DDoppler;
891903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DGrouping m3DGrouping;
892903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DLocation m3DLocation;
893903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DSource m3DSource;
894903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBufferQueue mBufferQueue;
895903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEffectSend mEffectSend;
896903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataExtraction mMetadataExtraction;
897903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMetadataTraversal mMetadataTraversal;
898903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDIMessage mMIDIMessage;
899903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDITime mMIDITime;
900903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDITempo mMIDITempo;
901903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
902903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPrefetchStatus mPrefetchStatus;
903903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    ISeek mSeek;
904903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
90515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    IMuteSolo mMuteSolo;
906193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
907903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    I3DMacroscopic m3DMacroscopic;
908903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
909903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicSource mDynamicSource;
910903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
911903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
912903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPitch mPitch;
913903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
914903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPlaybackRate mPlaybackRate;
915903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
916903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
917903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CMidiPlayer;
918903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten
91915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten/*typedef*/ struct COutputMix_struct {
920193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
921903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
922bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
923bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
924903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
925903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IOutputMix mOutputMix;
926193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
927903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IOutputMixExt mOutputMixExt;
928193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi#endif
929903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
930903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IEqualizer mEqualizer;
931903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IPresetReverb mPresetReverb;
932903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVirtualizer mVirtualizer;
933903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVolume mVolume;
934193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // optional interfaces
935903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IBassBoost mBassBoost;
936903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVisualization mVisualization;
93715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten} /*COutputMix*/;
938193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi
939903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kastentypedef struct {
940193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    // mandated interfaces
941903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IObject mObject;
942bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
943bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
944903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
945903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten    IVibra mVibra;
946193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    //
947193ed0e1816bfbdf71325b6a617aa2636d8fcb21Jean-Michel Trivi    SLuint32 mDeviceID;
948903042393ae2c797ffb6025979b8395a2cd1ff97Glenn Kasten} CVibraDevice;
94982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
95023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstruct MPH_init {
95123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    // unsigned char mMPH;
95223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    VoidHook mInit;
953bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten    VoidHook mResume;
95423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    VoidHook mDeinit;
95523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten};
95623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
95723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
95823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
959492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
960492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
961492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
962492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern IObject *construct(const ClassTable *class__,
963492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
964492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
965492fab3a4ef52dcf39e7e7269ea393e4ea93f3d8Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
966188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
967188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten
96832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
96932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
97032a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
971188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten
972188a1af5a1d2e2c339cded3dc5bbd99c2fd89fefGlenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
973f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten
97432a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Map an interface to it's corresponding IObject.
97532a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
97632a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten// If you have an IObject, then you're done -- you already have what you need.
97732a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
97832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
97932a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten
980da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
981da18bcf20d4cceb715904717a5a8b1585f935080Jean-Michel Trivi
9829db8335361c67c4ed877f68218835df96ce43a4bJean-Michel Trivi#ifdef ANDROID
983f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#include "sles_to_android.h"
984f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten#endif
985f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kasten
98615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc,
98715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten    DataLocatorFormat *myDataSourceLocator);
988f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator);
989f6f90fc5202248e2ae0abde6e655d7186cebc6afGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
99009f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
99109f49a84b259d8b8c49a4d71b42ea801b2a9e8f2Glenn Kastenextern void CAudioPlayer_Destroy(void *self);
992437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
993437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void CEngine_Destroy(void *self);
99499cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#ifdef USE_SDL
99599cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kastenextern void SDL_start(IEngine *thisEngine);
99699cd40bd94b21ff01fa9391b04d8dd1fa7a05da7Glenn Kasten#endif
997bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
998bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
999bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1000bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1001bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1002bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1003bcf6e4f2a46544f599f6c77354650c6aad91ea5dGlenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1004437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern void *sync_start(void *arg);
1005437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenextern SLresult err_to_result(int err);
1006277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten
1007277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#ifdef __GNUC__
100832a32a4674ed760e1ab6bf4b4349216bbfa75735Glenn Kasten#define ctz __builtin_ctz
1009277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#else
1010277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kastenextern unsigned ctz(unsigned);
1011277aee45eabf5d756a7e0de49efee2ee1c0d9640Glenn Kasten#endif
10127e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kastenextern const char * const interface_names[MPH_MAX];
101315f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#include "platform.h"
101415f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
101515f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten// Attributes
101615f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten
101715f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_NONE       ((unsigned) 0x0)    // none
101815f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_GAIN       ((unsigned) 0x1)    // player volume, channel mute, channel solo,
101915f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten                                            // player stereo position, player mute
102015f9f5e609265dff9d6036af38bea084c42a702aGlenn Kasten#define ATTR_TRANSPORT  ((unsigned) 0x2)    // play state, requested position, looping
1021