xref: /aosp_15_r20/frameworks/wilhelm/src/sles.cpp (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker /* OpenSL ES private and global functions not associated with an interface or class */
18*bebae9c0SAndroid Build Coastguard Worker 
19*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
20*bebae9c0SAndroid Build Coastguard Worker 
21*bebae9c0SAndroid Build Coastguard Worker 
22*bebae9c0SAndroid Build Coastguard Worker /** \brief Return true if the specified interface exists and has been initialized for this object.
23*bebae9c0SAndroid Build Coastguard Worker  *  Returns false if the class does not support this kind of interface, or the class supports the
24*bebae9c0SAndroid Build Coastguard Worker  *  interface but this particular object has not had the interface exposed at object creation time
25*bebae9c0SAndroid Build Coastguard Worker  *  or by DynamicInterface::AddInterface. Note that the return value is not affected by whether
26*bebae9c0SAndroid Build Coastguard Worker  *  the application has requested access to the interface with Object::GetInterface. Assumes on
27*bebae9c0SAndroid Build Coastguard Worker  *  entry that the object is locked for either shared or exclusive access.
28*bebae9c0SAndroid Build Coastguard Worker  */
29*bebae9c0SAndroid Build Coastguard Worker 
IsInterfaceInitialized(IObject * thiz,unsigned MPH)30*bebae9c0SAndroid Build Coastguard Worker bool IsInterfaceInitialized(IObject *thiz, unsigned MPH)
31*bebae9c0SAndroid Build Coastguard Worker {
32*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != thiz);
33*bebae9c0SAndroid Build Coastguard Worker     assert( /* (MPH_MIN <= MPH) && */ (MPH < (unsigned) MPH_MAX));
34*bebae9c0SAndroid Build Coastguard Worker     const ClassTable *clazz = thiz->mClass;
35*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != clazz);
36*bebae9c0SAndroid Build Coastguard Worker     int index;
37*bebae9c0SAndroid Build Coastguard Worker     if (0 > (index = clazz->mMPH_to_index[MPH])) {
38*bebae9c0SAndroid Build Coastguard Worker         return false;
39*bebae9c0SAndroid Build Coastguard Worker     }
40*bebae9c0SAndroid Build Coastguard Worker     assert(SLES_MAX_INDEX >= clazz->mInterfaceCount);
41*bebae9c0SAndroid Build Coastguard Worker     assert(clazz->mInterfaceCount > (unsigned) index);
42*bebae9c0SAndroid Build Coastguard Worker     switch (thiz->mInterfaceStates[index]) {
43*bebae9c0SAndroid Build Coastguard Worker     case INTERFACE_EXPOSED:
44*bebae9c0SAndroid Build Coastguard Worker     case INTERFACE_ADDED:
45*bebae9c0SAndroid Build Coastguard Worker         return true;
46*bebae9c0SAndroid Build Coastguard Worker     default:
47*bebae9c0SAndroid Build Coastguard Worker         return false;
48*bebae9c0SAndroid Build Coastguard Worker     }
49*bebae9c0SAndroid Build Coastguard Worker }
50*bebae9c0SAndroid Build Coastguard Worker 
51*bebae9c0SAndroid Build Coastguard Worker 
52*bebae9c0SAndroid Build Coastguard Worker /** \brief Map an IObject to it's "object ID" (which is really a class ID) */
53*bebae9c0SAndroid Build Coastguard Worker 
IObjectToObjectID(IObject * thiz)54*bebae9c0SAndroid Build Coastguard Worker SLuint32 IObjectToObjectID(IObject *thiz)
55*bebae9c0SAndroid Build Coastguard Worker {
56*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != thiz);
57*bebae9c0SAndroid Build Coastguard Worker     // Note this returns the OpenSL ES object ID in preference to the OpenMAX AL if both available
58*bebae9c0SAndroid Build Coastguard Worker     const ClassTable *clazz = thiz->mClass;
59*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != clazz);
60*bebae9c0SAndroid Build Coastguard Worker     SLuint32 id = clazz->mSLObjectID;
61*bebae9c0SAndroid Build Coastguard Worker     if (!id) {
62*bebae9c0SAndroid Build Coastguard Worker         id = clazz->mXAObjectID;
63*bebae9c0SAndroid Build Coastguard Worker     }
64*bebae9c0SAndroid Build Coastguard Worker     return id;
65*bebae9c0SAndroid Build Coastguard Worker }
66*bebae9c0SAndroid Build Coastguard Worker 
67*bebae9c0SAndroid Build Coastguard Worker 
68*bebae9c0SAndroid Build Coastguard Worker /** \brief Acquire a strong reference to an object.
69*bebae9c0SAndroid Build Coastguard Worker  *  Check that object has the specified "object ID" (which is really a class ID) and is in the
70*bebae9c0SAndroid Build Coastguard Worker  *  realized state.  If so, then acquire a strong reference to it and return true.
71*bebae9c0SAndroid Build Coastguard Worker  *  Otherwise return false.
72*bebae9c0SAndroid Build Coastguard Worker  */
73*bebae9c0SAndroid Build Coastguard Worker 
AcquireStrongRef(IObject * object,SLuint32 expectedObjectID)74*bebae9c0SAndroid Build Coastguard Worker SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID)
75*bebae9c0SAndroid Build Coastguard Worker {
76*bebae9c0SAndroid Build Coastguard Worker     if (NULL == object) {
77*bebae9c0SAndroid Build Coastguard Worker         return SL_RESULT_PARAMETER_INVALID;
78*bebae9c0SAndroid Build Coastguard Worker     }
79*bebae9c0SAndroid Build Coastguard Worker     // NTH additional validity checks on address here
80*bebae9c0SAndroid Build Coastguard Worker     SLresult result;
81*bebae9c0SAndroid Build Coastguard Worker     object_lock_exclusive(object);
82*bebae9c0SAndroid Build Coastguard Worker     SLuint32 actualObjectID = IObjectToObjectID(object);
83*bebae9c0SAndroid Build Coastguard Worker     if (expectedObjectID != actualObjectID) {
84*bebae9c0SAndroid Build Coastguard Worker         SL_LOGE("object %p has object ID %u but expected %u", object, actualObjectID,
85*bebae9c0SAndroid Build Coastguard Worker             expectedObjectID);
86*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
87*bebae9c0SAndroid Build Coastguard Worker     } else if (SL_OBJECT_STATE_REALIZED != object->mState) {
88*bebae9c0SAndroid Build Coastguard Worker         SL_LOGE("object %p with object ID %u is not realized", object, actualObjectID);
89*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PRECONDITIONS_VIOLATED;
90*bebae9c0SAndroid Build Coastguard Worker     } else {
91*bebae9c0SAndroid Build Coastguard Worker         ++object->mStrongRefCount;
92*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
93*bebae9c0SAndroid Build Coastguard Worker     }
94*bebae9c0SAndroid Build Coastguard Worker     object_unlock_exclusive(object);
95*bebae9c0SAndroid Build Coastguard Worker     return result;
96*bebae9c0SAndroid Build Coastguard Worker }
97*bebae9c0SAndroid Build Coastguard Worker 
98*bebae9c0SAndroid Build Coastguard Worker 
99*bebae9c0SAndroid Build Coastguard Worker /** \brief Release a strong reference to an object.
100*bebae9c0SAndroid Build Coastguard Worker  *  Entry condition: the object is locked.
101*bebae9c0SAndroid Build Coastguard Worker  *  Exit condition: the object is unlocked.
102*bebae9c0SAndroid Build Coastguard Worker  *  Finishes the destroy if needed.
103*bebae9c0SAndroid Build Coastguard Worker  */
104*bebae9c0SAndroid Build Coastguard Worker 
ReleaseStrongRefAndUnlockExclusive(IObject * object)105*bebae9c0SAndroid Build Coastguard Worker void ReleaseStrongRefAndUnlockExclusive(IObject *object)
106*bebae9c0SAndroid Build Coastguard Worker {
107*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_DEBUG
108*bebae9c0SAndroid Build Coastguard Worker     assert(pthread_equal(pthread_self(), object->mOwner));
109*bebae9c0SAndroid Build Coastguard Worker #endif
110*bebae9c0SAndroid Build Coastguard Worker     assert(0 < object->mStrongRefCount);
111*bebae9c0SAndroid Build Coastguard Worker     if ((0 == --object->mStrongRefCount) && (SL_OBJECT_STATE_DESTROYING == object->mState)) {
112*bebae9c0SAndroid Build Coastguard Worker         // FIXME do the destroy here - merge with IDestroy
113*bebae9c0SAndroid Build Coastguard Worker         // but can't do this until we move Destroy to the sync thread
114*bebae9c0SAndroid Build Coastguard Worker         // as Destroy is now a blocking operation, and to avoid a race
115*bebae9c0SAndroid Build Coastguard Worker     } else {
116*bebae9c0SAndroid Build Coastguard Worker         object_unlock_exclusive(object);
117*bebae9c0SAndroid Build Coastguard Worker     }
118*bebae9c0SAndroid Build Coastguard Worker }
119*bebae9c0SAndroid Build Coastguard Worker 
120*bebae9c0SAndroid Build Coastguard Worker 
121*bebae9c0SAndroid Build Coastguard Worker /** \brief Release a strong reference to an object.
122*bebae9c0SAndroid Build Coastguard Worker  *  Entry condition: the object is unlocked.
123*bebae9c0SAndroid Build Coastguard Worker  *  Exit condition: the object is unlocked.
124*bebae9c0SAndroid Build Coastguard Worker  *  Finishes the destroy if needed.
125*bebae9c0SAndroid Build Coastguard Worker  */
126*bebae9c0SAndroid Build Coastguard Worker 
ReleaseStrongRef(IObject * object)127*bebae9c0SAndroid Build Coastguard Worker void ReleaseStrongRef(IObject *object)
128*bebae9c0SAndroid Build Coastguard Worker {
129*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != object);
130*bebae9c0SAndroid Build Coastguard Worker     object_lock_exclusive(object);
131*bebae9c0SAndroid Build Coastguard Worker     ReleaseStrongRefAndUnlockExclusive(object);
132*bebae9c0SAndroid Build Coastguard Worker }
133*bebae9c0SAndroid Build Coastguard Worker 
134*bebae9c0SAndroid Build Coastguard Worker 
135*bebae9c0SAndroid Build Coastguard Worker /** \brief Convert POSIX pthread error code to OpenSL ES result code */
136*bebae9c0SAndroid Build Coastguard Worker 
err_to_result(int err)137*bebae9c0SAndroid Build Coastguard Worker SLresult err_to_result(int err)
138*bebae9c0SAndroid Build Coastguard Worker {
139*bebae9c0SAndroid Build Coastguard Worker     if (EAGAIN == err || ENOMEM == err) {
140*bebae9c0SAndroid Build Coastguard Worker         return SL_RESULT_RESOURCE_ERROR;
141*bebae9c0SAndroid Build Coastguard Worker     }
142*bebae9c0SAndroid Build Coastguard Worker     if (0 != err) {
143*bebae9c0SAndroid Build Coastguard Worker         return SL_RESULT_INTERNAL_ERROR;
144*bebae9c0SAndroid Build Coastguard Worker     }
145*bebae9c0SAndroid Build Coastguard Worker     return SL_RESULT_SUCCESS;
146*bebae9c0SAndroid Build Coastguard Worker }
147*bebae9c0SAndroid Build Coastguard Worker 
148*bebae9c0SAndroid Build Coastguard Worker 
149*bebae9c0SAndroid Build Coastguard Worker /** \brief Check the interface IDs passed into a Create operation */
150*bebae9c0SAndroid Build Coastguard Worker 
checkInterfaces(const ClassTable * clazz,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired,unsigned * pExposedMask,unsigned * pRequiredMask)151*bebae9c0SAndroid Build Coastguard Worker SLresult checkInterfaces(const ClassTable *clazz, SLuint32 numInterfaces,
152*bebae9c0SAndroid Build Coastguard Worker     const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired,
153*bebae9c0SAndroid Build Coastguard Worker     unsigned *pExposedMask, unsigned *pRequiredMask)
154*bebae9c0SAndroid Build Coastguard Worker {
155*bebae9c0SAndroid Build Coastguard Worker     assert(NULL != clazz && NULL != pExposedMask);
156*bebae9c0SAndroid Build Coastguard Worker     // Initially no interfaces are exposed
157*bebae9c0SAndroid Build Coastguard Worker     unsigned exposedMask = 0;
158*bebae9c0SAndroid Build Coastguard Worker     unsigned requiredMask = 0;
159*bebae9c0SAndroid Build Coastguard Worker     const struct iid_vtable *interfaces = clazz->mInterfaces;
160*bebae9c0SAndroid Build Coastguard Worker     SLuint32 interfaceCount = clazz->mInterfaceCount;
161*bebae9c0SAndroid Build Coastguard Worker     SLuint32 i;
162*bebae9c0SAndroid Build Coastguard Worker     // Expose all implicit interfaces
163*bebae9c0SAndroid Build Coastguard Worker     for (i = 0; i < interfaceCount; ++i) {
164*bebae9c0SAndroid Build Coastguard Worker         switch (interfaces[i].mInterface) {
165*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_IMPLICIT:
166*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_IMPLICIT_PREREALIZE:
167*bebae9c0SAndroid Build Coastguard Worker             // there must be an initialization hook present
168*bebae9c0SAndroid Build Coastguard Worker             if (NULL != MPH_init_table[interfaces[i].mMPH].mInit) {
169*bebae9c0SAndroid Build Coastguard Worker                 exposedMask |= 1 << i;
170*bebae9c0SAndroid Build Coastguard Worker             }
171*bebae9c0SAndroid Build Coastguard Worker             break;
172*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_EXPLICIT:
173*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_DYNAMIC:
174*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_UNAVAILABLE:
175*bebae9c0SAndroid Build Coastguard Worker         case INTERFACE_EXPLICIT_PREREALIZE:
176*bebae9c0SAndroid Build Coastguard Worker             break;
177*bebae9c0SAndroid Build Coastguard Worker         default:
178*bebae9c0SAndroid Build Coastguard Worker             assert(false);
179*bebae9c0SAndroid Build Coastguard Worker             break;
180*bebae9c0SAndroid Build Coastguard Worker         }
181*bebae9c0SAndroid Build Coastguard Worker     }
182*bebae9c0SAndroid Build Coastguard Worker     if (0 < numInterfaces) {
183*bebae9c0SAndroid Build Coastguard Worker         if (NULL == pInterfaceIds || NULL == pInterfaceRequired) {
184*bebae9c0SAndroid Build Coastguard Worker             return SL_RESULT_PARAMETER_INVALID;
185*bebae9c0SAndroid Build Coastguard Worker         }
186*bebae9c0SAndroid Build Coastguard Worker         bool anyRequiredButUnsupported = false;
187*bebae9c0SAndroid Build Coastguard Worker         // Loop for each requested interface
188*bebae9c0SAndroid Build Coastguard Worker         for (i = 0; i < numInterfaces; ++i) {
189*bebae9c0SAndroid Build Coastguard Worker             SLInterfaceID iid = pInterfaceIds[i];
190*bebae9c0SAndroid Build Coastguard Worker             if (NULL == iid) {
191*bebae9c0SAndroid Build Coastguard Worker                 return SL_RESULT_PARAMETER_INVALID;
192*bebae9c0SAndroid Build Coastguard Worker             }
193*bebae9c0SAndroid Build Coastguard Worker             SLboolean isRequired = pInterfaceRequired[i];
194*bebae9c0SAndroid Build Coastguard Worker             int MPH, index;
195*bebae9c0SAndroid Build Coastguard Worker             if ((0 > (MPH = IID_to_MPH(iid))) ||
196*bebae9c0SAndroid Build Coastguard Worker                     // there must be an initialization hook present
197*bebae9c0SAndroid Build Coastguard Worker                     (NULL == MPH_init_table[MPH].mInit) ||
198*bebae9c0SAndroid Build Coastguard Worker                     (0 > (index = clazz->mMPH_to_index[MPH])) ||
199*bebae9c0SAndroid Build Coastguard Worker                     (INTERFACE_UNAVAILABLE == interfaces[index].mInterface)) {
200*bebae9c0SAndroid Build Coastguard Worker                 // Here if interface was not found, or is not available for this object type
201*bebae9c0SAndroid Build Coastguard Worker                 if (isRequired) {
202*bebae9c0SAndroid Build Coastguard Worker                     // Application said it required the interface, so give up
203*bebae9c0SAndroid Build Coastguard Worker                     SL_LOGE("class %s interface %u required but unavailable MPH=%d",
204*bebae9c0SAndroid Build Coastguard Worker                             clazz->mName, i, MPH);
205*bebae9c0SAndroid Build Coastguard Worker                     anyRequiredButUnsupported = true;
206*bebae9c0SAndroid Build Coastguard Worker                 }
207*bebae9c0SAndroid Build Coastguard Worker                 // Application said it didn't really need the interface, so ignore with warning
208*bebae9c0SAndroid Build Coastguard Worker                 SL_LOGW("class %s interface %u requested but unavailable MPH=%d",
209*bebae9c0SAndroid Build Coastguard Worker                         clazz->mName, i, MPH);
210*bebae9c0SAndroid Build Coastguard Worker                 continue;
211*bebae9c0SAndroid Build Coastguard Worker             }
212*bebae9c0SAndroid Build Coastguard Worker             if (isRequired) {
213*bebae9c0SAndroid Build Coastguard Worker                 requiredMask |= (1 << index);
214*bebae9c0SAndroid Build Coastguard Worker             }
215*bebae9c0SAndroid Build Coastguard Worker             // The requested interface was both found and available, so expose it
216*bebae9c0SAndroid Build Coastguard Worker             exposedMask |= (1 << index);
217*bebae9c0SAndroid Build Coastguard Worker             // Note that we ignore duplicate requests, including equal and aliased IDs
218*bebae9c0SAndroid Build Coastguard Worker         }
219*bebae9c0SAndroid Build Coastguard Worker         if (anyRequiredButUnsupported) {
220*bebae9c0SAndroid Build Coastguard Worker             return SL_RESULT_FEATURE_UNSUPPORTED;
221*bebae9c0SAndroid Build Coastguard Worker         }
222*bebae9c0SAndroid Build Coastguard Worker     }
223*bebae9c0SAndroid Build Coastguard Worker     *pExposedMask = exposedMask;
224*bebae9c0SAndroid Build Coastguard Worker     if (NULL != pRequiredMask) {
225*bebae9c0SAndroid Build Coastguard Worker         *pRequiredMask = requiredMask;
226*bebae9c0SAndroid Build Coastguard Worker     }
227*bebae9c0SAndroid Build Coastguard Worker     return SL_RESULT_SUCCESS;
228*bebae9c0SAndroid Build Coastguard Worker }
229*bebae9c0SAndroid Build Coastguard Worker 
230*bebae9c0SAndroid Build Coastguard Worker 
231*bebae9c0SAndroid Build Coastguard Worker /* Interface initialization hooks */
232*bebae9c0SAndroid Build Coastguard Worker 
233*bebae9c0SAndroid Build Coastguard Worker extern void
234*bebae9c0SAndroid Build Coastguard Worker     I3DCommit_init(void *),
235*bebae9c0SAndroid Build Coastguard Worker     I3DDoppler_init(void *),
236*bebae9c0SAndroid Build Coastguard Worker     I3DGrouping_init(void *),
237*bebae9c0SAndroid Build Coastguard Worker     I3DLocation_init(void *),
238*bebae9c0SAndroid Build Coastguard Worker     I3DMacroscopic_init(void *),
239*bebae9c0SAndroid Build Coastguard Worker     I3DSource_init(void *),
240*bebae9c0SAndroid Build Coastguard Worker     IAndroidAcousticEchoCancellation_init(void *),
241*bebae9c0SAndroid Build Coastguard Worker     IAndroidAutomaticGainControl_init(void *),
242*bebae9c0SAndroid Build Coastguard Worker     IAndroidConfiguration_init(void *),
243*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffect_init(void *),
244*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffectCapabilities_init(void *),
245*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffectSend_init(void *),
246*bebae9c0SAndroid Build Coastguard Worker     IAndroidBufferQueue_init(void *),
247*bebae9c0SAndroid Build Coastguard Worker     IAudioDecoderCapabilities_init(void *),
248*bebae9c0SAndroid Build Coastguard Worker     IAudioEncoder_init(void *),
249*bebae9c0SAndroid Build Coastguard Worker     IAudioEncoderCapabilities_init(void *),
250*bebae9c0SAndroid Build Coastguard Worker     IAudioIODeviceCapabilities_init(void *),
251*bebae9c0SAndroid Build Coastguard Worker     IBassBoost_init(void *),
252*bebae9c0SAndroid Build Coastguard Worker     IBufferQueue_init(void *),
253*bebae9c0SAndroid Build Coastguard Worker     IDeviceVolume_init(void *),
254*bebae9c0SAndroid Build Coastguard Worker     IDynamicInterfaceManagement_init(void *),
255*bebae9c0SAndroid Build Coastguard Worker     IDynamicSource_init(void *),
256*bebae9c0SAndroid Build Coastguard Worker     IEffectSend_init(void *),
257*bebae9c0SAndroid Build Coastguard Worker     IEngine_init(void *),
258*bebae9c0SAndroid Build Coastguard Worker     IEngineCapabilities_init(void *),
259*bebae9c0SAndroid Build Coastguard Worker     IEnvironmentalReverb_init(void *),
260*bebae9c0SAndroid Build Coastguard Worker     IEqualizer_init(void *),
261*bebae9c0SAndroid Build Coastguard Worker     ILEDArray_init(void *),
262*bebae9c0SAndroid Build Coastguard Worker     IMIDIMessage_init(void *),
263*bebae9c0SAndroid Build Coastguard Worker     IMIDIMuteSolo_init(void *),
264*bebae9c0SAndroid Build Coastguard Worker     IMIDITempo_init(void *),
265*bebae9c0SAndroid Build Coastguard Worker     IMIDITime_init(void *),
266*bebae9c0SAndroid Build Coastguard Worker     IMetadataExtraction_init(void *),
267*bebae9c0SAndroid Build Coastguard Worker     IMetadataTraversal_init(void *),
268*bebae9c0SAndroid Build Coastguard Worker     IMuteSolo_init(void *),
269*bebae9c0SAndroid Build Coastguard Worker     IAndroidNoiseSuppression_init(void *),
270*bebae9c0SAndroid Build Coastguard Worker     IObject_init(void *),
271*bebae9c0SAndroid Build Coastguard Worker     IOutputMix_init(void *),
272*bebae9c0SAndroid Build Coastguard Worker     IOutputMixExt_init(void *),
273*bebae9c0SAndroid Build Coastguard Worker     IPitch_init(void *),
274*bebae9c0SAndroid Build Coastguard Worker     IPlay_init(void *),
275*bebae9c0SAndroid Build Coastguard Worker     IPlaybackRate_init(void *),
276*bebae9c0SAndroid Build Coastguard Worker     IPrefetchStatus_init(void *),
277*bebae9c0SAndroid Build Coastguard Worker     IPresetReverb_init(void *),
278*bebae9c0SAndroid Build Coastguard Worker     IRatePitch_init(void *),
279*bebae9c0SAndroid Build Coastguard Worker     IRecord_init(void *),
280*bebae9c0SAndroid Build Coastguard Worker     ISeek_init(void *),
281*bebae9c0SAndroid Build Coastguard Worker     IThreadSync_init(void *),
282*bebae9c0SAndroid Build Coastguard Worker     IVibra_init(void *),
283*bebae9c0SAndroid Build Coastguard Worker     IVirtualizer_init(void *),
284*bebae9c0SAndroid Build Coastguard Worker     IVisualization_init(void *),
285*bebae9c0SAndroid Build Coastguard Worker     IVolume_init(void *);
286*bebae9c0SAndroid Build Coastguard Worker 
287*bebae9c0SAndroid Build Coastguard Worker extern void
288*bebae9c0SAndroid Build Coastguard Worker     I3DGrouping_deinit(void *),
289*bebae9c0SAndroid Build Coastguard Worker     IAndroidAcousticEchoCancellation_deinit(void *),
290*bebae9c0SAndroid Build Coastguard Worker     IAndroidAutomaticGainControl_deinit(void *),
291*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffect_deinit(void *),
292*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffectCapabilities_deinit(void *),
293*bebae9c0SAndroid Build Coastguard Worker     IAndroidBufferQueue_deinit(void *),
294*bebae9c0SAndroid Build Coastguard Worker     IAndroidNoiseSuppression_deinit(void*),
295*bebae9c0SAndroid Build Coastguard Worker     IBassBoost_deinit(void *),
296*bebae9c0SAndroid Build Coastguard Worker     IBufferQueue_deinit(void *),
297*bebae9c0SAndroid Build Coastguard Worker     IEngine_deinit(void *),
298*bebae9c0SAndroid Build Coastguard Worker     IEnvironmentalReverb_deinit(void *),
299*bebae9c0SAndroid Build Coastguard Worker     IEqualizer_deinit(void *),
300*bebae9c0SAndroid Build Coastguard Worker     IObject_deinit(void *),
301*bebae9c0SAndroid Build Coastguard Worker     IPresetReverb_deinit(void *),
302*bebae9c0SAndroid Build Coastguard Worker     IThreadSync_deinit(void *),
303*bebae9c0SAndroid Build Coastguard Worker     IVirtualizer_deinit(void *),
304*bebae9c0SAndroid Build Coastguard Worker     IAndroidConfiguration_deinit(void *);
305*bebae9c0SAndroid Build Coastguard Worker 
306*bebae9c0SAndroid Build Coastguard Worker extern bool
307*bebae9c0SAndroid Build Coastguard Worker     IAndroidAcousticEchoCancellation_Expose(void *),
308*bebae9c0SAndroid Build Coastguard Worker     IAndroidAutomaticGainControl_Expose(void *),
309*bebae9c0SAndroid Build Coastguard Worker     IAndroidEffectCapabilities_Expose(void *),
310*bebae9c0SAndroid Build Coastguard Worker     IAndroidNoiseSuppression_Expose(void *),
311*bebae9c0SAndroid Build Coastguard Worker     IBassBoost_Expose(void *),
312*bebae9c0SAndroid Build Coastguard Worker     IEnvironmentalReverb_Expose(void *),
313*bebae9c0SAndroid Build Coastguard Worker     IEqualizer_Expose(void *),
314*bebae9c0SAndroid Build Coastguard Worker     IPresetReverb_Expose(void *),
315*bebae9c0SAndroid Build Coastguard Worker     IVirtualizer_Expose(void *);
316*bebae9c0SAndroid Build Coastguard Worker 
317*bebae9c0SAndroid Build Coastguard Worker extern void
318*bebae9c0SAndroid Build Coastguard Worker     IXAEngine_init(void *),
319*bebae9c0SAndroid Build Coastguard Worker     IStreamInformation_init(void*),
320*bebae9c0SAndroid Build Coastguard Worker     IVideoDecoderCapabilities_init(void *);
321*bebae9c0SAndroid Build Coastguard Worker 
322*bebae9c0SAndroid Build Coastguard Worker extern void
323*bebae9c0SAndroid Build Coastguard Worker     IXAEngine_deinit(void *),
324*bebae9c0SAndroid Build Coastguard Worker     IStreamInformation_deinit(void *),
325*bebae9c0SAndroid Build Coastguard Worker     IVideoDecoderCapabilities_deinit(void *);
326*bebae9c0SAndroid Build Coastguard Worker 
327*bebae9c0SAndroid Build Coastguard Worker extern bool
328*bebae9c0SAndroid Build Coastguard Worker     IVideoDecoderCapabilities_expose(void *);
329*bebae9c0SAndroid Build Coastguard Worker 
330*bebae9c0SAndroid Build Coastguard Worker #if !(USE_PROFILES & USE_PROFILES_MUSIC)
331*bebae9c0SAndroid Build Coastguard Worker #define IDynamicSource_init         NULL
332*bebae9c0SAndroid Build Coastguard Worker #define IMetadataTraversal_init     NULL
333*bebae9c0SAndroid Build Coastguard Worker #define IVisualization_init         NULL
334*bebae9c0SAndroid Build Coastguard Worker #endif
335*bebae9c0SAndroid Build Coastguard Worker 
336*bebae9c0SAndroid Build Coastguard Worker #if !(USE_PROFILES & USE_PROFILES_GAME)
337*bebae9c0SAndroid Build Coastguard Worker #define I3DCommit_init      NULL
338*bebae9c0SAndroid Build Coastguard Worker #define I3DDoppler_init     NULL
339*bebae9c0SAndroid Build Coastguard Worker #define I3DGrouping_init    NULL
340*bebae9c0SAndroid Build Coastguard Worker #define I3DLocation_init    NULL
341*bebae9c0SAndroid Build Coastguard Worker #define I3DMacroscopic_init NULL
342*bebae9c0SAndroid Build Coastguard Worker #define I3DSource_init      NULL
343*bebae9c0SAndroid Build Coastguard Worker #define IMIDIMessage_init   NULL
344*bebae9c0SAndroid Build Coastguard Worker #define IMIDIMuteSolo_init  NULL
345*bebae9c0SAndroid Build Coastguard Worker #define IMIDITempo_init     NULL
346*bebae9c0SAndroid Build Coastguard Worker #define IMIDITime_init      NULL
347*bebae9c0SAndroid Build Coastguard Worker #define IPitch_init         NULL
348*bebae9c0SAndroid Build Coastguard Worker #define IRatePitch_init     NULL
349*bebae9c0SAndroid Build Coastguard Worker #define I3DGrouping_deinit  NULL
350*bebae9c0SAndroid Build Coastguard Worker #endif
351*bebae9c0SAndroid Build Coastguard Worker 
352*bebae9c0SAndroid Build Coastguard Worker #if !(USE_PROFILES & USE_PROFILES_BASE)
353*bebae9c0SAndroid Build Coastguard Worker #define IAudioDecoderCapabilities_init   NULL
354*bebae9c0SAndroid Build Coastguard Worker #define IAudioEncoderCapabilities_init   NULL
355*bebae9c0SAndroid Build Coastguard Worker #define IAudioEncoder_init               NULL
356*bebae9c0SAndroid Build Coastguard Worker #define IAudioIODeviceCapabilities_init  NULL
357*bebae9c0SAndroid Build Coastguard Worker #define IDeviceVolume_init               NULL
358*bebae9c0SAndroid Build Coastguard Worker #define IEngineCapabilities_init         NULL
359*bebae9c0SAndroid Build Coastguard Worker #define IThreadSync_init                 NULL
360*bebae9c0SAndroid Build Coastguard Worker #define IThreadSync_deinit               NULL
361*bebae9c0SAndroid Build Coastguard Worker #endif
362*bebae9c0SAndroid Build Coastguard Worker 
363*bebae9c0SAndroid Build Coastguard Worker #if !(USE_PROFILES & USE_PROFILES_OPTIONAL)
364*bebae9c0SAndroid Build Coastguard Worker #define ILEDArray_init  NULL
365*bebae9c0SAndroid Build Coastguard Worker #define IVibra_init     NULL
366*bebae9c0SAndroid Build Coastguard Worker #endif
367*bebae9c0SAndroid Build Coastguard Worker 
368*bebae9c0SAndroid Build Coastguard Worker #ifndef ANDROID
369*bebae9c0SAndroid Build Coastguard Worker #define IAndroidConfiguration_init        NULL
370*bebae9c0SAndroid Build Coastguard Worker #define IAndroidConfiguration_deinit      NULL
371*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffect_init               NULL
372*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffectCapabilities_init   NULL
373*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffectSend_init           NULL
374*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffect_deinit             NULL
375*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffectCapabilities_deinit NULL
376*bebae9c0SAndroid Build Coastguard Worker #define IAndroidEffectCapabilities_Expose NULL
377*bebae9c0SAndroid Build Coastguard Worker #define IAndroidBufferQueue_init          NULL
378*bebae9c0SAndroid Build Coastguard Worker #define IStreamInformation_init           NULL
379*bebae9c0SAndroid Build Coastguard Worker #define IAndroidBufferQueue_deinit        NULL
380*bebae9c0SAndroid Build Coastguard Worker #define IStreamInformation_deinit         NULL
381*bebae9c0SAndroid Build Coastguard Worker #endif
382*bebae9c0SAndroid Build Coastguard Worker 
383*bebae9c0SAndroid Build Coastguard Worker #ifndef USE_OUTPUTMIXEXT
384*bebae9c0SAndroid Build Coastguard Worker #define IOutputMixExt_init  NULL
385*bebae9c0SAndroid Build Coastguard Worker #endif
386*bebae9c0SAndroid Build Coastguard Worker 
387*bebae9c0SAndroid Build Coastguard Worker 
388*bebae9c0SAndroid Build Coastguard Worker /*static*/ const struct MPH_init MPH_init_table[MPH_MAX] = {
389*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DCOMMIT, */ I3DCommit_init, NULL, NULL, NULL, NULL },
390*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DDOPPLER, */ I3DDoppler_init, NULL, NULL, NULL, NULL },
391*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DGROUPING, */ I3DGrouping_init, NULL, I3DGrouping_deinit, NULL, NULL },
392*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DLOCATION, */ I3DLocation_init, NULL, NULL, NULL, NULL },
393*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DMACROSCOPIC, */ I3DMacroscopic_init, NULL, NULL, NULL, NULL },
394*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_3DSOURCE, */ I3DSource_init, NULL, NULL, NULL, NULL },
395*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_AUDIODECODERCAPABILITIES, */ IAudioDecoderCapabilities_init, NULL, NULL, NULL, NULL },
396*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_AUDIOENCODER, */ IAudioEncoder_init, NULL, NULL, NULL, NULL },
397*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_AUDIOENCODERCAPABILITIES, */ IAudioEncoderCapabilities_init, NULL, NULL, NULL, NULL },
398*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_AUDIOIODEVICECAPABILITIES, */ IAudioIODeviceCapabilities_init, NULL, NULL, NULL,
399*bebae9c0SAndroid Build Coastguard Worker         NULL },
400*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_BASSBOOST, */ IBassBoost_init, NULL, IBassBoost_deinit, IBassBoost_Expose, NULL },
401*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_BUFFERQUEUE, */ IBufferQueue_init, NULL, IBufferQueue_deinit, NULL, NULL },
402*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_DEVICEVOLUME, */ IDeviceVolume_init, NULL, NULL, NULL, NULL },
403*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_DYNAMICINTERFACEMANAGEMENT, */ IDynamicInterfaceManagement_init, NULL, NULL, NULL,
404*bebae9c0SAndroid Build Coastguard Worker         NULL },
405*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_DYNAMICSOURCE, */ IDynamicSource_init, NULL, NULL, NULL, NULL },
406*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_EFFECTSEND, */ IEffectSend_init, NULL, NULL, NULL, NULL },
407*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ENGINE, */ IEngine_init, NULL, IEngine_deinit, NULL, NULL },
408*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ENGINECAPABILITIES, */ IEngineCapabilities_init, NULL, NULL, NULL, NULL },
409*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ENVIRONMENTALREVERB, */ IEnvironmentalReverb_init, NULL, IEnvironmentalReverb_deinit,
410*bebae9c0SAndroid Build Coastguard Worker         IEnvironmentalReverb_Expose, NULL },
411*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_EQUALIZER, */ IEqualizer_init, NULL, IEqualizer_deinit, IEqualizer_Expose, NULL },
412*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_LED, */ ILEDArray_init, NULL, NULL, NULL, NULL },
413*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_METADATAEXTRACTION, */ IMetadataExtraction_init, NULL, NULL, NULL, NULL },
414*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_METADATATRAVERSAL, */ IMetadataTraversal_init, NULL, NULL, NULL, NULL },
415*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_MIDIMESSAGE, */ IMIDIMessage_init, NULL, NULL, NULL, NULL },
416*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_MIDITIME, */ IMIDITime_init, NULL, NULL, NULL, NULL },
417*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_MIDITEMPO, */ IMIDITempo_init, NULL, NULL, NULL, NULL },
418*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_MIDIMUTESOLO, */ IMIDIMuteSolo_init, NULL, NULL, NULL, NULL },
419*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_MUTESOLO, */ IMuteSolo_init, NULL, NULL, NULL, NULL },
420*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_NULL, */ NULL, NULL, NULL, NULL, NULL },
421*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_OBJECT, */ IObject_init, NULL, IObject_deinit, NULL, NULL },
422*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_OUTPUTMIX, */ IOutputMix_init, NULL, NULL, NULL, NULL },
423*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_PITCH, */ IPitch_init, NULL, NULL, NULL, NULL },
424*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_PLAY, */ IPlay_init, NULL, NULL, NULL, NULL },
425*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_PLAYBACKRATE, */ IPlaybackRate_init, NULL, NULL, NULL, NULL },
426*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_PREFETCHSTATUS, */ IPrefetchStatus_init, NULL, NULL, NULL, NULL },
427*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_PRESETREVERB, */ IPresetReverb_init, NULL, IPresetReverb_deinit,
428*bebae9c0SAndroid Build Coastguard Worker         IPresetReverb_Expose, NULL },
429*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_RATEPITCH, */ IRatePitch_init, NULL, NULL, NULL, NULL },
430*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_RECORD, */ IRecord_init, NULL, NULL, NULL, NULL },
431*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_SEEK, */ ISeek_init, NULL, NULL, NULL, NULL },
432*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_THREADSYNC, */ IThreadSync_init, NULL, IThreadSync_deinit, NULL, NULL },
433*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_VIBRA, */ IVibra_init, NULL, NULL, NULL, NULL },
434*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_VIRTUALIZER, */ IVirtualizer_init, NULL, IVirtualizer_deinit, IVirtualizer_Expose,
435*bebae9c0SAndroid Build Coastguard Worker         NULL },
436*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_VISUALIZATION, */ IVisualization_init, NULL, NULL, NULL, NULL },
437*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_VOLUME, */ IVolume_init, NULL, NULL, NULL, NULL },
438*bebae9c0SAndroid Build Coastguard Worker // Wilhelm desktop extended interfaces
439*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_OUTPUTMIXEXT, */ IOutputMixExt_init, NULL, NULL, NULL, NULL },
440*bebae9c0SAndroid Build Coastguard Worker // Android API level 9 extended interfaces
441*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDEFFECT */ IAndroidEffect_init, NULL, IAndroidEffect_deinit, NULL, NULL },
442*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDEFFECTCAPABILITIES */ IAndroidEffectCapabilities_init, NULL,
443*bebae9c0SAndroid Build Coastguard Worker         IAndroidEffectCapabilities_deinit, IAndroidEffectCapabilities_Expose, NULL },
444*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDEFFECTSEND */ IAndroidEffectSend_init, NULL, NULL, NULL, NULL },
445*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDCONFIGURATION */ IAndroidConfiguration_init, NULL, IAndroidConfiguration_deinit,
446*bebae9c0SAndroid Build Coastguard Worker             NULL, NULL },
447*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDSIMPLEBUFFERQUEUE */ IBufferQueue_init /* alias */, NULL, NULL, NULL, NULL },
448*bebae9c0SAndroid Build Coastguard Worker // Android API level 10 extended interfaces
449*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDBUFFERQUEUESOURCE */ IAndroidBufferQueue_init, NULL, IAndroidBufferQueue_deinit,
450*bebae9c0SAndroid Build Coastguard Worker         NULL, NULL },
451*bebae9c0SAndroid Build Coastguard Worker // OpenMAX AL 1.0.1 interfaces
452*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAAUDIODECODERCAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
453*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAAUDIOENCODER */ NULL, NULL, NULL, NULL, NULL },
454*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAAUDIOENCODERCAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
455*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAAUDIOIODEVICECAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
456*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XACAMERA */ NULL, NULL, NULL, NULL, NULL },
457*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XACAMERACAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
458*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XACONFIGEXTENSION */ NULL, NULL, NULL, NULL, NULL },
459*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XADEVICEVOLUME */ NULL, NULL, NULL, NULL, NULL },
460*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XADYNAMICINTERFACEMANAGEMENT 59 */ NULL, NULL, NULL, NULL, NULL },
461*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XADYNAMICSOURCE */ NULL, NULL, NULL, NULL, NULL },
462*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAENGINE */ IXAEngine_init, NULL, IXAEngine_deinit, NULL, NULL },
463*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAEQUALIZER */ NULL, NULL, NULL, NULL, NULL },
464*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAIMAGECONTROLS */ NULL, NULL, NULL, NULL, NULL },
465*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAIMAGEDECODERCAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
466*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAIMAGEEFFECTS */ NULL, NULL, NULL, NULL, NULL },
467*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAIMAGEENCODER */ NULL, NULL, NULL, NULL, NULL },
468*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAIMAGEENCODERCAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
469*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XALED */ NULL, NULL, NULL, NULL, NULL },
470*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAMETADATAEXTRACTION */ NULL, NULL, NULL, NULL, NULL },
471*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAMETADATAINSERTION */ NULL, NULL, NULL, NULL, NULL },
472*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAMETADATATRAVERSAL */ NULL, NULL, NULL, NULL, NULL },
473*bebae9c0SAndroid Build Coastguard Worker //  { /* MPH_XANULL */ NULL, NULL, NULL, NULL, NULL },
474*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAOBJECT */ IObject_init, NULL, IObject_deinit, NULL, NULL },
475*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAOUTPUTMIX */ NULL, NULL, NULL, NULL, NULL },
476*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAPLAY */ IPlay_init, NULL, NULL, NULL, NULL },
477*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAPLAYBACKRATE */ NULL, NULL, NULL, NULL, NULL },
478*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAPREFETCHSTATUS, */ IPrefetchStatus_init, NULL, NULL, NULL, NULL },
479*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XARADIO */ NULL, NULL, NULL, NULL, NULL },
480*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XARDS */ NULL, NULL, NULL, NULL, NULL },
481*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XARECORD */ NULL, NULL, NULL, NULL, NULL },
482*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XASEEK */ ISeek_init, NULL, NULL, NULL, NULL },
483*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XASNAPSHOT */ NULL, NULL, NULL, NULL, NULL },
484*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XASTREAMINFORMATION */ IStreamInformation_init, NULL, IStreamInformation_deinit,
485*bebae9c0SAndroid Build Coastguard Worker         NULL, NULL },
486*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XATHREADSYNC */ NULL, NULL, NULL, NULL, NULL },
487*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVIBRA */ NULL, NULL, NULL, NULL, NULL },
488*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVIDEODECODERCAPABILITIES */ IVideoDecoderCapabilities_init, NULL,
489*bebae9c0SAndroid Build Coastguard Worker             IVideoDecoderCapabilities_deinit, IVideoDecoderCapabilities_expose, NULL },
490*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVIDEOENCODER */ NULL, NULL, NULL, NULL, NULL },
491*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVIDEOENCODERCAPABILITIES */ NULL, NULL, NULL, NULL, NULL },
492*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVIDEOPOSTPROCESSING */ NULL, NULL, NULL, NULL, NULL },
493*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_XAVOLUME, */ IVolume_init, NULL, NULL, NULL, NULL },
494*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDACOUSTICECHOCANCELLATION, */ IAndroidAcousticEchoCancellation_init, NULL,
495*bebae9c0SAndroid Build Coastguard Worker             IAndroidAcousticEchoCancellation_deinit, IAndroidAcousticEchoCancellation_Expose,
496*bebae9c0SAndroid Build Coastguard Worker             NULL },
497*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDAUTOMATICGAINCONTROL, */ IAndroidAutomaticGainControl_init, NULL,
498*bebae9c0SAndroid Build Coastguard Worker             IAndroidAutomaticGainControl_deinit, IAndroidAutomaticGainControl_Expose, NULL },
499*bebae9c0SAndroid Build Coastguard Worker     { /* MPH_ANDROIDNOISESUPPRESSION, */ IAndroidNoiseSuppression_init, NULL,
500*bebae9c0SAndroid Build Coastguard Worker             IAndroidNoiseSuppression_deinit, IAndroidNoiseSuppression_Expose, NULL },
501*bebae9c0SAndroid Build Coastguard Worker };
502*bebae9c0SAndroid Build Coastguard Worker 
503*bebae9c0SAndroid Build Coastguard Worker 
504*bebae9c0SAndroid Build Coastguard Worker /** \brief Construct a new instance of the specified class, exposing selected interfaces */
505*bebae9c0SAndroid Build Coastguard Worker 
construct(const ClassTable * clazz,unsigned exposedMask,SLEngineItf engine)506*bebae9c0SAndroid Build Coastguard Worker IObject *construct(const ClassTable *clazz, unsigned exposedMask, SLEngineItf engine)
507*bebae9c0SAndroid Build Coastguard Worker {
508*bebae9c0SAndroid Build Coastguard Worker     IObject *thiz;
509*bebae9c0SAndroid Build Coastguard Worker     // Do not change this to malloc; we depend on the object being memset to zero
510*bebae9c0SAndroid Build Coastguard Worker     thiz = (IObject *) calloc(1, clazz->mSize);
511*bebae9c0SAndroid Build Coastguard Worker     if (NULL != thiz) {
512*bebae9c0SAndroid Build Coastguard Worker         SL_LOGV("construct %s at %p", clazz->mName, thiz);
513*bebae9c0SAndroid Build Coastguard Worker         unsigned lossOfControlMask = 0;
514*bebae9c0SAndroid Build Coastguard Worker         // a NULL engine means we are constructing the engine
515*bebae9c0SAndroid Build Coastguard Worker         IEngine *thisEngine = (IEngine *) engine;
516*bebae9c0SAndroid Build Coastguard Worker         if (NULL == thisEngine) {
517*bebae9c0SAndroid Build Coastguard Worker             // thisEngine = &((CEngine *) thiz)->mEngine;
518*bebae9c0SAndroid Build Coastguard Worker             thiz->mEngine = (CEngine *) thiz;
519*bebae9c0SAndroid Build Coastguard Worker         } else {
520*bebae9c0SAndroid Build Coastguard Worker             thiz->mEngine = (CEngine *) thisEngine->mThis;
521*bebae9c0SAndroid Build Coastguard Worker             interface_lock_exclusive(thisEngine);
522*bebae9c0SAndroid Build Coastguard Worker             if (MAX_INSTANCE <= thisEngine->mInstanceCount) {
523*bebae9c0SAndroid Build Coastguard Worker                 SL_LOGE("Too many objects");
524*bebae9c0SAndroid Build Coastguard Worker                 interface_unlock_exclusive(thisEngine);
525*bebae9c0SAndroid Build Coastguard Worker                 free(thiz);
526*bebae9c0SAndroid Build Coastguard Worker                 return NULL;
527*bebae9c0SAndroid Build Coastguard Worker             }
528*bebae9c0SAndroid Build Coastguard Worker             // pre-allocate a pending slot, but don't assign bit from mInstanceMask yet
529*bebae9c0SAndroid Build Coastguard Worker             ++thisEngine->mInstanceCount;
530*bebae9c0SAndroid Build Coastguard Worker             assert(((unsigned) ~0) != thisEngine->mInstanceMask);
531*bebae9c0SAndroid Build Coastguard Worker             interface_unlock_exclusive(thisEngine);
532*bebae9c0SAndroid Build Coastguard Worker             // const, no lock needed
533*bebae9c0SAndroid Build Coastguard Worker             if (thisEngine->mLossOfControlGlobal) {
534*bebae9c0SAndroid Build Coastguard Worker                 lossOfControlMask = ~0;
535*bebae9c0SAndroid Build Coastguard Worker             }
536*bebae9c0SAndroid Build Coastguard Worker         }
537*bebae9c0SAndroid Build Coastguard Worker         thiz->mLossOfControlMask = lossOfControlMask;
538*bebae9c0SAndroid Build Coastguard Worker         thiz->mClass = clazz;
539*bebae9c0SAndroid Build Coastguard Worker         const struct iid_vtable *x = clazz->mInterfaces;
540*bebae9c0SAndroid Build Coastguard Worker         SLuint8 *interfaceStateP = thiz->mInterfaceStates;
541*bebae9c0SAndroid Build Coastguard Worker         SLuint32 index;
542*bebae9c0SAndroid Build Coastguard Worker         for (index = 0; index < clazz->mInterfaceCount; ++index, ++x, exposedMask >>= 1) {
543*bebae9c0SAndroid Build Coastguard Worker             SLuint8 state;
544*bebae9c0SAndroid Build Coastguard Worker             // initialize all interfaces with init hooks, even if not exposed
545*bebae9c0SAndroid Build Coastguard Worker             const struct MPH_init *mi = &MPH_init_table[x->mMPH];
546*bebae9c0SAndroid Build Coastguard Worker             VoidHook init = mi->mInit;
547*bebae9c0SAndroid Build Coastguard Worker             if (NULL != init) {
548*bebae9c0SAndroid Build Coastguard Worker                 void *self = (char *) thiz + x->mOffset;
549*bebae9c0SAndroid Build Coastguard Worker                 // IObject does not have an mThis, so [1] is not always defined
550*bebae9c0SAndroid Build Coastguard Worker                 if (index) {
551*bebae9c0SAndroid Build Coastguard Worker                     ((IObject **) self)[1] = thiz;
552*bebae9c0SAndroid Build Coastguard Worker                 }
553*bebae9c0SAndroid Build Coastguard Worker                 // call the initialization hook
554*bebae9c0SAndroid Build Coastguard Worker                 (*init)(self);
555*bebae9c0SAndroid Build Coastguard Worker                 // IObject does not require a call to GetInterface
556*bebae9c0SAndroid Build Coastguard Worker                 if (index) {
557*bebae9c0SAndroid Build Coastguard Worker                     // This trickery invalidates the v-table until GetInterface
558*bebae9c0SAndroid Build Coastguard Worker                     ((size_t *) self)[0] ^= ~0;
559*bebae9c0SAndroid Build Coastguard Worker                 }
560*bebae9c0SAndroid Build Coastguard Worker                 // if interface is exposed, also call the optional expose hook
561*bebae9c0SAndroid Build Coastguard Worker                 BoolHook expose;
562*bebae9c0SAndroid Build Coastguard Worker                 state = (exposedMask & 1) && ((NULL == (expose = mi->mExpose)) || (*expose)(self)) ?
563*bebae9c0SAndroid Build Coastguard Worker                         INTERFACE_EXPOSED : INTERFACE_INITIALIZED;
564*bebae9c0SAndroid Build Coastguard Worker                 // FIXME log or report to application if an expose hook on a
565*bebae9c0SAndroid Build Coastguard Worker                 // required explicit interface fails at creation time
566*bebae9c0SAndroid Build Coastguard Worker             } else {
567*bebae9c0SAndroid Build Coastguard Worker                 state = INTERFACE_UNINITIALIZED;
568*bebae9c0SAndroid Build Coastguard Worker             }
569*bebae9c0SAndroid Build Coastguard Worker             *interfaceStateP++ = state;
570*bebae9c0SAndroid Build Coastguard Worker         }
571*bebae9c0SAndroid Build Coastguard Worker         // note that the new object is not yet published; creator must call IObject_Publish
572*bebae9c0SAndroid Build Coastguard Worker     }
573*bebae9c0SAndroid Build Coastguard Worker     return thiz;
574*bebae9c0SAndroid Build Coastguard Worker }
575