• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /** \file sles_allinclusive.h Everything including the kitchen sink */
18 
19 #include "SLES/OpenSLES.h"
20 #ifdef ANDROID
21 #include "SLES/OpenSLES_Android.h"
22 #endif
23 #include <stddef.h> // offsetof
24 #include <stdlib.h> // malloc
25 #include <string.h> // memcmp
26 #include <stdio.h>  // debugging
27 #include <assert.h> // debugging
28 #include <pthread.h>
29 #include <unistd.h> // usleep
30 #include <errno.h>
31 
32 #ifndef __cplusplus
33 typedef int bool;
34 #ifndef false
35 #define false 0
36 #endif
37 #ifndef true
38 #define true 1
39 #endif
40 #endif
41 
42 // The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor
43 #define USE_PROFILES_PHONE    0x1   // == SL_PROFILES_PHONE
44 #define USE_PROFILES_MUSIC    0x2   // == SL_PROFILES_MUSIC
45 #define USE_PROFILES_GAME     0x4   // == SL_PROFILES_GAME
46 // Pseudo profiles, used to decide whether to include code for incomplete or untested features
47 // Features that are not in union of all profiles: audio recorder, LED, Vibra
48 #define USE_PROFILES_OPTIONAL 0x8
49 // Features that are in the intersection of all profiles:
50 // object priorities, preemption, loss of control, device configuration
51 #define USE_PROFILES_BASE     0x10
52 
53 #include "MPH.h"
54 #include "MPH_to.h"
55 #include "devices.h"
56 #include "OpenSLESUT.h"
57 #include "ThreadPool.h"
58 
59 typedef struct CAudioPlayer_struct CAudioPlayer;
60 typedef struct CAudioRecorder_struct CAudioRecorder;
61 typedef struct C3DGroup_struct C3DGroup;
62 typedef struct COutputMix_struct COutputMix;
63 
64 #ifdef USE_SNDFILE
65 #include <sndfile.h>
66 #include "SLSndFile.h"
67 #endif // USE_SNDFILE
68 
69 #ifdef USE_SDL
70 #include <SDL/SDL_audio.h>
71 #endif // USE_SDL
72 
73 #ifdef ANDROID
74 #include <utils/Log.h>
75 #include <utils/KeyedVector.h>
76 #include "SLES/OpenSLES_AndroidConfiguration.h"
77 #include "media/AudioSystem.h"
78 #include "media/mediarecorder.h"
79 #include "media/AudioRecord.h"
80 #include "media/AudioTrack.h"
81 #include "media/mediaplayer.h"
82 #ifndef USE_BACKPORT
83 #include "media/AudioEffect.h"
84 #include "media/EffectApi.h"
85 #include "media/EffectEqualizerApi.h"
86 #include "media/EffectBassBoostApi.h"
87 #include "media/EffectVirtualizerApi.h"
88 #include "media/EffectPresetReverbApi.h"
89 #include "media/EffectEnvironmentalReverbApi.h"
90 #endif
91 #include <utils/String8.h>
92 #define ANDROID_SL_MILLIBEL_MAX 0
93 #include <binder/ProcessState.h>
94 #include "android_sles_conversions.h"
95 #ifndef USE_BACKPORT
96 #include "android_SfPlayer.h"
97 #include "android_OutputMix.h"
98 #endif
99 #include "android_AudioRecorder.h"
100 #endif
101 
102 #define STEREO_CHANNELS 2
103 
104 #ifdef USE_OUTPUTMIXEXT
105 #include "OutputMixExt.h"
106 #endif
107 
108 #include "sllog.h"
109 
110 // Hook functions
111 
112 typedef void (*VoidHook)(void *self);
113 //typedef SLresult (*ResultHook)(void *self);
114 typedef SLresult (*AsyncHook)(void *self, SLboolean async);
115 typedef bool (*BoolHook)(void *self);
116 
117 // Describes how an interface is related to a given class, used in iid_vtable::mInterface
118 
119 #define INTERFACE_IMPLICIT            0 // no need for application to request prior to GetInterface
120 #define INTERFACE_EXPLICIT            1 // must be requested explicitly during object creation
121 #define INTERFACE_DYNAMIC             2 // can be requested after object creation
122 #define INTERFACE_UNAVAILABLE         3 // this interface is not available on objects of this class
123 #define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize
124 #define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize
125 // 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE
126 // note that INTERFACE_OPTIONAL is always re-mapped to one of the above
127 #define INTERFACE_PREREALIZE          4 // bit-mask to test for calling GetInterface before Realize
128 
129 // Profile-specific interfaces
130 
131 #if USE_PROFILES & USE_PROFILES_BASE
132 #define INTERFACE_IMPLICIT_BASE       INTERFACE_IMPLICIT
133 #define INTERFACE_EXPLICIT_BASE       INTERFACE_EXPLICIT
134 #else
135 #define INTERFACE_IMPLICIT_BASE       INTERFACE_UNAVAILABLE
136 #define INTERFACE_EXPLICIT_BASE       INTERFACE_UNAVAILABLE
137 #endif
138 
139 #if USE_PROFILES & USE_PROFILES_GAME
140 #define INTERFACE_DYNAMIC_GAME        INTERFACE_DYNAMIC
141 #define INTERFACE_EXPLICIT_GAME       INTERFACE_EXPLICIT
142 #else
143 #define INTERFACE_DYNAMIC_GAME        INTERFACE_OPTIONAL
144 #define INTERFACE_EXPLICIT_GAME       INTERFACE_OPTIONAL
145 #endif
146 
147 #if USE_PROFILES & USE_PROFILES_MUSIC
148 #define INTERFACE_DYNAMIC_MUSIC       INTERFACE_DYNAMIC
149 #else
150 #define INTERFACE_DYNAMIC_MUSIC       INTERFACE_OPTIONAL
151 #endif
152 
153 #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
154 #define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_DYNAMIC
155 #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT
156 #else
157 #define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_OPTIONAL
158 #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL
159 #endif
160 
161 #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE)
162 #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT
163 #else
164 #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL
165 #endif
166 
167 #if USE_PROFILES & USE_PROFILES_OPTIONAL
168 #define INTERFACE_OPTIONAL            INTERFACE_EXPLICIT
169 #define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_DYNAMIC
170 #else
171 #define INTERFACE_OPTIONAL            INTERFACE_UNAVAILABLE
172 #define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_UNAVAILABLE
173 #endif
174 
175 // Describes how an interface is related to a given object
176 
177 #define INTERFACE_UNINITIALIZED 0  ///< not available
178 #define INTERFACE_INITIALIZED   1  ///< not requested at object creation time
179 #define INTERFACE_EXPOSED       2  ///< requested at object creation time
180 #define INTERFACE_ADDING_1      3  ///< part 1 of asynchronous AddInterface, pending
181 #define INTERFACE_ADDING_2      4  ///< synchronous AddInterface, or part 2 of asynchronous
182 #define INTERFACE_ADDED         5  ///< AddInterface has completed
183 #define INTERFACE_REMOVING      6  ///< unlocked phase of (synchronous) RemoveInterface
184 #define INTERFACE_SUSPENDING    7  ///< suspend in progress
185 #define INTERFACE_SUSPENDED     8  ///< suspend has completed
186 #define INTERFACE_RESUMING_1    9  ///< part 1 of asynchronous ResumeInterface, pending
187 #define INTERFACE_RESUMING_2   10  ///< synchronous ResumeInterface, or part 2 of asynchronous
188 #define INTERFACE_ADDING_1A    11  ///< part 1 of asynchronous AddInterface, aborted
189 #define INTERFACE_RESUMING_1A  12  ///< part 1 of asynchronous ResumeInterface, aborted
190 
191 
192 // Maps an interface ID to its offset within the class that exposes it
193 
194 struct iid_vtable {
195     unsigned char mMPH;         // primary MPH for this interface, does not include any aliases
196     unsigned char mInterface;   // relationship of interface to this class
197     /*size_t*/ unsigned short mOffset;
198 };
199 
200 // Per-class const data shared by all instances of the same class
201 
202 typedef struct {
203     const struct iid_vtable *mInterfaces;   // maps interface index to info about that interface
204     SLuint32 mInterfaceCount;  // number of possible interfaces
205     const signed char *mMPH_to_index;
206     const char * const mName;
207     size_t mSize;
208     SLuint32 mObjectID;
209     // hooks
210     AsyncHook mRealize;
211     AsyncHook mResume;
212     VoidHook mDestroy;
213     BoolHook mPreDestroy;
214 } ClassTable;
215 
216 // BufferHeader describes each element of a BufferQueue, other than the data
217 
218 typedef struct {
219     const void *mBuffer;
220     SLuint32 mSize;
221 } BufferHeader;
222 
223 #ifdef __cplusplus
224 #define this this_
225 #endif
226 
227 #ifdef USE_SNDFILE
228 
229 #define SndFile_BUFSIZE 512     // in 16-bit samples
230 #define SndFile_NUMBUFS 2
231 
232 struct SndFile {
233     // save URI also?
234     SLchar *mPathname;
235     SNDFILE *mSNDFILE;
236     SF_INFO mSfInfo;
237     pthread_mutex_t mMutex; // protects mSNDFILE only
238     SLboolean mEOF;         // sf_read returned zero sample frames
239     SLuint32 mWhich;        // which buffer to use next
240     short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
241 };
242 
243 #endif // USE_SNDFILE
244 
245 /* Our own merged version of SLDataSource and SLDataSink */
246 
247 typedef union {
248     SLuint32 mLocatorType;
249     SLDataLocator_Address mAddress;
250     SLDataLocator_BufferQueue mBufferQueue;
251     SLDataLocator_IODevice mIODevice;
252     SLDataLocator_MIDIBufferQueue mMIDIBufferQueue;
253     SLDataLocator_OutputMix mOutputMix;
254     SLDataLocator_URI mURI;
255 #ifdef ANDROID
256     SLDataLocator_AndroidFD mFD;
257 #endif
258 } DataLocator;
259 
260 typedef union {
261     SLuint32 mFormatType;
262     SLDataFormat_PCM mPCM;
263     SLDataFormat_MIME mMIME;
264 } DataFormat;
265 
266 typedef struct {
267     union {
268         SLDataSource mSource;
269         SLDataSink mSink;
270         struct {
271             DataLocator *pLocator;
272             DataFormat *pFormat;
273         } mNeutral;
274     } u;
275     DataLocator mLocator;
276     DataFormat mFormat;
277 } DataLocatorFormat;
278 
279 /* Interface structures */
280 
281 typedef struct Object_interface {
282     const struct SLObjectItf_ *mItf;    // const
283     // field mThis would be redundant within an IObject, so we substitute mEngine
284     struct Engine_interface *mEngine;   // const
285     const ClassTable *mClass;       // const
286     SLuint32 mInstanceID;           // const for debugger and for RPC, 0 means unpublished
287     slObjectCallback mCallback;
288     void *mContext;
289     unsigned mGottenMask;           ///< bit-mask of interfaces exposed or added, then gotten
290     unsigned mLossOfControlMask;    // interfaces with loss of control enabled
291     unsigned mAttributesMask;       // attributes which have changed since last sync
292 #if USE_PROFILES & USE_PROFILES_BASE
293     SLint32 mPriority;
294 #endif
295     pthread_mutex_t mMutex;
296 #ifdef USE_DEBUG
297     pthread_t mOwner;
298     const char *mFile;
299     int mLine;
300 #endif
301     pthread_cond_t mCond;
302     SLuint8 mState;                 // really SLuint32, but SLuint8 to save space
303 #if USE_PROFILES & USE_PROFILES_BASE
304     SLuint8 mPreemptable;           // really SLboolean, but SLuint8 to save space
305 #else
306     SLuint8 mPadding;
307 #endif
308     SLuint8 mStrongRefCount;        // number of strong references to this object
309     // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state)
310     // for best alignment, do not add any fields here
311 #define INTERFACES_Default 1
312     SLuint8 mInterfaceStates[INTERFACES_Default];    // state of each of interface
313     // do not add any fields here
314 } IObject;
315 
316 #include "locks.h"
317 
318 typedef struct {
319     const struct SL3DCommitItf_ *mItf;
320     IObject *mThis;
321     SLboolean mDeferred;
322     SLuint32 mGeneration;   // incremented each master clock cycle
323     SLuint32 mWaiting;      // number of threads waiting in Commit
324 } I3DCommit;
325 
326 enum CartesianSphericalActive {
327     CARTESIAN_COMPUTED_SPHERICAL_SET,
328     CARTESIAN_REQUESTED_SPHERICAL_SET,
329     CARTESIAN_UNKNOWN_SPHERICAL_SET,
330     CARTESIAN_SET_SPHERICAL_COMPUTED,   // not in 1.0.1
331     CARTESIAN_SET_SPHERICAL_REQUESTED,  // not in 1.0.1
332     CARTESIAN_SET_SPHERICAL_UNKNOWN
333 };
334 
335 typedef struct {
336     const struct SL3DDopplerItf_ *mItf;
337     IObject *mThis;
338     // The API allows client to specify either Cartesian and spherical velocities.
339     // But an implementation will likely prefer one or the other. So for
340     // maximum portablity, we maintain both units and an indication of which
341     // unit was set most recently. In addition, we keep a flag saying whether
342     // the other unit has been derived yet. It can take significant time
343     // to compute the other unit, so this may be deferred to another thread.
344     // For this reason we also keep an indication of whether the secondary
345     // has been computed yet, and its accuracy.
346     // Though only one unit is primary at a time, a union is inappropriate:
347     // the application might read in both units (not in 1.0.1),
348     // and due to multi-threading concerns.
349     SLVec3D mVelocityCartesian;
350     struct {
351         SLmillidegree mAzimuth;
352         SLmillidegree mElevation;
353         SLmillidegree mSpeed;
354     } mVelocitySpherical;
355     enum CartesianSphericalActive mVelocityActive;
356     SLpermille mDopplerFactor;
357 } I3DDoppler;
358 
359 typedef struct {
360     const struct SL3DGroupingItf_ *mItf;
361     IObject *mThis;
362     C3DGroup *mGroup;   // strong reference to associated group or NULL
363 } I3DGrouping;
364 
365 enum AnglesVectorsActive {
366     ANGLES_COMPUTED_VECTORS_SET,    // not in 1.0.1
367     ANGLES_REQUESTED_VECTORS_SET,   // not in 1.0.1
368     ANGLES_UNKNOWN_VECTORS_SET,
369     ANGLES_SET_VECTORS_COMPUTED,
370     ANGLES_SET_VECTORS_REQUESTED,
371     ANGLES_SET_VECTORS_UNKNOWN
372 };
373 
374 typedef struct {
375     const struct SL3DLocationItf_ *mItf;
376     IObject *mThis;
377     SLVec3D mLocationCartesian;
378     struct {
379         SLmillidegree mAzimuth;
380         SLmillidegree mElevation;
381         SLmillimeter mDistance;
382     } mLocationSpherical;
383     enum CartesianSphericalActive mLocationActive;
384     struct {
385         SLmillidegree mHeading;
386         SLmillidegree mPitch;
387         SLmillidegree mRoll;
388     } mOrientationAngles;
389     struct {
390         SLVec3D mFront;
391         SLVec3D mAbove;
392         SLVec3D mUp;
393     } mOrientationVectors;
394     enum AnglesVectorsActive mOrientationActive;
395     // Rotations can be slow, so are deferred.
396     SLmillidegree mTheta;
397     SLVec3D mAxis;
398     SLboolean mRotatePending;
399 } I3DLocation;
400 
401 typedef struct {
402     const struct SL3DMacroscopicItf_ *mItf;
403     IObject *mThis;
404     struct {
405         SLmillimeter mWidth;
406         SLmillimeter mHeight;
407         SLmillimeter mDepth;
408     } mSize;
409     struct {
410         SLmillimeter mHeading;
411         SLmillimeter mPitch;
412         SLmillimeter mRoll;
413     } mOrientationAngles;
414     struct {
415         SLVec3D mFront;
416         SLVec3D mAbove;
417         SLVec3D mUp;
418     } mOrientationVectors;
419     enum AnglesVectorsActive mOrientationActive;
420     // Rotations can be slow, so are deferred.
421     SLmillidegree mTheta;
422     SLVec3D mAxis;
423     SLboolean mRotatePending;
424 } I3DMacroscopic;
425 
426 typedef struct {
427     const struct SL3DSourceItf_ *mItf;
428     IObject *mThis;
429     SLboolean mHeadRelative;
430     SLboolean mRolloffMaxDistanceMute;
431     SLmillimeter mMaxDistance;
432     SLmillimeter mMinDistance;
433     SLmillidegree mConeInnerAngle;
434     SLmillidegree mConeOuterAngle;
435     SLmillibel mConeOuterLevel;
436     SLpermille mRolloffFactor;
437     SLpermille mRoomRolloffFactor;
438     SLuint8 mDistanceModel;
439 } I3DSource;
440 
441 typedef struct {
442     const struct SLAudioDecoderCapabilitiesItf_ *mItf;
443     IObject *mThis;
444 } IAudioDecoderCapabilities;
445 
446 typedef struct {
447     const struct SLAudioEncoderItf_ *mItf;
448     IObject *mThis;
449     SLAudioEncoderSettings mSettings;
450 } IAudioEncoder;
451 
452 typedef struct {
453     const struct SLAudioEncoderCapabilitiesItf_ *mItf;
454     IObject *mThis;
455 } IAudioEncoderCapabilities;
456 
457 typedef struct {
458     const struct SLAudioIODeviceCapabilitiesItf_ *mItf;
459     IObject *mThis;
460     slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback;
461     void *mAvailableAudioInputsChangedContext;
462     slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback;
463     void *mAvailableAudioOutputsChangedContext;
464     slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback;
465     void *mDefaultDeviceIDMapChangedContext;
466 } IAudioIODeviceCapabilities;
467 
468 typedef struct {
469     const struct SLBassBoostItf_ *mItf;
470     IObject *mThis;
471     SLboolean mEnabled;
472     SLpermille mStrength;
473 #if defined(ANDROID) && !defined(USE_BACKPORT)
474     effect_descriptor_t mBassBoostDescriptor;
475     android::sp<android::AudioEffect> mBassBoostEffect;
476 #endif
477 } IBassBoost;
478 
479 typedef struct BufferQueue_interface {
480     const struct SLBufferQueueItf_ *mItf;
481     IObject *mThis;
482     SLBufferQueueState mState;
483     slBufferQueueCallback mCallback;
484     void *mContext;
485     // originally SLuint32, but range-checked down to SLuint16
486     SLuint16 mNumBuffers;
487     /*SLboolean*/ SLuint16 mClearRequested;
488     BufferHeader *mArray;
489     BufferHeader *mFront, *mRear;
490 #ifdef ANDROID
491     SLuint32 mSizeConsumed;
492 #endif
493     // saves a malloc in the typical case
494 #define BUFFER_HEADER_TYPICAL 4
495     BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1];
496 } IBufferQueue;
497 
498 #define MAX_DEVICE 2    // hard-coded array size for default in/out
499 
500 typedef struct {
501     const struct SLDeviceVolumeItf_ *mItf;
502     IObject *mThis;
503     SLint32 mVolume[MAX_DEVICE];
504 } IDeviceVolume;
505 
506 typedef struct {
507     const struct SLDynamicInterfaceManagementItf_ *mItf;
508     IObject *mThis;
509     slDynamicInterfaceManagementCallback mCallback;
510     void *mContext;
511 } IDynamicInterfaceManagement;
512 
513 typedef struct {
514     const struct SLDynamicSourceItf_ *mItf;
515     IObject *mThis;
516     SLDataSource *mDataSource;
517 } IDynamicSource;
518 
519 // private
520 
521 struct EnableLevel {
522     SLboolean mEnable;
523     SLmillibel mSendLevel;
524 };
525 
526 // indexes into IEffectSend.mEnableLevels
527 
528 #define AUX_ENVIRONMENTALREVERB 0
529 #define AUX_PRESETREVERB        1
530 #define AUX_MAX                 2
531 
532 typedef struct {
533     const struct SLEffectSendItf_ *mItf;
534     IObject *mThis;
535     struct EnableLevel mEnableLevels[AUX_MAX];  // wet enable and volume per effect type
536 } IEffectSend;
537 
538 typedef struct Engine_interface {
539     const struct SLEngineItf_ *mItf;
540     IObject *mThis;
541     SLboolean mLossOfControlGlobal;
542 #ifdef USE_SDL
543     COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt
544 #endif
545     // Each engine is its own universe.
546     SLuint32 mInstanceCount;
547     unsigned mInstanceMask; // 1 bit per active object
548     unsigned mChangedMask;  // objects which have changed since last sync
549 #define MAX_INSTANCE 32     // maximum active objects per engine, see mInstanceMask
550     IObject *mInstances[MAX_INSTANCE];
551     SLboolean mShutdown;
552     SLboolean mShutdownAck;
553     ThreadPool mThreadPool; // for asynchronous operations
554 #if defined(ANDROID) && !defined(USE_BACKPORT)
555     // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored
556     SLuint32 mEqNumPresets;
557     char** mEqPresetNames;
558 #endif
559 } IEngine;
560 
561 typedef struct {
562     const struct SLEngineCapabilitiesItf_ *mItf;
563     IObject *mThis;
564     SLboolean mThreadSafe;
565     // const
566     SLuint32 mMaxIndexLED;
567     SLuint32 mMaxIndexVibra;
568 } IEngineCapabilities;
569 
570 typedef struct {
571     const struct SLEnvironmentalReverbItf_ *mItf;
572     IObject *mThis;
573     SLEnvironmentalReverbSettings mProperties;
574 #if defined(ANDROID) && !defined(USE_BACKPORT)
575     effect_descriptor_t mEnvironmentalReverbDescriptor;
576     android::sp<android::AudioEffect> mEnvironmentalReverbEffect;
577 #endif
578 } IEnvironmentalReverb;
579 
580 struct EqualizerBand {
581     SLmilliHertz mMin;
582     SLmilliHertz mCenter;
583     SLmilliHertz mMax;
584 };
585 
586 #if defined(ANDROID) && !defined(USE_BACKPORT)
587 #define MAX_EQ_BANDS 0
588 #else
589 #define MAX_EQ_BANDS 4  // compile-time limit, runtime limit may be smaller
590 #endif
591 
592 typedef struct {
593     const struct SLEqualizerItf_ *mItf;
594     IObject *mThis;
595     SLboolean mEnabled;
596     SLuint16 mPreset;
597 #if 0 < MAX_EQ_BANDS
598     SLmillibel mLevels[MAX_EQ_BANDS];
599 #endif
600     // const to end of struct
601     SLuint16 mNumPresets;
602     SLuint16 mNumBands;
603 #if !defined(ANDROID) || defined(USE_BACKPORT)
604     const struct EqualizerBand *mBands;
605     const struct EqualizerPreset *mPresets;
606 #endif
607     SLmillibel mBandLevelRangeMin;
608     SLmillibel mBandLevelRangeMax;
609 #if defined(ANDROID) && !defined(USE_BACKPORT)
610     effect_descriptor_t mEqDescriptor;
611     android::sp<android::AudioEffect> mEqEffect;
612 #endif
613 } IEqualizer;
614 
615 #define MAX_LED_COUNT 32
616 
617 typedef struct {
618     const struct SLLEDArrayItf_ *mItf;
619     IObject *mThis;
620     SLuint32 mLightMask;
621     SLHSL mColors[MAX_LED_COUNT];
622     // const
623     SLuint8 mCount;
624 } ILEDArray;
625 
626 typedef struct {
627     const struct SLMetadataExtractionItf_ *mItf;
628     IObject *mThis;
629     SLuint32 mKeySize;
630     const void *mKey;
631     SLuint32 mKeyEncoding;
632     const SLchar *mValueLangCountry;
633     SLuint32 mValueEncoding;
634     SLuint8 mFilterMask;
635     int mKeyFilter;
636 } IMetadataExtraction;
637 
638 typedef struct {
639     const struct SLMetadataTraversalItf_ *mItf;
640     IObject *mThis;
641     SLuint32 mIndex;
642     SLuint32 mMode;
643     SLuint32 mCount;
644     SLuint32 mSize;
645 } IMetadataTraversal;
646 
647 typedef struct {
648     const struct SLMIDIMessageItf_ *mItf;
649     IObject *mThis;
650     slMetaEventCallback mMetaEventCallback;
651     void *mMetaEventContext;
652     slMIDIMessageCallback mMessageCallback;
653     void *mMessageContext;
654     SLuint8 mMessageTypes;
655 } IMIDIMessage;
656 
657 typedef struct {
658     const struct SLMIDIMuteSoloItf_ *mItf;
659     IObject *mThis;
660     SLuint16 mChannelMuteMask;
661     SLuint16 mChannelSoloMask;
662     SLuint32 mTrackMuteMask;
663     SLuint32 mTrackSoloMask;
664     // const
665     SLuint16 mTrackCount;
666 } IMIDIMuteSolo;
667 
668 typedef struct {
669     const struct SLMIDITempoItf_ *mItf;
670     IObject *mThis;
671     SLuint32 mTicksPerQuarterNote;
672     SLuint32 mMicrosecondsPerQuarterNote;
673 } IMIDITempo;
674 
675 typedef struct {
676     const struct SLMIDITimeItf_ *mItf;
677     IObject *mThis;
678     SLuint32 mDuration;
679     SLuint32 mPosition;
680     SLuint32 mStartTick;
681     SLuint32 mNumTicks;
682 } IMIDITime;
683 
684 typedef struct {
685     const struct SLMuteSoloItf_ *mItf;
686     IObject *mThis;
687     // fields that were formerly here are now at CAudioPlayer
688 } IMuteSolo;
689 
690 #define MAX_TRACK 32        // see mActiveMask
691 
692 typedef struct {
693     const struct SLOutputMixItf_ *mItf;
694     IObject *mThis;
695     slMixDeviceChangeCallback mCallback;
696     void *mContext;
697 } IOutputMix;
698 
699 #ifdef USE_OUTPUTMIXEXT
700 typedef struct {
701     const struct SLOutputMixExtItf_ *mItf;
702     IObject *mThis;
703     unsigned mActiveMask;   // 1 bit per active track
704     Track mTracks[MAX_TRACK];
705     SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
706 } IOutputMixExt;
707 #endif
708 
709 typedef struct {
710     const struct SLPitchItf_ *mItf;
711     IObject *mThis;
712     SLpermille mPitch;
713     // const
714     SLpermille mMinPitch;
715     SLpermille mMaxPitch;
716 } IPitch;
717 
718 typedef struct Play_interface {
719     const struct SLPlayItf_ *mItf;
720     IObject *mThis;
721     SLuint32 mState;
722     // next 2 fields are read-only to application
723     SLmillisecond mDuration;
724     SLmillisecond mPosition;
725     slPlayCallback mCallback;
726     void *mContext;
727     SLuint32 mEventFlags;
728     // the ISeek trick of using a distinct value doesn't work here because it's readable by app
729     SLmillisecond mMarkerPosition;
730     SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0)
731 #ifdef USE_OUTPUTMIXEXT
732     SLuint32 mFrameUpdatePeriod;         // mPositionUpdatePeriod in frame units
733     SLmillisecond mLastSeekPosition;     // Last known accurate position, set at Seek
734     SLuint32 mFramesSinceLastSeek;       // Frames mixed since last known accurate position
735     SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback
736 #endif
737 } IPlay;
738 
739 typedef struct {
740     const struct SLPlaybackRateItf_ *mItf;
741     IObject *mThis;
742     SLpermille mRate;
743     SLuint32 mProperties;
744     // const
745     SLpermille mMinRate;
746     SLpermille mMaxRate;
747     SLpermille mStepSize;
748     SLuint32 mCapabilities;
749 } IPlaybackRate;
750 
751 typedef struct {
752     const struct SLPrefetchStatusItf_ *mItf;
753     IObject *mThis;
754     SLuint32 mStatus;
755     SLpermille mLevel;
756     slPrefetchCallback mCallback;
757     void *mContext;
758     SLuint32 mCallbackEventsMask;
759     SLpermille mFillUpdatePeriod;
760 } IPrefetchStatus;
761 
762 typedef struct {
763     const struct SLPresetReverbItf_ *mItf;
764     IObject *mThis;
765     SLuint16 mPreset;
766 #if defined(ANDROID) && !defined(USE_BACKPORT)
767     effect_descriptor_t mPresetReverbDescriptor;
768     android::sp<android::AudioEffect> mPresetReverbEffect;
769 #endif
770 } IPresetReverb;
771 
772 typedef struct {
773     const struct SLRatePitchItf_ *mItf;
774     IObject *mThis;
775     SLpermille mRate;
776     // const
777     SLpermille mMinRate;
778     SLpermille mMaxRate;
779 } IRatePitch;
780 
781 typedef struct {
782     const struct SLRecordItf_ *mItf;
783     IObject *mThis;
784     SLuint32 mState;
785     SLmillisecond mDurationLimit;
786     SLmillisecond mPosition;
787     slRecordCallback mCallback;
788     void *mContext;
789     SLuint32 mCallbackEventsMask;
790     SLmillisecond mMarkerPosition;
791     SLmillisecond mPositionUpdatePeriod;
792 } IRecord;
793 
794 typedef struct {
795     const struct SLSeekItf_ *mItf;
796     IObject *mThis;
797     SLmillisecond mPos;     // mPos != SL_TIME_UNKNOWN means pending seek request
798     SLboolean mLoopEnabled;
799     SLmillisecond mStartPos;
800     SLmillisecond mEndPos;
801 } ISeek;
802 
803 typedef struct {
804     const struct SLThreadSyncItf_ *mItf;
805     IObject *mThis;
806     SLboolean mInCriticalSection;
807     SLuint32 mWaiting;  // number of threads waiting
808     pthread_t mOwner;
809 } IThreadSync;
810 
811 typedef struct {
812     const struct SLVibraItf_ *mItf;
813     IObject *mThis;
814     SLboolean mVibrate;
815     SLmilliHertz mFrequency;
816     SLpermille mIntensity;
817 } IVibra;
818 
819 typedef struct {
820     const struct SLVirtualizerItf_ *mItf;
821     IObject *mThis;
822     SLboolean mEnabled;
823     SLpermille mStrength;
824 #if defined(ANDROID) && !defined(USE_BACKPORT)
825     effect_descriptor_t mVirtualizerDescriptor;
826     android::sp<android::AudioEffect> mVirtualizerEffect;
827 #endif
828 } IVirtualizer;
829 
830 typedef struct {
831     const struct SLVisualizationItf_ *mItf;
832     IObject *mThis;
833     slVisualizationCallback mCallback;
834     void *mContext;
835     SLmilliHertz mRate;
836 } IVisualization;
837 
838 typedef struct /*Volume_interface*/ {
839     const struct SLVolumeItf_ *mItf;
840     IObject *mThis;
841     // Values as specified by the application
842     SLmillibel mLevel;
843     SLpermille mStereoPosition;
844     SLuint8 /*SLboolean*/ mMute;
845     SLuint8 /*SLboolean*/ mEnableStereoPosition;
846 } IVolume;
847 
848 /* Class structures */
849 
850 /*typedef*/ struct C3DGroup_struct {
851     IObject mObject;
852 #define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces
853     SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default];
854     IDynamicInterfaceManagement mDynamicInterfaceManagement;
855     I3DLocation m3DLocation;
856     I3DDoppler m3DDoppler;
857     I3DSource m3DSource;
858     I3DMacroscopic m3DMacroscopic;
859     // remaining are per-instance private fields not associated with an interface
860     unsigned mMemberMask;   // set of member objects
861 } /*C3DGroup*/;
862 
863 #ifdef ANDROID
864 
865 // FIXME Move these into the I... section above
866 
867 typedef struct {
868     const struct SLAndroidEffectItf_ *mItf;
869     IObject *mThis;
870     android::KeyedVector<SLuint32, android::AudioEffect* > *mEffects;
871 } IAndroidEffect;
872 
873 typedef struct {
874     const struct SLAndroidEffectCapabilitiesItf_ *mItf;
875     IObject *mThis;
876     SLuint32 mNumFx;
877     effect_descriptor_t* mFxDescriptors;
878 } IAndroidEffectCapabilities;
879 
880 typedef struct {
881     const struct SLAndroidEffectSendItf_ *mItf;
882     IObject *mThis;
883     // only one send per interface for now (1 bus)
884     SLboolean mEnabled;
885     SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels;
886 } IAndroidEffectSend;
887 
888 typedef struct {
889     const struct SLAndroidConfigurationItf_ *mItf;
890     IObject *mThis;
891 } IAndroidConfiguration;
892 
893 #if defined(ANDROID) && !defined(USE_BACKPORT)
894 // FIXME this include is done here so the effect structures have been defined. Messy.
895 #include "android_Effect.h"
896 #endif
897 
898 
899 /*
900  * Used to define the mapping from an OpenSL ES audio player to an Android
901  * media framework object
902  */
903 enum AndroidObject_type {
904     INVALID_TYPE     =-1,
905     MEDIAPLAYER      = 0,
906     AUDIOTRACK_PULL  = 1,
907     NUM_AUDIOPLAYER_MAP_TYPES
908 };
909 
910 enum AndroidObject_state {
911     ANDROID_UNINITIALIZED = -1,
912     ANDROID_PREPARING,
913     ANDROID_READY,
914     NUM_ANDROID_STATES
915 };
916 
917 #endif  // ANDROID
918 
919 
920 /*typedef*/ struct CAudioPlayer_struct {
921     IObject mObject;
922 #ifdef ANDROID
923 #define INTERFACES_AudioPlayer 29 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
924 #else
925 #define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces
926 #endif
927     SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default];
928     IDynamicInterfaceManagement mDynamicInterfaceManagement;
929     IPlay mPlay;
930     I3DDoppler m3DDoppler;
931     I3DGrouping m3DGrouping;
932     I3DLocation m3DLocation;
933     I3DSource m3DSource;
934     IBufferQueue mBufferQueue;
935     IEffectSend mEffectSend;
936     IMetadataExtraction mMetadataExtraction;
937     IMetadataTraversal mMetadataTraversal;
938     IPrefetchStatus mPrefetchStatus;
939     IRatePitch mRatePitch;
940     ISeek mSeek;
941     IVolume mVolume;
942     IMuteSolo mMuteSolo;
943 #ifdef ANDROID
944     IAndroidEffect mAndroidEffect;
945     IAndroidEffectSend mAndroidEffectSend;
946     IAndroidConfiguration mAndroidConfiguration;
947 #endif
948     // optional interfaces
949     I3DMacroscopic m3DMacroscopic;
950     IBassBoost mBassBoost;
951     IDynamicSource mDynamicSource;
952     IEnvironmentalReverb mEnvironmentalReverb;
953     IEqualizer mEqualizer;
954     IPitch mPitch;
955     IPresetReverb mPresetReverb;
956     IPlaybackRate mPlaybackRate;
957     IVirtualizer mVirtualizer;
958     IVisualization mVisualization;
959     // remaining are per-instance private fields not associated with an interface
960     DataLocatorFormat mDataSource;
961     DataLocatorFormat mDataSink;
962     // cached data for this instance
963     SLuint8 /*SLboolean*/ mMute;
964     // Formerly at IMuteSolo
965     SLuint8 mMuteMask;      // Mask for which channels are muted: bit 0=left, 1=right
966     SLuint8 mSoloMask;      // Mask for which channels are soloed: bit 0=left, 1=right
967     SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
968     SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
969     // Formerly at IEffectSend
970     /**
971      * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf
972      */
973     SLmillibel mDirectLevel;
974     // implementation-specific data for this instance
975 #ifdef USE_OUTPUTMIXEXT
976     Track *mTrack;
977     float mGains[STEREO_CHANNELS];  ///< Computed gain based on volume, mute, solo, stereo position
978     SLboolean mDestroyRequested;    ///< Mixer to acknowledge application's call to Object::Destroy
979 #endif
980 #ifdef USE_SNDFILE
981     struct SndFile mSndFile;
982 #endif // USE_SNDFILE
983 #ifdef ANDROID
984     android::Mutex          *mpLock;
985     enum AndroidObject_type mAndroidObjType;
986     enum AndroidObject_state mAndroidObjState;
987     /** identifies which group of effects ("session") this player belongs to */
988     int mSessionId;
989     /** identifies the Android stream type playback will occur on */
990     int mStreamType;
991     /** plays the PCM data for this player */
992     android::AudioTrack *mAudioTrack;
993 #ifndef USE_BACKPORT
994     android::sp<android::SfPlayer> mSfPlayer;
995     /** aux effect the AudioTrack will be attached to if aux send enabled */
996     android::sp<android::AudioEffect> mAuxEffect;
997     /** send level to aux effect, there's a single aux bus, so there's a single level */
998     SLmillibel mAuxSendLevel;
999 #endif
1000     /**
1001      * Amplification (can be attenuation) factor derived for the VolumeLevel
1002      */
1003     float mAmplFromVolLevel;
1004     /**
1005      * Left/right amplification (can be attenuations) factors derived for the StereoPosition
1006      */
1007     float mAmplFromStereoPos[STEREO_CHANNELS];
1008     /**
1009      * Attenuation factor derived from direct level
1010      */
1011     float mAmplFromDirectLevel;
1012 #endif
1013 } /*CAudioPlayer*/;
1014 
1015 
1016 /*typedef*/ struct CAudioRecorder_struct {
1017     // mandated interfaces
1018     IObject mObject;
1019 #ifdef ANDROID
1020 #define INTERFACES_AudioRecorder 11 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
1021 #else
1022 #define INTERFACES_AudioRecorder 9  // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces
1023 #endif
1024     SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default];
1025     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1026     IRecord mRecord;
1027     IAudioEncoder mAudioEncoder;
1028     // optional interfaces
1029     IBassBoost mBassBoost;
1030     IDynamicSource mDynamicSource;
1031     IEqualizer mEqualizer;
1032     IVisualization mVisualization;
1033     IVolume mVolume;
1034 #ifdef ANDROID
1035     IBufferQueue mBufferQueue;
1036     IAndroidConfiguration mAndroidConfiguration;
1037 #endif
1038     // remaining are per-instance private fields not associated with an interface
1039     DataLocatorFormat mDataSource;
1040     DataLocatorFormat mDataSink;
1041     // cached data for this instance
1042     SLuint8 mNumChannels;   // 0 means unknown, then const once it is known, range 1 <= x <= 8
1043     SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known
1044     // implementation-specific data for this instance
1045 #ifdef ANDROID
1046     android::AudioRecord *mAudioRecord;
1047     int mRecordSource;
1048 #endif
1049 } /*CAudioRecorder*/;
1050 
1051 
1052 typedef struct {
1053     // mandated implicit interfaces
1054     IObject mObject;
1055 #ifdef ANDROID
1056 #define INTERFACES_Engine 11 // see MPH_to_Engine in MPH_to.c for list of interfaces
1057 #else
1058 #define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces
1059 #endif
1060     SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default];
1061     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1062     IEngine mEngine;
1063     IEngineCapabilities mEngineCapabilities;
1064     IThreadSync mThreadSync;
1065     // mandated explicit interfaces
1066     IAudioIODeviceCapabilities mAudioIODeviceCapabilities;
1067     IAudioDecoderCapabilities mAudioDecoderCapabilities;
1068     IAudioEncoderCapabilities mAudioEncoderCapabilities;
1069     I3DCommit m3DCommit;
1070 #ifdef ANDROID
1071     IAndroidEffectCapabilities mAndroidEffectCapabilities;
1072 #endif
1073     // optional interfaces
1074     IDeviceVolume mDeviceVolume;
1075     // remaining are per-instance private fields not associated with an interface
1076     pthread_t mSyncThread;
1077 } CEngine;
1078 
1079 typedef struct {
1080     // mandated interfaces
1081     IObject mObject;
1082 #define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces
1083     SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default];
1084     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1085     ILEDArray mLEDArray;
1086     // remaining are per-instance private fields not associated with an interface
1087     SLuint32 mDeviceID;
1088 } CLEDDevice;
1089 
1090 typedef struct {
1091     // mandated interfaces
1092     IObject mObject;
1093 #define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces
1094     SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default];
1095     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1096     I3DDoppler m3DDoppler;
1097     I3DLocation m3DLocation;
1098     // remaining are per-instance private fields not associated with an interface
1099 } CListener;
1100 
1101 typedef struct {
1102     // mandated interfaces
1103     IObject mObject;
1104 #define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of
1105                                        // interfaces
1106     SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default];
1107     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1108     IDynamicSource mDynamicSource;
1109     IMetadataExtraction mMetadataExtraction;
1110     IMetadataTraversal mMetadataTraversal;
1111     // remaining are per-instance private fields not associated with an interface
1112 } CMetadataExtractor;
1113 
1114 typedef struct {
1115     // mandated interfaces
1116     IObject mObject;
1117 
1118 #define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces
1119     SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default];
1120     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1121     IPlay mPlay;
1122     I3DDoppler m3DDoppler;
1123     I3DGrouping m3DGrouping;
1124     I3DLocation m3DLocation;
1125     I3DSource m3DSource;
1126     IBufferQueue mBufferQueue;
1127     IEffectSend mEffectSend;
1128     IMetadataExtraction mMetadataExtraction;
1129     IMetadataTraversal mMetadataTraversal;
1130     IMIDIMessage mMIDIMessage;
1131     IMIDITime mMIDITime;
1132     IMIDITempo mMIDITempo;
1133     IMIDIMuteSolo mMIDIMuteSolo;
1134     IPrefetchStatus mPrefetchStatus;
1135     ISeek mSeek;
1136     IVolume mVolume;
1137     IMuteSolo mMuteSolo;
1138     // optional interfaces
1139     I3DMacroscopic m3DMacroscopic;
1140     IBassBoost mBassBoost;
1141     IDynamicSource mDynamicSource;
1142     IEnvironmentalReverb mEnvironmentalReverb;
1143     IEqualizer mEqualizer;
1144     IPitch mPitch;
1145     IPresetReverb mPresetReverb;
1146     IPlaybackRate mPlaybackRate;
1147     IVirtualizer mVirtualizer;
1148     IVisualization mVisualization;
1149     // remaining are per-instance private fields not associated with an interface
1150 } CMidiPlayer;
1151 
1152 /*typedef*/ struct COutputMix_struct {
1153     // mandated interfaces
1154     IObject mObject;
1155 #ifdef ANDROID
1156 #define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
1157 #else
1158 #define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces
1159 #endif
1160     SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default];
1161     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1162     IOutputMix mOutputMix;
1163 #ifdef USE_OUTPUTMIXEXT
1164     IOutputMixExt mOutputMixExt;
1165 #endif
1166     IEnvironmentalReverb mEnvironmentalReverb;
1167     IEqualizer mEqualizer;
1168     IPresetReverb mPresetReverb;
1169     IVirtualizer mVirtualizer;
1170     IVolume mVolume;
1171     // optional interfaces
1172     IBassBoost mBassBoost;
1173     IVisualization mVisualization;
1174 #ifdef ANDROID
1175     IAndroidEffect mAndroidEffect;
1176 #endif
1177     // remaining are per-instance private fields not associated with an interface
1178 } /*COutputMix*/;
1179 
1180 typedef struct {
1181     // mandated interfaces
1182     IObject mObject;
1183 #define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces
1184     SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default];
1185     IDynamicInterfaceManagement mDynamicInterfaceManagement;
1186     IVibra mVibra;
1187     // remaining are per-instance private fields not associated with an interface
1188     SLuint32 mDeviceID;
1189 } CVibraDevice;
1190 
1191 struct MPH_init {
1192     VoidHook mInit;     // called first to initialize the interface, right after object is allocated
1193     // Each interface is initialized regardless whether it is exposed to application.
1194     VoidHook mResume;   // called to resume interface after suspension, not currently used
1195     VoidHook mDeinit;   // called last when object is about to be destroyed
1196     BoolHook mExpose;   // called after initialization, only if interface is exposed to application
1197     VoidHook mRemove;   // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit
1198     // will need a suspend hook when suspend is implemented
1199 };
1200 
1201 extern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
1202 extern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
1203 extern SLresult checkInterfaces(const ClassTable *class__,
1204     SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
1205     const SLboolean *pInterfaceRequired, unsigned *pExposedMask);
1206 extern IObject *construct(const ClassTable *class__,
1207     unsigned exposedMask, SLEngineItf engine);
1208 extern const ClassTable *objectIDtoClass(SLuint32 objectID);
1209 extern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
1210 extern SLuint32 IObjectToObjectID(IObject *object);
1211 extern void IObject_Publish(IObject *this);
1212 extern void IObject_Destroy(SLObjectItf self);
1213 
1214 // Map an interface to it's "object ID" (which is really a class ID).
1215 // Note: this operation is undefined on IObject, as it lacks an mThis.
1216 // If you have an IObject, then use IObjectToObjectID directly.
1217 
1218 #define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis)
1219 
1220 // Map an interface to it's corresponding IObject.
1221 // Note: this operation is undefined on IObject, as it lacks an mThis.
1222 // If you have an IObject, then you're done -- you already have what you need.
1223 
1224 #define InterfaceToIObject(this) ((this)->mThis)
1225 
1226 #define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this)))
1227 
1228 #define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this)))
1229 
1230 #ifdef ANDROID
1231 #include "android_AudioPlayer.h"
1232 #endif
1233 
1234 extern SLresult checkDataSource(const SLDataSource *pDataSrc,
1235         DataLocatorFormat *myDataSourceLocator);
1236 extern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator,
1237         SLuint32 objType);
1238 extern SLresult checkSourceFormatVsInterfacesCompatibility(
1239         const DataLocatorFormat *pDataLocatorFormat, const ClassTable *class__,
1240         unsigned exposedMask);
1241 extern void freeDataLocatorFormat(DataLocatorFormat *dlf);
1242 
1243 extern bool C3DGroup_PreDestroy(void *self);
1244 
1245 extern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
1246 extern SLresult CAudioPlayer_Resume(void *self, SLboolean async);
1247 extern void CAudioPlayer_Destroy(void *self);
1248 extern bool CAudioPlayer_PreDestroy(void *self);
1249 
1250 extern SLresult CAudioRecorder_Realize(void *self, SLboolean async);
1251 extern SLresult CAudioRecorder_Resume(void *self, SLboolean async);
1252 extern void CAudioRecorder_Destroy(void *self);
1253 extern bool CAudioRecorder_PreDestroy(void *self);
1254 
1255 extern SLresult CEngine_Realize(void *self, SLboolean async);
1256 extern SLresult CEngine_Resume(void *self, SLboolean async);
1257 extern void CEngine_Destroy(void *self);
1258 extern bool CEngine_PreDestroy(void *self);
1259 extern void CEngine_Destroyed(CEngine *self);
1260 
1261 extern SLresult COutputMix_Realize(void *self, SLboolean async);
1262 extern SLresult COutputMix_Resume(void *self, SLboolean async);
1263 extern void COutputMix_Destroy(void *self);
1264 extern bool COutputMix_PreDestroy(void *self);
1265 
1266 #ifdef USE_SDL
1267 extern void SDL_open(IEngine *thisEngine);
1268 extern void SDL_close(void);
1269 #endif
1270 #define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
1271 #define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
1272 #define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
1273 #define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
1274 #define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
1275 #define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
1276 #define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
1277 #define SL_OBJECT_STATE_DESTROYING   ((SLuint32) 0xB) // destroy object when no strong references
1278 #ifndef ANDROID
1279 extern void *sync_start(void *arg);
1280 #endif
1281 extern SLresult err_to_result(int err);
1282 
1283 #ifdef __GNUC__
1284 #define ctz __builtin_ctz
1285 #else
1286 extern unsigned ctz(unsigned);
1287 #endif
1288 extern const char * const interface_names[MPH_MAX];
1289 #include "platform.h"
1290 
1291 // Attributes
1292 
1293 #define ATTR_NONE       ((unsigned) 0x0)      // none
1294 #define ATTR_GAIN       ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo,
1295                                               // player stereo position, player mute
1296 #define ATTR_TRANSPORT  ((unsigned) 0x1 << 1) // play state, looping
1297 #define ATTR_POSITION   ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position)
1298 #define ATTR_ENQUEUE    ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state
1299 
1300 #define SL_DATALOCATOR_NULL 0    // application specified a NULL value for pLocator
1301 #define SL_DATAFORMAT_NULL 0     // application specified a NULL or undefined value for pFormat
1302 
1303 // Trace debugging
1304 
1305 // Always defined, but may be a no-op if trace support is disabled at compile-time
1306 extern void slTraceSetEnabled(unsigned enabled);
1307 
1308 #define SL_TRACE_ENTER          0x1
1309 #define SL_TRACE_LEAVE_FAILURE  0x2
1310 #define SL_TRACE_LEAVE_VOID     0x4
1311 #define SL_TRACE_LEAVE_SUCCESS  0x8
1312 #define SL_TRACE_LEAVE          (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \
1313                                     SL_TRACE_LEAVE_SUCCESS)
1314 #define SL_TRACE_ALL            (SL_TRACE_ENTER | SL_TRACE_LEAVE)
1315 #ifndef SL_TRACE_DEFAULT
1316 #define SL_TRACE_DEFAULT        (SL_TRACE_LEAVE_FAILURE)
1317 #endif
1318 
1319 #ifndef USE_TRACE
1320 
1321 #define SL_ENTER_GLOBAL SLresult result;
1322 #define SL_LEAVE_GLOBAL return result;
1323 #define SL_ENTER_INTERFACE SLresult result;
1324 #define SL_LEAVE_INTERFACE return result;
1325 #define SL_ENTER_INTERFACE_VOID
1326 #define SL_LEAVE_INTERFACE_VOID return;
1327 
1328 #else
1329 
1330 extern void slTraceEnterGlobal(const char *function);
1331 extern void slTraceLeaveGlobal(const char *function, SLresult result);
1332 extern void slTraceEnterInterface(const char *function);
1333 extern void slTraceLeaveInterface(const char *function, SLresult result);
1334 extern void slTraceEnterInterfaceVoid(const char *function);
1335 extern void slTraceLeaveInterfaceVoid(const char *function);
1336 #define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__);
1337 #define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result;
1338 #define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__);
1339 #define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result;
1340 #define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__);
1341 #define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return;
1342 
1343 #endif
1344 
1345 #ifdef USE_OUTPUTMIXEXT
1346 
1347 #define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING
1348 // If we needed it, could have PLAYING mean mixer is currently reading from front buffer,
1349 // while PLAYABLE would mean application requested PLAYING, but buffer queue is empty
1350 
1351 #endif
1352 
1353 #ifdef USE_SNDFILE
1354 extern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer);
1355 #endif
1356 
1357 extern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size);
1358 extern SLresult IBufferQueue_Clear(SLBufferQueueItf self);
1359 extern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self,
1360     slBufferQueueCallback callback, void *pContext);
1361 
1362 extern bool IsInterfaceInitialized(IObject *this, unsigned MPH);
1363 extern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID);
1364 extern void ReleaseStrongRef(IObject *object);
1365 extern void ReleaseStrongRefAndUnlockExclusive(IObject *object);
1366 
1367 extern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer);
1368