sles_allinclusive.h revision 369f3138f19f7102bf0f98b890ab84c8df633a93
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License.
6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at
7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and
14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License.
15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
17369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */
18369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
19773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OpenSLES.h"
20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof
21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc
22773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp
23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h>  // debugging
24773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging
25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h>
2632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep
27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h>
28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h"
30773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h"
31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h"
327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include "OpenSLUT.h"
33d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h"
34773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer;
363af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder;
376a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup;
38e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix;
39acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
41773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
427324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h"
43773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
46773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
47773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
48773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h>
5105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include "OpenSLES_Android.h"
52773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h"
543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h"
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h"
584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h"
594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h"
606fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
61b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
62daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h>
63de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h"
644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "android_Effect.h"
653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h"
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2
69e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
73773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
75773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
783d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
79b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
82773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
83773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL           2
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC            3
86daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#define INTERFACE_UNAVAILABLE        4
87773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_GAME       INTERFACE_DYNAMIC
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC      INTERFACE_DYNAMIC
89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC
90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT_GAME      INTERFACE_EXPLICIT
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME               INTERFACE_OPTIONAL
92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_GAME_MUSIC         INTERFACE_OPTIONAL
93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_MUSIC_GAME         INTERFACE_OPTIONAL
94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_OPTIONAL_DYNAMIC   INTERFACE_DYNAMIC
95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_PHONE_GAME         INTERFACE_OPTIONAL
96773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_TBD                INTERFACE_IMPLICIT
97773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
987a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE
997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_IMPLICIT_CT        INTERFACE_IMPLICIT
1007a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_CT        INTERFACE_EXPLICIT
1017a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_GAME_CT   INTERFACE_EXPLICIT_GAME
1027a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_OPTIONAL_CT        INTERFACE_OPTIONAL
1037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
1047a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_IMPLICIT_CT        INTERFACE_UNAVAILABLE
1057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_CT        INTERFACE_UNAVAILABLE
1067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_EXPLICIT_GAME_CT   INTERFACE_UNAVAILABLE
1077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define INTERFACE_OPTIONAL_CT        INTERFACE_UNAVAILABLE
1087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
1097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
110510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object
111510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
112369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_UNINITIALIZED 1  ///< /not requested at object creation time
113369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_EXPOSED       2  ///< /requested at object creation time
114369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1      3  ///< /part 1 of asynchronous AddInterface, pending
115369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_2      4  ///< /synchronous AddInterface, or part 2 of asynchronous
116369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDED         5  ///< /AddInterface has completed
117369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_REMOVING      6  ///< /unlocked phase of (synchronous) RemoveInterface
118369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDING    7  ///< /suspend in progress
119369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDED     8  ///< /suspend has completed
120369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1    9  ///< /part 1 of asynchronous ResumeInterface, pending
121369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_2   10  ///< /synchronous ResumeInterface, or part 2 of asynchronous
122369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1A    11  ///< /part 1 of asynchronous AddInterface, aborted
123369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1A  12  ///< /part 1 of asynchronous ResumeInterface, aborted
124510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
125773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
126773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
127773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
128773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
129773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
130773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
131773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
132773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
133773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
13572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
136773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
137510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
138773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
13976dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
142510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // hooks
1433d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
144510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    AsyncHook mResume;
145773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
14672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
147773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
150d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct {
151773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
152773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
153d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader;
154773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
155773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
156773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
157773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
158773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
160773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
161773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
162773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
163773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
164773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
165773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1667324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus
1677324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_
1687324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif
1697324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten
170773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
171773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1726a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
1736a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2
1746a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten
175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
176773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
177773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
1794b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SF_INFO mSfInfo;
180e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pthread_mutex_t mMutex; // protects mSNDFILE only
181e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mEOF;         // sf_read returned zero sample frames
182773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
183773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
184773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
1856a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    SLuint32 mWhich;    // which buffer to use next
1866a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
187773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
188773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
189773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
190773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
191acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
192acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
193acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
194acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mLocatorType;
195acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_Address mAddress;
196acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
197acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_IODevice mIODevice;
198acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
199acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
200acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_URI mURI;
201989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID
202989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    SLDataLocator_AndroidFD mFD;
203989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif
204acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator;
205acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
206acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
207acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mFormatType;
208acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_PCM mPCM;
209acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_MIME mMIME;
210acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat;
211acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
212acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct {
213acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    union {
214acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSource mSource;
215acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSink mSink;
216acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        struct {
217acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataLocator *pLocator;
218acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataFormat *pFormat;
219acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        } mNeutral;
220acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    } u;
221acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocator mLocator;
222acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataFormat mFormat;
223acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat;
224acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
225773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
226773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
22772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
228e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const struct SLObjectItf_ *mItf;    // const
229d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
230e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct Engine_interface *mEngine;   // const
231e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const ClassTable *mClass;       // const
232e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 mInstanceID;           // const for debugger and for RPC
23372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
23472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
235510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    unsigned mGottenMask;           // interfaces which are exposed or added, and then gotten
23672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
237e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mAttributesMask;       // attributes which have changed since last sync
2387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE
23972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
2407a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
24172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
24272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
243510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
2447a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_CONFORMANCE
245510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
2467a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
2477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 mPadding;
2487a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
249510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // for best alignment, do not add any fields here
250510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2
251510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
252e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // do not add any fields here
25372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
25472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
255a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
256a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
25772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
25872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
25972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
260773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
26132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
262a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    SLuint32 mWaiting;      // number of threads waiting in Commit
26372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
264773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
2667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
2677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
2687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
2697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
2707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
2717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
2727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
2737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
27472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
275773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
2777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
2787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
2797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
2807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
2817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
2827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
2837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
2847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
2857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
2867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
2877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
2887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
28932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
29032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
29132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
29232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
2937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
2947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
295773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
29672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
297773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
29872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
299773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3016a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    C3DGroup *mGroup;   // link to associated group or NULL
30272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
303773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
3047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
3057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
3067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
3077754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
3087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
3097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
3107754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
3117754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
31372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
314773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
3197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
3207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
3217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
3227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
3237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
3357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
3367754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
3377754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
33872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
339773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
341773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
34272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
343773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
345773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
347773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
348773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
349773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
351773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
352773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
353773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
354773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
355ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLVec3D mAbove;
356773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
357773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
3607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
3617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
3627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
36572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
366773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
36772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
368773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
369773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
370773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
371773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
374773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
376773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
377773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
37872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
379773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
381773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
38272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
38372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
384773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
390773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
39372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
39472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
39672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
39872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3997754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
4007754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
4017754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
4027754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
4037754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
4047754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
40572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
40972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
41272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
41472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
41672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4173a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLBufferQueueState mState;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
419773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
4204b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // originally SLuint32, but range-checked down to SLuint16
4214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SLuint16 mNumBuffers;
4224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    /*SLboolean*/ SLuint16 mClearRequested;
423d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mArray;
424d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mFront, *mRear;
4254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID
4261ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
4274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
430d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
43172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2
43440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten
43572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
43772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLint32 mVolume[MAX_DEVICE];
43972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
445773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
45072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
454773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
459773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
460773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
461510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels
462510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
463510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0
464510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB        1
465510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX                 2
466510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
468773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
46972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
470e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    COutputMix *mOutputMix;     // which output mix this effect send is attached to
471e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillibel mDirectLevel;    // dry volume
472e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
47372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
47472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
475ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface {
476773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
47900d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
480e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
48100d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
482773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
48372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
484d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    unsigned mInstanceMask; // 1 bit per active object
485e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
486d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32     // see mInstanceMask
487d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    IObject *mInstances[MAX_INSTANCE];
488d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLboolean mShutdown;
489e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mShutdownAck;
490e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pthread_cond_t mShutdownCond;
491d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
4924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID
4934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    SLuint32 mEqNumPresets;
4944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char** mEqPresetNames;
4954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
499773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
50240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    // const
50340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexLED;
50440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexVibra;
50572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
50972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
513773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
515773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
5160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
517773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
5194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID
5204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0
5214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
5223a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
5234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
5243a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
52572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
529773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
5303a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
5313a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    // const to end of struct
532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
5340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
5353a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    const struct EqualizerPreset *mPresets;
5360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
5370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
5384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#ifdef ANDROID
5394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_descriptor_t mEqDescriptor;
5404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::sp<android::AudioEffect> mEqEffect;
5414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
54272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
543773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
5443a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32
5453a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
54872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
5503a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLHSL mColors[MAX_LED_COUNT];
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
552773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
55372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
554773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
55772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
559773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
561773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
5646a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    int mKeyFilter;
56572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
566773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
56972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
570773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
572773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
57472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
575773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
577773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
5830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
58472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
587773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
58872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
589773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
590773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
591773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
592773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
593d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
594773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
59572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
598773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
59972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
600773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
60672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
607773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
609773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
61172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
61372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
61572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
616b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // fields that were formerly here are now at CAudioPlayer
61772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
619d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32        // see mActiveMask
620d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
62172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
62372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
6247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
6257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
628369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    Track mTracks[MAX_TRACK];
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
63372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
63572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
63672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
637773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
638773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
640773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
64172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
64672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
647773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
649773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
65072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
6513a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLuint32 mState;
652e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // next 2 fields are read-only to application
653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
658e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
660e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mMarkerIsSet;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
66272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
66472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
6690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
670773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
673773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
67472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
675773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
67672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
677773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
67872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
682773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
684773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
68572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
690773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
69172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
6970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
703773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
705773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
706773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
711773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
712773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
71372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
714773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
71572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
716773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
71772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
718e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
720773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
72272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
72472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
72672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
728e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 mWaiting;  // number of threads waiting
729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
73472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
736773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
73872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
739773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
741773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
74272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
751773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
755e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ {
756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
75772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
758e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // Values as specified by the application
759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
7617a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
762e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
76372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
764773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
7676a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct {
76872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
769510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
770510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
77372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
77572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
7766a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    unsigned mMemberMask;   // set of member objects
7776a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/;
778773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
77980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
78005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivitypedef struct {
78105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    const struct SLAndroidStreamTypeItf_ *mItf;
78205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IObject *mThis;
78305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLuint32 mStreamType;
78405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi} IAndroidStreamType;
78505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
788773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
791c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
792773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
794773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
796773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
797f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
79880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state {
79980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
80080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARING,
80180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARED,
80280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREFETCHING,
80380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_READY,
80480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    NUM_ANDROID_STATES
80580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi};
80605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif //ifdef ANDROID
80705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
809acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
81072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
81105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
81205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_AudioPlayer 27 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
81305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else
814510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
81505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
816510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
81872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
82072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
82272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
82372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
82472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
82572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
82772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
831e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
83205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
83305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IAndroidStreamType  mAndroidStreamType;
83405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
83772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
83872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
83972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
84172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
84272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
84372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
84472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
84572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
846773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
847acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSource;
848acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSink;
8491fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // cached data for this instance
850e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
851b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // Formerly at IMuteSolo
852b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
853b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
854b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
855a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
8561fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // implementation-specific data for this instance
857e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT
858369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    Track *mTrack;
859e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif
860773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
861773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
86406a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    android::Mutex          *mpLock;
865773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
86680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
8674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    android::AudioTrack *mAudioTrack;
868de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::sp<android::SfPlayer> mSfPlayer;
869de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::sp<android::ALooper>  mRenderLooper;
870e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
871e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Amplification (can be attenuation) factor derived for the VolumeLevel
872e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
873e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromVolLevel;
874e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
875e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
876e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
877e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromStereoPos[STEREO_CHANNELS];
878773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
879acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/;
880773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
8823af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct {
883773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
8853af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
8863af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 10 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
8873af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else
8883af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
8893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
890510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default];
89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
894773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
89572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
89672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
89772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
89872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
89972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
9003af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
9013af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    IBufferQueue mBufferQueue;
9023af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
903ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    // rest of fields are not related to the interfaces
904ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSource;
905ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSink;
9063af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    // implementation-specific data for this instance
9073af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
9083af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    android::AudioRecord *mAudioRecord;
9093af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
9103af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/;
9113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
912773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
91372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
914773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
91572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
916510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
917510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
91872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
91972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
92072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
92172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
922773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
92372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
92472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
92572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
92672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
9297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    // rest of fields are not related to the interfaces
930b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
932773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
934773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
93572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
936510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
937510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
93972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
940773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
94172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
942773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
94372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
944773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
94572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
946510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
947510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
94872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
95072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
952773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
95372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
954773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
95572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
956e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
957e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                                       // interfaces
958510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
95972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
96072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
96172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
96272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
96372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
964773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
96572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
966773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
96772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
96805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
96905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
97005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else
971510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
97205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
973510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
97472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
97572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
97672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
97772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
97872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
97972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
98072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
98172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
98272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
98372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
98472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
98572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
98672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
98772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
98872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
98972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
99072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
991e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
992a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#ifdef ANDROID
99305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IAndroidStreamType mAndroidStreamType;
994a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#endif
995773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
99672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
99772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
99872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
99972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
100072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
100172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
100272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
100372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
100472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
100572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
100672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
100772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
1008e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct {
1009773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
101072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1011510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
1012510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
101372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
101472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
1015773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
101672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
1017773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
101872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
101972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
102072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
102272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
1023773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
102472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
1026e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/;
1027773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
102872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1029773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
103072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1031510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
1032510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
103372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
103472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
1035773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
1036773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
103772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
1038a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
103961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
104061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
104161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
1042510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    VoidHook mResume;
104361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
104461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
104561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
104661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
104761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
1048979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
1049979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
1050979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
1051979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
1052979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
1053979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
1054979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
1055b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
1056b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1057d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
1058d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1059d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
1060b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1061b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
1062daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1063d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject.
1064d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1065d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need.
1066d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
1067d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
1068d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
10691fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
10701fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
10713af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this)))
10723af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1073ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
1074d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h"
1075daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif
1076daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1077e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc,
10783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        DataLocatorFormat *myDataSourceLocator);
1079daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator);
10803c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility(
10813c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        const DataLocatorFormat *pDataLocatorFormat,
10823c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
10833c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        const SLboolean *pInterfaceRequired);
1084daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
10853af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
10863a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
10873a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self);
10883af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
10893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async);
10903af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async);
10913af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self);
10923af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1093d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
1094d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self);
10953af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
109600d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
109700d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kastenextern void SDL_start(IEngine *thisEngine);
109800d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
1099510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
1100510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
1101510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1102510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1103510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1104510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1105510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1106d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg);
1107d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err);
11087245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten
11097245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__
1110d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz
11117245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else
11127245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned);
11137245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif
111440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX];
1115e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h"
1116e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1117e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes
1118e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
11193c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE       ((unsigned) 0x0)      // none
11203c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN       ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo,
11213c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi                                              // player stereo position, player mute
11223c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT  ((unsigned) 0x1 << 1) // play state, looping
11233c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION   ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position)
11244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define ATTR_ENQUEUE    ((unsigned) 0x1 << 3) // buffer queue became non-empty while in playing state, (NTF rename)
1125a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten
1126a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0    // application specified a NULL value for pLocator
1127a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0     // application specified a NULL or undefined value for pFormat
1128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
11297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging
11307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
11317a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE
11327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1133486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result;
1134486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result;
1135486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result;
1136486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result;
1137486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID
1138486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return;
11397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
11417a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterGlobal(const char *function);
1143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveGlobal(const char *function, SLresult result);
1144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterInterface(const char *function);
1145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveInterface(const char *function, SLresult result);
1146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slEnterInterfaceVoid(const char *function);
1147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenextern void slLeaveInterfaceVoid(const char *function);
1148486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; slEnterGlobal(__FUNCTION__);
1149486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL slLeaveGlobal(__FUNCTION__, result); return result;
1150486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; slEnterInterface(__FUNCTION__);
1151486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE slLeaveInterface(__FUNCTION__, result); return result;
1152486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID slEnterInterfaceVoid(__FUNCTION__);
1153486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID slLeaveInterfaceVoid(__FUNCTION__); return;
11547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif
11560b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten
11574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGE(...) do { fprintf(stderr, "ERROR: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \
11584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0)
11594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// #define SL_LOGV
11604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGV(...) do { fprintf(stderr, "VERBOSE: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \
11614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0)
11624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
11634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT
11644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
11654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING
11664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer,
11674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty
11684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
11694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
11704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
11714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE
11724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer);
11734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
11744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID
11754b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern SLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer);
11760b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten#endif
1177