sles_allinclusive.h revision 711332800108ad6e0e594796e5f8db0da3eff402
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"
20a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#ifdef ANDROID
21a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#include "SLES/OpenSLES_Android.h"
22a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif
23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof
24773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc
25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp
26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h>  // debugging
27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging
28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h>
2932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep
30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h>
31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
32e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef __cplusplus
33e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastentypedef int bool;
34e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef false
35e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define false 0
36e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
37e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef true
38e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define true 1
39e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
40e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif
41e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
42a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor
43a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_PHONE    0x1   // == SL_PROFILES_PHONE
44a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_MUSIC    0x2   // == SL_PROFILES_MUSIC
45a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_GAME     0x4   // == SL_PROFILES_GAME
46a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Pseudo profiles, used to decide whether to include code for incomplete or untested features
47a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Features that are not in union of all profiles: audio recorder, LED, Vibra
48a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_OPTIONAL 0x8
49a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Features that are in the intersection of all profiles:
50a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// object priorities, preemption, loss of control, device configuration
51a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_BASE     0x10
52a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten
53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h"
54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h"
55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h"
565dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h"
57d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h"
58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
59acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer;
603af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder;
616a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup;
62e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix;
63acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h>
667324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h"
67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL
70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h>
71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL
72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h>
755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#include <utils/KeyedVector.h>
76b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi#include "SLES/OpenSLES_AndroidConfiguration.h"
77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h"
783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h"
793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h"
80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h"
81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h"
8214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h"
844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h"
854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h"
869cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#include "media/EffectBassBoostApi.h"
87f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#include "media/EffectVirtualizerApi.h"
887e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "media/EffectPresetReverbApi.h"
89f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#include "media/EffectEnvironmentalReverbApi.h"
9014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
916fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h>
92b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0
93daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h>
94712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi#include "android_sles_conversions.h"
9514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
96de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h"
977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_OutputMix.h"
9814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
993af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h"
100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
102e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2
103e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h"
106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
108a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten#include "sllog.h"
109a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten
110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions
111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self);
113a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten//typedef SLresult (*ResultHook)(void *self);
1143d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async);
115928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastentypedef bool (*BoolHook)(void *self);
116b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi
1175e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten// Describes how an interface is related to a given class, used in iid_vtable::mInterface
118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
1195e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_IMPLICIT            0 // no need for application to request prior to GetInterface
1205e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_EXPLICIT            1 // must be requested explicitly during object creation
1215e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_DYNAMIC             2 // can be requested after object creation
1225e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_UNAVAILABLE         3 // this interface is not available on objects of this class
123104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize
124104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize
125104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten// 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE
126c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above
127104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_PREREALIZE          4 // bit-mask to test for calling GetInterface before Realize
128c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
129c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// Profile-specific interfaces
130c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
131a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE
132c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE       INTERFACE_IMPLICIT
133c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE       INTERFACE_EXPLICIT
134c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
135c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE       INTERFACE_UNAVAILABLE
136c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE       INTERFACE_UNAVAILABLE
137c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
138c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
139a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_GAME
140c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME        INTERFACE_DYNAMIC
141c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME       INTERFACE_EXPLICIT
142c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
143c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME        INTERFACE_OPTIONAL
144c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME       INTERFACE_OPTIONAL
145c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
146c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
147a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_MUSIC
148c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC       INTERFACE_DYNAMIC
149c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
150c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC       INTERFACE_OPTIONAL
151c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
152c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
153a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
154c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_DYNAMIC
155c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT
156c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
157c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_OPTIONAL
158c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL
159c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
160c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
161a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE)
162c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT
163c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else
164c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL
165c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif
166c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten
167a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL
168c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL            INTERFACE_EXPLICIT
169c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_DYNAMIC
1707a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
171c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL            INTERFACE_UNAVAILABLE
172c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_UNAVAILABLE
1737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
1747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
175510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object
176510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
177a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_UNINITIALIZED 0  ///< not available
178a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_INITIALIZED   1  ///< not requested at object creation time
179a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_EXPOSED       2  ///< requested at object creation time
180a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_1      3  ///< part 1 of asynchronous AddInterface, pending
181a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_2      4  ///< synchronous AddInterface, or part 2 of asynchronous
182a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDED         5  ///< AddInterface has completed
183a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_REMOVING      6  ///< unlocked phase of (synchronous) RemoveInterface
184a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_SUSPENDING    7  ///< suspend in progress
185a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_SUSPENDED     8  ///< suspend has completed
186a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_1    9  ///< part 1 of asynchronous ResumeInterface, pending
187a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_2   10  ///< synchronous ResumeInterface, or part 2 of asynchronous
188a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_1A    11  ///< part 1 of asynchronous AddInterface, aborted
189a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_1A  12  ///< part 1 of asynchronous ResumeInterface, aborted
190510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
191b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
192773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it
193773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
194773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable {
19501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    unsigned char mMPH;         // primary MPH for this interface, does not include any aliases
19601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    unsigned char mInterface;   // relationship of interface to this class
197773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    /*size_t*/ unsigned short mOffset;
198773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
199773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
200773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class
201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
20301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    const struct iid_vtable *mInterfaces;   // maps interface index to info about that interface
204510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint32 mInterfaceCount;  // number of possible interfaces
205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const signed char *mMPH_to_index;
20676dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten    const char * const mName;
207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    size_t mSize;
208773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mObjectID;
209510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // hooks
2103d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi    AsyncHook mRealize;
211510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    AsyncHook mResume;
212773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    VoidHook mDestroy;
213928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    BoolHook mPreDestroy;
21472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable;
215773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
216773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data
217773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
218d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct {
219773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mBuffer;
220773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
221d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader;
222773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2237324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus
2247324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_
2257324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif
2267324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten
227773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
228773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2296a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512     // in 16-bit samples
2306a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2
2316a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten
232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile {
233773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // save URI also?
234773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLchar *mPathname;
235773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SNDFILE *mSNDFILE;
2364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SF_INFO mSfInfo;
237e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pthread_mutex_t mMutex; // protects mSNDFILE only
238e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mEOF;         // sf_read returned zero sample frames
2398c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLuint32 mWhich;        // which buffer to use next
2406a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
241773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
242773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
243773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
244773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
245acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */
246acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
247acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
248acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mLocatorType;
249acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_Address mAddress;
250acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_BufferQueue mBufferQueue;
251acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_IODevice mIODevice;
252acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
253acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_OutputMix mOutputMix;
254acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataLocator_URI mURI;
255989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID
256989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    SLDataLocator_AndroidFD mFD;
257989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif
258acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator;
259acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
260acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union {
261acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLuint32 mFormatType;
262acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_PCM mPCM;
263acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    SLDataFormat_MIME mMIME;
264acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat;
265acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
266acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct {
267acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    union {
268acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSource mSource;
269acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        SLDataSink mSink;
270acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        struct {
271acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataLocator *pLocator;
272acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten            DataFormat *pFormat;
273acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten        } mNeutral;
274acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    } u;
275acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocator mLocator;
276acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataFormat mFormat;
277acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat;
278acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten
279773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */
280773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
28172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface {
282e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const struct SLObjectItf_ *mItf;    // const
283d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    // field mThis would be redundant within an IObject, so we substitute mEngine
284e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct Engine_interface *mEngine;   // const
285e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    const ClassTable *mClass;       // const
286f51dba65751107c930759938775b75531ec1f330Glenn Kasten    SLuint32 mInstanceID;           // const for debugger and for RPC, 0 means unpublished
28772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    slObjectCallback mCallback;
28872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    void *mContext;
289e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten    unsigned mGottenMask;           ///< bit-mask of interfaces exposed or added, then gotten
29072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    unsigned mLossOfControlMask;    // interfaces with loss of control enabled
291e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mAttributesMask;       // attributes which have changed since last sync
292a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE
29372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLint32 mPriority;
2947a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
29572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_mutex_t mMutex;
296fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG
297fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    pthread_t mOwner;
298fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    const char *mFile;
299fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    int mLine;
300fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif
30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    pthread_cond_t mCond;
302510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
303a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE
304510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
3057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
3067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 mPadding;
3077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
308928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    SLuint8 mStrongRefCount;        // number of strong references to this object
309928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state)
310510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    // for best alignment, do not add any fields here
311928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#define INTERFACES_Default 1
312510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
313e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // do not add any fields here
31472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject;
31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
316a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h"
317a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
31872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    const struct SL3DCommitItf_ *mItf;
32072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
321773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mDeferred;
32232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    SLuint32 mGeneration;   // incremented each master clock cycle
323a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    SLuint32 mWaiting;      // number of threads waiting in Commit
32472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit;
325773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive {
3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_COMPUTED_SPHERICAL_SET,
3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_REQUESTED_SPHERICAL_SET,
3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_UNKNOWN_SPHERICAL_SET,
3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    CARTESIAN_SET_SPHERICAL_UNKNOWN
3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
33572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
336773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DDopplerItf_ *mItf;
33772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // The API allows client to specify either Cartesian and spherical velocities.
3397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // But an implementation will likely prefer one or the other. So for
3407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // maximum portablity, we maintain both units and an indication of which
3417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // unit was set most recently. In addition, we keep a flag saying whether
3427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the other unit has been derived yet. It can take significant time
3437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // to compute the other unit, so this may be deferred to another thread.
3447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // For this reason we also keep an indication of whether the secondary
3457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // has been computed yet, and its accuracy.
3467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Though only one unit is primary at a time, a union is inappropriate:
3477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // the application might read in both units (not in 1.0.1),
3487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // and due to multi-threading concerns.
3497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mVelocityCartesian;
35032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten    struct {
35132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mAzimuth;
35232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mElevation;
35332918086b694fc383c8c2d590ac45492801676f7Glenn Kasten        SLmillidegree mSpeed;
3547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mVelocitySpherical;
3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mVelocityActive;
356773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mDopplerFactor;
35772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler;
358773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
35972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DGroupingItf_ *mItf;
36172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
362f51dba65751107c930759938775b75531ec1f330Glenn Kasten    C3DGroup *mGroup;   // strong reference to associated group or NULL
36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping;
364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
3657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive {
3667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
3677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
3687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_UNKNOWN_VECTORS_SET,
3697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_COMPUTED,
3707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_REQUESTED,
3717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    ANGLES_SET_VECTORS_UNKNOWN
3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten};
3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten
37472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DLocationItf_ *mItf;
37672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
3777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mLocationCartesian;
3787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mAzimuth;
3807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mElevation;
3817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillimeter mDistance;
3827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mLocationSpherical;
3837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum CartesianSphericalActive mLocationActive;
3847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mHeading;
3867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mPitch;
3877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLmillidegree mRoll;
3887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationAngles;
3897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    struct {
3907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mFront;
3917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mAbove;
3927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten        SLVec3D mUp;
3937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    } mOrientationVectors;
3947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
3957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
3967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
3977754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
3987754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation;
400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DMacroscopicItf_ *mItf;
40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mWidth;
406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeight;
407773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mDepth;
408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mSize;
409773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mHeading;
411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mPitch;
412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLmillimeter mRoll;
413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationAngles;
414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct {
415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mFront;
416ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLVec3D mAbove;
417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLVec3D mUp;
418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    } mOrientationVectors;
4197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    enum AnglesVectorsActive mOrientationActive;
4207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    // Rotations can be slow, so are deferred.
4217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mTheta;
4227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLVec3D mAxis;
4237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLboolean mRotatePending;
42472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic;
425773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
42672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SL3DSourceItf_ *mItf;
42872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mHeadRelative;
430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mRolloffMaxDistanceMute;
431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMaxDistance;
432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillimeter mMinDistance;
4337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeInnerAngle;
4347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    SLmillidegree mConeOuterAngle;
435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mConeOuterLevel;
436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRolloffFactor;
437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRoomRolloffFactor;
438773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mDistanceModel;
43972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource;
440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioDecoderCapabilitiesItf_ *mItf;
44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
44472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities;
445773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderItf_ *mItf;
44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLAudioEncoderSettings mSettings;
45072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder;
451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioEncoderCapabilitiesItf_ *mItf;
45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
45572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities;
456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
45772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
45972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
4617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioInputsChangedContext;
4627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
4637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mAvailableAudioOutputsChangedContext;
4647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
4657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mDefaultDeviceIDMapChangedContext;
46672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities;
467773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBassBoostItf_ *mItf;
47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
4739cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
4749cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    effect_descriptor_t mBassBoostDescriptor;
4759cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    android::sp<android::AudioEffect> mBassBoostEffect;
4769cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif
47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost;
478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
47972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface {
480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLBufferQueueItf_ *mItf;
48172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
4823a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLBufferQueueState mState;
483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slBufferQueueCallback mCallback;
484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
4854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // originally SLuint32, but range-checked down to SLuint16
4864b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SLuint16 mNumBuffers;
4874b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    /*SLboolean*/ SLuint16 mClearRequested;
488d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mArray;
489d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader *mFront, *mRear;
4904b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID
4911ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    SLuint32 mSizeConsumed;
4924b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // saves a malloc in the typical case
494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4
495d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue;
497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
498a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define MAX_DEVICE 2    // hard-coded array size for default in/out
49940d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten
50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDeviceVolumeItf_ *mItf;
50272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
5037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLint32 mVolume[MAX_DEVICE];
50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume;
505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicInterfaceManagementItf_ *mItf;
50872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slDynamicInterfaceManagementCallback mCallback;
510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement;
512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLDynamicSourceItf_ *mItf;
51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
516773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLDataSource *mDataSource;
51772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource;
518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private
520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel {
522773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnable;
523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mSendLevel;
524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
525773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
526510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels
527510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
528510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0
529510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB        1
530510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX                 2
531510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten
53272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEffectSendItf_ *mItf;
53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
535e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
53672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend;
53772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
538ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface {
539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineItf_ *mItf;
54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
541773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLossOfControlGlobal;
54200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
543e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
54400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
545773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // Each engine is its own universe.
54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    SLuint32 mInstanceCount;
547d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    unsigned mInstanceMask; // 1 bit per active object
548e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    unsigned mChangedMask;  // objects which have changed since last sync
549a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define MAX_INSTANCE 32     // maximum active objects per engine, see mInstanceMask
550d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten    IObject *mInstances[MAX_INSTANCE];
551d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLboolean mShutdown;
552e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mShutdownAck;
553d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    ThreadPool mThreadPool; // for asynchronous operations
55414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
5557e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored
5564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    SLuint32 mEqNumPresets;
5574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char** mEqPresetNames;
5584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine;
560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
56172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEngineCapabilitiesItf_ *mItf;
56372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mThreadSafe;
56540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    // const
56640d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexLED;
56740d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten    SLuint32 mMaxIndexVibra;
56872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities;
569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
57072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEnvironmentalReverbItf_ *mItf;
57272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLEnvironmentalReverbSettings mProperties;
574172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
575172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    effect_descriptor_t mEnvironmentalReverbDescriptor;
576172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    android::sp<android::AudioEffect> mEnvironmentalReverbEffect;
577172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb;
579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand {
581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mMin;
582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mCenter;
5830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmilliHertz mMax;
584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
58614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
5874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0
5884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else
5893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
5904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
5913a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLEqualizerItf_ *mItf;
59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
597a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#if 0 < MAX_EQ_BANDS
5983a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLmillibel mLevels[MAX_EQ_BANDS];
599a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
6003a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    // const to end of struct
601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumPresets;
602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mNumBands;
603a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT)
6040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    const struct EqualizerBand *mBands;
6053a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    const struct EqualizerPreset *mPresets;
606a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
6070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMin;
6080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLmillibel mBandLevelRangeMax;
60914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
6104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_descriptor_t mEqDescriptor;
6114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::sp<android::AudioEffect> mEqEffect;
6124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
61372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer;
614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
6153a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32
6163a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten
61772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLLEDArrayItf_ *mItf;
61972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mLightMask;
6213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLHSL mColors[MAX_LED_COUNT];
622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mCount;
62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray;
625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
62672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataExtractionItf_ *mItf;
62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeySize;
630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const void *mKey;
631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mKeyEncoding;
632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const SLchar *mValueLangCountry;
633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mValueEncoding;
634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint8 mFilterMask;
6356a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    int mKeyFilter;
63672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction;
637773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
63872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMetadataTraversalItf_ *mItf;
64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mIndex;
642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMode;
643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCount;
644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mSize;
64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal;
646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMessageItf_ *mItf;
64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMetaEventCallback mMetaEventCallback;
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMetaEventContext;
652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slMIDIMessageCallback mMessageCallback;
653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mMessageContext;
6540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint8 mMessageTypes;
65572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage;
656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
65772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
658773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDIMuteSoloItf_ *mItf;
65972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
660773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelMuteMask;
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mChannelSoloMask;
662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackMuteMask;
663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTrackSoloMask;
664d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mTrackCount;
66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo;
667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
66872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
669773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITempoItf_ *mItf;
67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mTicksPerQuarterNote;
672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mMicrosecondsPerQuarterNote;
67372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo;
674773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMIDITimeItf_ *mItf;
67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
678773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDuration;
679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mPosition;
680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStartTick;
681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mNumTicks;
68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime;
683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
68472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLMuteSoloItf_ *mItf;
68672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
687b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // fields that were formerly here are now at CAudioPlayer
68872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo;
689773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
690d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32        // see mActiveMask
691d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
69272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
693773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixItf_ *mItf;
69472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
6957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    slMixDeviceChangeCallback mCallback;
6967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten    void *mContext;
69772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix;
698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLOutputMixExtItf_ *mItf;
70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
703928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    unsigned mActiveMask;   // 1 bit per active track
704928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    Track mTracks[MAX_TRACK];
705f51dba65751107c930759938775b75531ec1f330Glenn Kasten    SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
70672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt;
707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
70972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPitchItf_ *mItf;
71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
712773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mPitch;
713773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // const
714773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinPitch;
715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxPitch;
71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch;
717773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface {
719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlayItf_ *mItf;
72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
7213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    SLuint32 mState;
722e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // next 2 fields are read-only to application
723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDuration;
724773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPlayCallback mCallback;
726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mEventFlags;
728e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // the ISeek trick of using a distinct value doesn't work here because it's readable by app
729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
7308c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0)
7318c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten#ifdef USE_OUTPUTMIXEXT
7328c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLuint32 mFrameUpdatePeriod;         // mPositionUpdatePeriod in frame units
7338c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLmillisecond mLastSeekPosition;     // Last known accurate position, set at Seek
7348c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLuint32 mFramesSinceLastSeek;       // Frames mixed since last known accurate position
7358c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten    SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback
7368c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten#endif
73772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay;
738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPlaybackRateItf_ *mItf;
74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mProperties;
7440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStepSize;
748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCapabilities;
74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate;
750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
75172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPrefetchStatusItf_ *mItf;
75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mStatus;
755773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mLevel;
756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slPrefetchCallback mCallback;
757773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
758773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mFillUpdatePeriod;
76072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus;
761773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
76272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
763773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLPresetReverbItf_ *mItf;
76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint16 mPreset;
766172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
767172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    effect_descriptor_t mPresetReverbDescriptor;
768172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    android::sp<android::AudioEffect> mPresetReverbEffect;
769172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb;
771773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRatePitchItf_ *mItf;
77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
775773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mRate;
7760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // const
777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMinRate;
778773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mMaxRate;
77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch;
780773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
782773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLRecordItf_ *mItf;
78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
784773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mState;
785773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mDurationLimit;
786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPosition;
787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slRecordCallback mCallback;
788773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mCallbackEventsMask;
790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mMarkerPosition;
791773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mPositionUpdatePeriod;
79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord;
793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLSeekItf_ *mItf;
79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
797e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mLoopEnabled;
799773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mStartPos;
800773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillisecond mEndPos;
80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek;
802773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
804773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLThreadSyncItf_ *mItf;
80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mInCriticalSection;
807e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 mWaiting;  // number of threads waiting
808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    pthread_t mOwner;
80972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync;
810773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVibraItf_ *mItf;
81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mVibrate;
815773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mFrequency;
816773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mIntensity;
81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra;
818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
820773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVirtualizerItf_ *mItf;
82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
822773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLboolean mEnabled;
823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStrength;
824f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
825f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_descriptor_t mVirtualizerDescriptor;
826f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::sp<android::AudioEffect> mVirtualizerEffect;
827f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#endif
82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer;
829773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
831773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVisualizationItf_ *mItf;
83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
833773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    slVisualizationCallback mCallback;
834773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    void *mContext;
835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmilliHertz mRate;
83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization;
837773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
838e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ {
839773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    const struct SLVolumeItf_ *mItf;
84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject *mThis;
841e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // Values as specified by the application
842773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLmillibel mLevel;
843773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLpermille mStereoPosition;
8447a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
845e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mEnableStereoPosition;
84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume;
847773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */
849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
8506a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct {
85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
852510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
853510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
85472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
85572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
85772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
859a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
8606a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten    unsigned mMemberMask;   // set of member objects
8616a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/;
862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
86405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
865a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// FIXME Move these into the I... section above
866a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten
86767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivitypedef struct {
8685b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    const struct SLAndroidEffectItf_ *mItf;
86967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    IObject *mThis;
870ca533f4e1c67e9136044f25ca84b65102c8892fdEric Laurent    android::KeyedVector<SLuint32, android::AudioEffect* > *mEffects;
8715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} IAndroidEffect;
8725b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
8735b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivitypedef struct {
8745b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    const struct SLAndroidEffectCapabilitiesItf_ *mItf;
8755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    IObject *mThis;
8765b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    SLuint32 mNumFx;
8775b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    effect_descriptor_t* mFxDescriptors;
8785b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} IAndroidEffectCapabilities;
8795b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
880fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivitypedef struct {
881fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    const struct SLAndroidEffectSendItf_ *mItf;
882fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    IObject *mThis;
883fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    // only one send per interface for now (1 bus)
884fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    SLboolean mEnabled;
885fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels;
886fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} IAndroidEffectSend;
887fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi
88842309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivitypedef struct {
88942309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi    const struct SLAndroidConfigurationItf_ *mItf;
89042309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi    IObject *mThis;
89142309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi} IAndroidConfiguration;
89242309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi
8935b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
8945b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi// FIXME this include is done here so the effect structures have been defined. Messy.
8955b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#include "android_Effect.h"
8965b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#endif
8975b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
89867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
899773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
900773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android
901773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object
902773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
903773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type {
904c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    INVALID_TYPE     =-1,
905773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    MEDIAPLAYER      = 0,
906b2838f652722e4f26269aeb7db258f5d1eec7814Jean-Michel Trivi    AUDIOTRACK_PULL  = 1,
907773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    NUM_AUDIOPLAYER_MAP_TYPES
908773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi};
909f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
91080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state {
91180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_UNINITIALIZED = -1,
91280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_PREPARING,
91380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    ANDROID_READY,
91480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    NUM_ANDROID_STATES
91580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi};
916a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten
917a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif  // ANDROID
91805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
919773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
920acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct {
92172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
92205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
923fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#define INTERFACES_AudioPlayer 29 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
92405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else
925510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
92605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
927510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
92972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
93072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
93272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
93472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
93572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
93672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
93772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
93972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRatePitch mRatePitch;
94072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
94172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
942e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
94305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
9445b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    IAndroidEffect mAndroidEffect;
945fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    IAndroidEffectSend mAndroidEffectSend;
946453dd564a81fe98b7a947ae4a9844a53fa957c2bJean-Michel Trivi    IAndroidConfiguration mAndroidConfiguration;
94705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
948773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
95072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
95272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
95372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
95472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
95572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
95672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
95772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
95872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
959a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
960acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSource;
961acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    DataLocatorFormat mDataSink;
9621fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // cached data for this instance
963e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint8 /*SLboolean*/ mMute;
964b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    // Formerly at IMuteSolo
965b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
966b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
967b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
968a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
969928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // Formerly at IEffectSend
970928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    /**
971928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten     * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf
972928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten     */
973928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    SLmillibel mDirectLevel;
9741fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // implementation-specific data for this instance
975e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT
976369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    Track *mTrack;
977928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    float mGains[STEREO_CHANNELS];  ///< Computed gain based on volume, mute, solo, stereo position
978928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
979e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif
980773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE
981773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    struct SndFile mSndFile;
982773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE
98380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID
98406a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    android::Mutex          *mpLock;
985773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    enum AndroidObject_type mAndroidObjType;
98680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi    enum AndroidObject_state mAndroidObjState;
9873d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi    /** identifies which group of effects ("session") this player belongs to */
9883d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi    int mSessionId;
98975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    /** identifies the Android stream type playback will occur on */
99075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    int mStreamType;
9913d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi    /** plays the PCM data for this player */
9924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    android::AudioTrack *mAudioTrack;
99314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
994de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::sp<android::SfPlayer> mSfPlayer;
99514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
996e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
997e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Amplification (can be attenuation) factor derived for the VolumeLevel
998e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
999e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromVolLevel;
1000e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    /**
1001e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     * Left/right amplification (can be attenuations) factors derived for the StereoPosition
1002e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten     */
1003e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    float mAmplFromStereoPos[STEREO_CHANNELS];
1004172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    /**
1005fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi     * Attenuation factor derived from direct level
1006172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi     */
1007172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    float mAmplFromDirectLevel;
1008773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
1009acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/;
1010773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
10113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
10123af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct {
1013773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
101472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
10153af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
101642309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi#define INTERFACES_AudioRecorder 11 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
10173af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else
10183af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
10193af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
1020a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default];
102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
102272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IRecord mRecord;
102372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoder mAudioEncoder;
1024773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
102672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
102772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
102872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
102972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
10303af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
10313af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    IBufferQueue mBufferQueue;
103242309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi    IAndroidConfiguration mAndroidConfiguration;
10333af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
1034a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
1035ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSource;
1036ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten    DataLocatorFormat mDataSink;
1037712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    // cached data for this instance
1038712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
1039712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
10403af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    // implementation-specific data for this instance
10413af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
10423af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    android::AudioRecord *mAudioRecord;
1043b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    int mRecordSource;
10443af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
10453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/;
10463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1047773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
104872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1049773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated implicit interfaces
105072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
10515b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#ifdef ANDROID
10525b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#define INTERFACES_Engine 11 // see MPH_to_Engine in MPH_to.c for list of interfaces
10535b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#else
1054510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
10555b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#endif
1056510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
105772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
105872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngine mEngine;
105972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEngineCapabilities mEngineCapabilities;
106072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IThreadSync mThreadSync;
1061773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated explicit interfaces
106272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
106372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioDecoderCapabilities mAudioDecoderCapabilities;
106472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IAudioEncoderCapabilities mAudioEncoderCapabilities;
106572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DCommit m3DCommit;
1066928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#ifdef ANDROID
10675b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    IAndroidEffectCapabilities mAndroidEffectCapabilities;
1068928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#endif
1069773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
107072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDeviceVolume mDeviceVolume;
1071a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
1072b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    pthread_t mSyncThread;
107372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine;
1074773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
107572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1076773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
107772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1078510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
1079510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
108072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
108172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ILEDArray mLEDArray;
1082a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
1083773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
108472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice;
1085773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
108672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1087773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
108872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1089510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
1090510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
109172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
109272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
109372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
1094a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
109572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener;
1096773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
109772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1098773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
109972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1100e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
1101e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                                       // interfaces
1102510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
110372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
110472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
110572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
110672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
1107a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
110872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor;
1109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
111072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
111272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1113453dd564a81fe98b7a947ae4a9844a53fa957c2bJean-Michel Trivi
1114510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
1115510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
111672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
111772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlay mPlay;
111872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DDoppler m3DDoppler;
111972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DGrouping m3DGrouping;
112072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DLocation m3DLocation;
112172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DSource m3DSource;
112272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBufferQueue mBufferQueue;
112372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEffectSend mEffectSend;
112472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataExtraction mMetadataExtraction;
112572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMetadataTraversal mMetadataTraversal;
112672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMessage mMIDIMessage;
112772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITime mMIDITime;
112872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDITempo mMIDITempo;
112972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IMIDIMuteSolo mMIDIMuteSolo;
113072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPrefetchStatus mPrefetchStatus;
113172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    ISeek mSeek;
113272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
1133e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IMuteSolo mMuteSolo;
1134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
113572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    I3DMacroscopic m3DMacroscopic;
113672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
113772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicSource mDynamicSource;
113872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
113972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
114072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPitch mPitch;
114172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
114272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPlaybackRate mPlaybackRate;
114372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
114472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
1145a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
114672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer;
114772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten
1148e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct {
1149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
115072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
115149e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#ifdef ANDROID
115249e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
115349e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#else
1154510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
115549e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#endif
1156510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
115772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
115872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMix mOutputMix;
1159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT
116072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IOutputMixExt mOutputMixExt;
1161773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif
116272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEnvironmentalReverb mEnvironmentalReverb;
116372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IEqualizer mEqualizer;
116472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IPresetReverb mPresetReverb;
116572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVirtualizer mVirtualizer;
116672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVolume mVolume;
1167773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // optional interfaces
116872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IBassBoost mBassBoost;
116972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVisualization mVisualization;
11707e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#ifdef ANDROID
117149e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi    IAndroidEffect mAndroidEffect;
11727e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif
1173a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
1174e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/;
1175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
117672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct {
1177773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    // mandated interfaces
117872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IObject mObject;
1179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
1180510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
118172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IDynamicInterfaceManagement mDynamicInterfaceManagement;
118272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten    IVibra mVibra;
1183a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // remaining are per-instance private fields not associated with an interface
1184773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi    SLuint32 mDeviceID;
118572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice;
1186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
118761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init {
1188a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    VoidHook mInit;     // called first to initialize the interface, right after object is allocated
1189a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // Each interface is initialized regardless whether it is exposed to application.
1190a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    VoidHook mResume;   // called to resume interface after suspension, not currently used
1191a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    VoidHook mDeinit;   // called last when object is about to be destroyed
1192a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    BoolHook mExpose;   // called after initialization, only if interface is exposed to application
1193711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    VoidHook mRemove;   // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit
1194a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // will need a suspend hook when suspend is implemented
119561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
119661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
119761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
119861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
1199979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__,
1200979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
1201979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
1202979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__,
1203979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten    unsigned exposedMask, SLEngineItf engine);
1204979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID);
1205979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
1206b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object);
1207f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern void IObject_Publish(IObject *this);
1208f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern void IObject_Destroy(SLObjectItf self);
1209b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1210d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID).
1211d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1212d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly.
1213b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
1214b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
1215daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1216d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject.
1217d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis.
1218d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need.
1219d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
1220d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis)
1221d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten
12221fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
12231fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
12243af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this)))
12253af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1226ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
1227d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h"
1228daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif
1229daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten
1230e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc,
12313af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        DataLocatorFormat *myDataSourceLocator);
1232712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator,
1233712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        SLuint32 objType);
12343c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility(
1235104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten        const DataLocatorFormat *pDataLocatorFormat, const ClassTable *class__,
1236104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten        unsigned exposedMask);
1237daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf);
12383af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1239f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern bool C3DGroup_PreDestroy(void *self);
1240f51dba65751107c930759938775b75531ec1f330Glenn Kasten
12413a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
1242928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult CAudioPlayer_Resume(void *self, SLboolean async);
12433a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self);
1244928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CAudioPlayer_PreDestroy(void *self);
12453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
12463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async);
12473af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async);
12483af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self);
1249928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CAudioRecorder_PreDestroy(void *self);
12503af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1251d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async);
1252928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult CEngine_Resume(void *self, SLboolean async);
1253d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self);
1254928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CEngine_PreDestroy(void *self);
1255711332800108ad6e0e594796e5f8db0da3eff402Glenn Kastenextern void CEngine_Destroyed(CEngine *self);
12563af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
12577e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Realize(void *self, SLboolean async);
12587e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Resume(void *self, SLboolean async);
12597e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern void COutputMix_Destroy(void *self);
1260928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool COutputMix_PreDestroy(void *self);
12617e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
126200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL
1263768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_open(IEngine *thisEngine);
1264768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_close(void);
126500d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif
1266510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
1267510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
1268510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1269510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1270510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1271510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1272510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1273928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#define SL_OBJECT_STATE_DESTROYING   ((SLuint32) 0xB) // destroy object when no strong references
1274d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg);
1275d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err);
12767245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten
12777245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__
1278d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz
12797245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else
12807245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned);
12817245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif
128240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX];
1283e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h"
1284e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1285e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes
1286e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
12873c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE       ((unsigned) 0x0)      // none
12883c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN       ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo,
12893c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi                                              // player stereo position, player mute
12903c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT  ((unsigned) 0x1 << 1) // play state, looping
12913c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION   ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position)
1292343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten#define ATTR_ENQUEUE    ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state
1293a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten
1294a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0    // application specified a NULL value for pLocator
1295a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0     // application specified a NULL or undefined value for pFormat
1296ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
12977a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging
12987a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
12994c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time
13004c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceSetEnabled(unsigned enabled);
13014c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
13024c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_ENTER          0x1
13034c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_FAILURE  0x2
13044c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_VOID     0x4
13054597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE_SUCCESS  0x8
13064597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE          (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \
13074597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten                                    SL_TRACE_LEAVE_SUCCESS)
13084597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_ALL            (SL_TRACE_ENTER | SL_TRACE_LEAVE)
13095e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#ifndef SL_TRACE_DEFAULT
13104c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_DEFAULT        (SL_TRACE_LEAVE_FAILURE)
13115e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#endif
13124c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
13137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE
13147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1315486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result;
1316486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result;
1317486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result;
1318486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result;
1319486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID
1320486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return;
13217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1322ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
13237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
13244c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterGlobal(const char *function);
13254c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result);
13264c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterface(const char *function);
13274c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result);
13284c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterfaceVoid(const char *function);
13294c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function);
13304c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__);
13314c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result;
13324c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__);
13334c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result;
13344c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__);
13354c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return;
13367a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1337ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif
13380b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten
13394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT
13404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
13414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING
13424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer,
13434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty
13444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
13454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
13464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
13474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE
13484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer);
13494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif
1350e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
1351e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size);
1352e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self);
1353e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self,
1354e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten    slBufferQueueCallback callback, void *pContext);
1355e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten
1356e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH);
1357928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID);
1358928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern void ReleaseStrongRef(IObject *object);
1359928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern void ReleaseStrongRefAndUnlockExclusive(IObject *object);
1360f51dba65751107c930759938775b75531ec1f330Glenn Kasten
1361f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer);
1362