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