sles_allinclusive.h revision 7e01bc6208fb5b4a2a0019d67bf74373f8ee9428
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
19ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/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
29e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef __cplusplus
30e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastentypedef int bool;
31e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef false
32e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define false 0
33e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
34e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef true
35e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define true 1
36e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
37e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
38e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
39773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h"
40773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h"
41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h"
425dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h"
43d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h"
44773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer;
463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder;
476a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup;
48e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix;
49acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
50773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
51773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
527324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h"
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
56773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
57773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
607a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h>
61ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES_Android.h"
62773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
633af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h"
643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h"
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
66773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
6714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h"
694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h"
704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h"
719cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#include "media/EffectBassBoostApi.h"
72f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#include "media/EffectVirtualizerApi.h"
737e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "media/EffectPresetReverbApi.h"
7414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
756fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
76b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
77daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h>
78712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi#include "android_sles_conversions.h"
7914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
80de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h"
817e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_OutputMix.h"
8214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
833af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h"
84773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
85773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2
87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
88773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
89773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
90773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
91773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
92773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
93773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
94773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
95773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef SLresult (*StatusHook)(void *self);
963d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
97b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
98773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Describes how an interface is related to a given class
99773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_IMPLICIT           0
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define INTERFACE_EXPLICIT           1
102c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC            2
103c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_UNAVAILABLE        3
104c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above
105c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
106c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// Profile-specific interfaces
107c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
108c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE
109c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE       INTERFACE_IMPLICIT
110c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE       INTERFACE_EXPLICIT
111c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
112c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE       INTERFACE_UNAVAILABLE
113c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE       INTERFACE_UNAVAILABLE
114c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
115c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
116c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_GAME
117c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME        INTERFACE_DYNAMIC
118c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME       INTERFACE_EXPLICIT
119c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
120c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME        INTERFACE_OPTIONAL
121c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME       INTERFACE_OPTIONAL
122c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
123c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
124c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_MUSIC
125c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC       INTERFACE_DYNAMIC
126c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
127c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC       INTERFACE_OPTIONAL
128c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
129c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
130c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#if defined(USE_GAME) || defined(USE_MUSIC)
131c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_DYNAMIC
132c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT
133c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
134c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_OPTIONAL
135c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL
136c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
137c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
138c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#if defined(USE_GAME) || defined(USE_PHONE)
139c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT
140c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
141c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL
142c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
143c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
144c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_OPTIONAL
145c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL            INTERFACE_EXPLICIT
146c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_DYNAMIC
1477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
148c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL            INTERFACE_UNAVAILABLE
149c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_UNAVAILABLE
1507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
1517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
152510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object
153510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
154369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_UNINITIALIZED 1  ///< /not requested at object creation time
155369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_EXPOSED       2  ///< /requested at object creation time
156369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1      3  ///< /part 1 of asynchronous AddInterface, pending
157369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_2      4  ///< /synchronous AddInterface, or part 2 of asynchronous
158369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDED         5  ///< /AddInterface has completed
159369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_REMOVING      6  ///< /unlocked phase of (synchronous) RemoveInterface
160369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDING    7  ///< /suspend in progress
161369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_SUSPENDED     8  ///< /suspend has completed
162369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1    9  ///< /part 1 of asynchronous ResumeInterface, pending
163369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_2   10  ///< /synchronous ResumeInterface, or part 2 of asynchronous
164369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_ADDING_1A    11  ///< /part 1 of asynchronous AddInterface, aborted
165369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten#define INTERFACE_RESUMING_1A  12  ///< /part 1 of asynchronous ResumeInterface, aborted
166510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
167773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
168773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
169773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
170773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mMPH;
171773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned char mInterface;   // relationship
172773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
173773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
174773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
176773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
17772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct iid_vtable *mInterfaces;
179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
180773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
18176dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
182773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
183773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
184510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // hooks
1853d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
186510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    AsyncHook mResume;
187773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
18872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
189773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
190773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
191773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
192d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct {
193773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
194773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
195d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader;
196773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
197773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
198773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
199773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// stereo is a frame consisting of a pair of 16-bit PCM samples
200773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef struct {
202773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short left;
203773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    short right;
204773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} stereo;
205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
206773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2087324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus
2097324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_
2107324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif
2117324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten
212773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
213773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2146a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
2156a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2
2166a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten
217773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
218773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
219773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
220773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
2214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SF_INFO mSfInfo;
222e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pthread_mutex_t mMutex; // protects mSNDFILE only
223e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mEOF;         // sf_read returned zero sample frames
224773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT
225773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mRetryBuffer;
226773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mRetrySize;
2276a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    SLuint32 mWhich;    // which buffer to use next
2286a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
229773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
230773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
231773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
233acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
234acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
235acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
236acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mLocatorType;
237acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_Address mAddress;
238acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
239acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_IODevice mIODevice;
240acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
241acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
242acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_URI mURI;
243989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID
244989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    SLDataLocator_AndroidFD mFD;
245989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif
246acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator;
247acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
248acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
249acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mFormatType;
250acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_PCM mPCM;
251acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_MIME mMIME;
252acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat;
253acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
254acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct {
255acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    union {
256acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSource mSource;
257acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSink mSink;
258acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        struct {
259acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataLocator *pLocator;
260acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataFormat *pFormat;
261acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        } mNeutral;
262acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    } u;
263acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocator mLocator;
264acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataFormat mFormat;
265acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat;
266acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
267773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
268773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
26972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
270e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const struct SLObjectItf_ *mItf;    // const
271d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
272e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct Engine_interface *mEngine;   // const
273e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const ClassTable *mClass;       // const
274e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 mInstanceID;           // const for debugger and for RPC
27572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
27672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
277e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten    unsigned mGottenMask;           ///< bit-mask of interfaces exposed or added, then gotten
27872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
279e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mAttributesMask;       // attributes which have changed since last sync
280c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE
28172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
2827a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
28372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
284fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG
285fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    pthread_t mOwner;
286fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    const char *mFile;
287fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    int mLine;
288fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif
28972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
290510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
291c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#ifdef USE_BASE
292510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
2937a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
2947a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 mPadding;
2957a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
296510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // for best alignment, do not add any fields here
297510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Default 2
298510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
299e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // do not add any fields here
30072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
302a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
303a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
30472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
30572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
30672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
307773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
30832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
309a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    SLuint32 mWaiting;      // number of threads waiting in Commit
31072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
311773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
3127754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
3137754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
3147754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
3157754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
3167754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
3177754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
3187754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
3197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
3207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
32172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
322773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
32372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3247754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
3257754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
3357754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
33632918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
33732918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
33832918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
33932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
3407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
3417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
342773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
34372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
344773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
34572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
346773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
34772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3486a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    C3DGroup *mGroup;   // link to associated group or NULL
34972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
350773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
3517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
3527754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
3537754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
3547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
3567754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
3577754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
3587754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
3597754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
36072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
361773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
36272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
3647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
3667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
3677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
3687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
3697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
3707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
3747754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
3757754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3767754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
3777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
3787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
3797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
3807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
3817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
3827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
3837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
3847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
38572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
386773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
38772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
388773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
38972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
390773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
391773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
392773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
393773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
394773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
395773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
396773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
397773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
398773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
399773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
401773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
402ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLVec3D mAbove;
403773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
4057754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
4067754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
4077754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
4087754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
4097754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
41072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
41272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
41472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
416773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
4197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
4207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
421773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
422773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
423773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
424773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
42572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
426773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
42772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
428773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
42972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
43072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
433773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
43472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
43672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
43872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
439773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
44072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
444773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
44572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
4477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
4487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
4497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
4507754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
4517754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
455773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
45672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
457773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
4599cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
4609cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    effect_descriptor_t mBassBoostDescriptor;
4619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    android::sp<android::AudioEffect> mBassBoostEffect;
4629cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
46372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
464773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
46572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
466773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
46772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4683a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLBufferQueueState mState;
469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
470773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
4714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // originally SLuint32, but range-checked down to SLuint16
4724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SLuint16 mNumBuffers;
4734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    /*SLboolean*/ SLuint16 mClearRequested;
474d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mArray;
475d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mFront, *mRear;
4764b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID
4771ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
4784b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
479773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
481d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
48272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
48440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten#define MAX_DEVICE 2
48540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten
48672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
487773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
48872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4897a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLint32 mVolume[MAX_DEVICE];
49072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
491773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
49472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
495773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
496773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
49772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
498773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
49972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
500773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
50172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
502773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
50372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
504773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
506773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
508773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
511773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
512510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels
513510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
514510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0
515510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB        1
516510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX                 2
517510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
51872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
52072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
521e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillibel mDirectLevel;    // dry volume
522e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
52372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
52472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
525ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface {
526773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
52772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
528773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
52900d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
530e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
53100d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
532773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
53372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
534d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    unsigned mInstanceMask; // 1 bit per active object
535e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
536d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_INSTANCE 32     // see mInstanceMask
537d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    IObject *mInstances[MAX_INSTANCE];
538d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLboolean mShutdown;
539e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mShutdownAck;
540d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
54114e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
5427e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored
5434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    SLuint32 mEqNumPresets;
5444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char** mEqPresetNames;
5454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
547773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
54872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
549773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
55072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
551773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
55240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    // const
55340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexLED;
55440d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexVibra;
55572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
556773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
55772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
558773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
56172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
563773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
565773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
5660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
567773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
568773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
5704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0
5714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
5723a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
5734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
5743a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
57572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
576773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
57772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
578773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
5803a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
5813a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    // const to end of struct
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
583773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
5840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
5853a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    const struct EqualizerPreset *mPresets;
5860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
5870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
58814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
5894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_descriptor_t mEqDescriptor;
5904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::sp<android::AudioEffect> mEqEffect;
5914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
5947e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
5957e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_Effect.h"
5967e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif
5977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
5983a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32
5993a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
60072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
60272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
603773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
6043a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLHSL mColors[MAX_LED_COUNT];
605773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
606773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
60772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
608773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
60972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
610773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
61172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
612773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
613773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
615773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
616773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
617773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
6186a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    int mKeyFilter;
61972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
62372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
624773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
626773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
63272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
635773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
636773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
6370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
63872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
64272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
645773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
647d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
65372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
654773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
655773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
65672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
657773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
659773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
66072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
664773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
66572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
666773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
66772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
668773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
66972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
670b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // fields that were formerly here are now at CAudioPlayer
67172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
673d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32        // see mActiveMask
674d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
6787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
6797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    unsigned mActiveMask;   // 1 bit per active track
682369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    Track mTracks[MAX_TRACK];
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
68472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
686773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
68772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
688773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
68972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
69072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
691773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
692773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
69372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
694773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
69572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
696773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
697773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
703773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
70472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
7053a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLuint32 mState;
706e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // next 2 fields are read-only to application
707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
709773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
711773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
712e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
713773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
714e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mMarkerIsSet;
715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
717773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
721773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
722773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
7230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
724773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
72872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
731773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
73272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
733773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
734773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
735773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
736773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
737773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
74372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
744773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
74572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
74772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
7510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
753773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
75472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
755773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
757773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
75872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
760773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
761773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
762773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
763773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
764773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
766773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
76772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
768773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
770773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
77172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
772e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
774773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
775773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
77672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
77872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
779773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
78072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
781773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
782e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 mWaiting;  // number of threads waiting
783773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
78472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
785773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
78872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
791773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
797773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
799f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
800f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_descriptor_t mVirtualizerDescriptor;
801f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::sp<android::AudioEffect> mVirtualizerEffect;
802f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#endif
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
804773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
80772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
809773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
810773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
813e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ {
814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
81572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
816e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // Values as specified by the application
817773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
8197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
820e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
822773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
824773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8256a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct {
82672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
827510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
828510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
82972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
83172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
83372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
8346a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    unsigned mMemberMask;   // set of member objects
8356a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/;
836773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
83780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
83805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivitypedef struct {
83905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    const struct SLAndroidStreamTypeItf_ *mItf;
84005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IObject *mThis;
84105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLuint32 mStreamType;
84205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi} IAndroidStreamType;
84305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
84467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivitypedef struct {
84567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    const struct SLAndroidAudioEffectItf_ *mItf;
84667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    IObject *mThis;
84767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} IAndroidAudioEffect;
84867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
850773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
851773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
852773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
853773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
854c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
856773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PUSH  = 1,
857773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    AUDIOTRACK_PULL  = 2,
858773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
859773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
860f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
86180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state {
86280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARING,
86480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARED,
86580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREFETCHING,
86680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_READY,
86780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    NUM_ANDROID_STATES
86880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi};
86905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif //ifdef ANDROID
87005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
871773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
872acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
87372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
87405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
87567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi#define INTERFACES_AudioPlayer 28 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
87605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else
877510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
87805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
879510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
88072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
88172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
88272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
88372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
88472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
88572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
88672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
88772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
88872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
88972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
89072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
89172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
89272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
89372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
894e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
89505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
89605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IAndroidStreamType  mAndroidStreamType;
89767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    IAndroidAudioEffect mAndroidAudioEffect;
89805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
899773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
90072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
90172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
90272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
90372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
90472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
90572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
90672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
90772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
90872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
90972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
910773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // rest of fields are not related to the interfaces
911acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSource;
912acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSink;
913343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten    COutputMix *mOutputMix;     // output mix this audio player is attached to, for effect send
9141fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // cached data for this instance
915e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
916b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // Formerly at IMuteSolo
917b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
918b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
919b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
920a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
9211fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // implementation-specific data for this instance
922e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT
923369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    Track *mTrack;
924e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif
925773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
926773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
927773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
92880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
92906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    android::Mutex          *mpLock;
930773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
93180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
9324614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    android::AudioTrack *mAudioTrack;
93314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
934de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::sp<android::SfPlayer> mSfPlayer;
935de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::sp<android::ALooper>  mRenderLooper;
93614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
937e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
938e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Amplification (can be attenuation) factor derived for the VolumeLevel
939e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
940e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromVolLevel;
941e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
942e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
943e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
944e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromStereoPos[STEREO_CHANNELS];
945773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
946acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/;
947773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
9483af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
9493af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct {
950773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
9523af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
9533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 10 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
9543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else
9553af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
9563af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
957510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceContinued[INTERFACES_AudioRecorder - INTERFACES_Default];
95872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
95972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
96072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
961773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
96272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
96372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
96472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
96572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
96672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
9673af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
9683af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    IBufferQueue mBufferQueue;
9693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
970ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    // rest of fields are not related to the interfaces
971ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSource;
972ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSink;
973712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    // cached data for this instance
974712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
975712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
9763af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    // implementation-specific data for this instance
9773af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
9783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    android::AudioRecord *mAudioRecord;
9793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
9803af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/;
9813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
982773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
98372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
984773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
98572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
986510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
987510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
98872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
98972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
99072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
99172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
992773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
99372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
99472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
99572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
99672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
997773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
99872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
9997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    // rest of fields are not related to the interfaces
1000b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
100172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
1002773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
100372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1004773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
100572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1006510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
1007510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
100872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
100972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
1010773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
101172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
1012773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
101372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1014773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
101572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1016510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
1017510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
101872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
101972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
102072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
1022773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
102372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1024773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1026e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
1027e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                                       // interfaces
1028510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
102972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
103072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
103172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
103272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
103372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
1034773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
103572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1036773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
103772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
103805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
103905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define INTERFACES_MidiPlayer 30 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
104005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else
1041510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
104205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
1043510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
104472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
104572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
104672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
104772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
104872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
104972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
105072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
105172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
105272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
105372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
105472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
105572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
105672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
105772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
105872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
105972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
106072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
1061e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
1062a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#ifdef ANDROID
106305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    IAndroidStreamType mAndroidStreamType;
1064a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#endif
1065773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
106672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
106772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
106872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
106972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
107072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
107172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
107272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
107372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
107472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
107572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
107672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
107772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
1078e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct {
1079773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
108072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1081510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
1082510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
108372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
108472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
1085773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
108672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
1087773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
108872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
108972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
109072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
109172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
109272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
1093773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
109472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
109572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
10967e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // implementation-specific data for this instance
10977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#ifdef ANDROID
10987e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif
1099e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/;
1100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
110172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1102773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
110372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1104510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
1105510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
110672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
110772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
1108773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    //
1109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
111072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
1111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
111261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
111361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // unsigned char mMPH;
111461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mInit;
1115510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    VoidHook mResume;
111661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    VoidHook mDeinit;
111761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
111861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
111961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
112061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
1121979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
1122979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
1123979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
1124979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
1125979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
1126979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
1127979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
1128b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
1129b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1130d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
1131d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1132d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
1133b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1134b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
1135daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1136d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject.
1137d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1138d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need.
1139d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
1140d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
1141d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
11421fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
11431fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
11443af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this)))
11453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1146ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
1147d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h"
1148daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif
1149daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1150e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc,
11513af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        DataLocatorFormat *myDataSourceLocator);
1152712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator,
1153712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        SLuint32 objType);
11543c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility(
11553c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        const DataLocatorFormat *pDataLocatorFormat,
11563c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
11573c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi        const SLboolean *pInterfaceRequired);
1158daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
11593af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
11603a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
11613a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self);
11623af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
11633af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async);
11643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async);
11653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self);
11663af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1167d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
1168d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self);
11693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
11707e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Realize(void *self, SLboolean async);
11717e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Resume(void *self, SLboolean async);
11727e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern void COutputMix_Destroy(void *self);
11737e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
117400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
1175768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_open(IEngine *thisEngine);
1176768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_close(void);
117700d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
1178510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
1179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
1180510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1181510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1182510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1183510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1184510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1185d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg);
1186d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err);
11877245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten
11887245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__
1189d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz
11907245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else
11917245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned);
11927245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif
119340d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX];
1194e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h"
1195e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1196e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes
1197e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
11983c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE       ((unsigned) 0x0)      // none
11993c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN       ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo,
12003c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi                                              // player stereo position, player mute
12013c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT  ((unsigned) 0x1 << 1) // play state, looping
12023c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION   ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position)
1203343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten#define ATTR_ENQUEUE    ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state
1204a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten
1205a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0    // application specified a NULL value for pLocator
1206a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0     // application specified a NULL or undefined value for pFormat
1207ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
12087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging
12097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
12104c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time
12114c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceSetEnabled(unsigned enabled);
12124c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
12134c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_ENTER          0x1
12144c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_FAILURE  0x2
12154c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_VOID     0x4
12164597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE_SUCCESS  0x8
12174597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE          (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \
12184597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten                                    SL_TRACE_LEAVE_SUCCESS)
12194597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_ALL            (SL_TRACE_ENTER | SL_TRACE_LEAVE)
12204c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_DEFAULT        (SL_TRACE_LEAVE_FAILURE)
12214c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
12227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE
12237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1224486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result;
1225486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result;
1226486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result;
1227486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result;
1228486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID
1229486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return;
12307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
12327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
12334c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterGlobal(const char *function);
12344c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result);
12354c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterface(const char *function);
12364c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result);
12374c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterfaceVoid(const char *function);
12384c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function);
12394c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__);
12404c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result;
12414c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__);
12424c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result;
12434c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__);
12444c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return;
12457a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif
12470b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten
1248fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG
12494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGE(...) do { fprintf(stderr, "ERROR: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \
12504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0)
12514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_LOGV(...) do { fprintf(stderr, "VERBOSE: %s:%s:%d ", __FILE__, __FUNCTION__, __LINE__); \
12524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0)
1253fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#else
1254fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#define SL_LOGE(...) do { } while (0)
1255fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#define SL_LOGV(...) do { } while (0)
1256fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif
12574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
12584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT
12594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
12604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING
12614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer,
12624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty
12634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
12644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
12654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
12664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE
12674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer);
12684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
12694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID
12704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern SLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer);
12710b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten#endif
1272e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
1273e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size);
1274e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self);
1275e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self,
1276e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten    slBufferQueueCallback callback, void *pContext);
1277e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
1278e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH);
1279