entry.c revision bcc5c7225e3b7a1dbf2e9e830987f69167acf06f
18db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/* 28db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 38db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * 48db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 58db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * you may not use this file except in compliance with the License. 68db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * You may obtain a copy of the License at 78db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * 88db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 98db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * 108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * Unless required by applicable law or agreed to in writing, software 118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * See the License for the specific language governing permissions and 148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten * limitations under the License. 158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten */ 168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/* Initial global entry points */ 188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#include "sles_allinclusive.h" 208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief Internal code shared by slCreateEngine and xaCreateEngine */ 238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic SLresult liCreateEngine(SLObjectItf *pEngine, SLuint32 numOptions, 258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const SLEngineOption *pEngineOptions, SLuint32 numInterfaces, 268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired, 278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const ClassTable *pCEngine_class) 288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLresult result; 308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten int ok; 328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten ok = pthread_mutex_lock(&theOneTrueMutex); 338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten assert(0 == ok); 341d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten bool needToUnlockTheOneTrueMutex = true; 358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten do { 378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (NULL == pEngine) { 398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten *pEngine = NULL; 438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if ((0 < numOptions) && (NULL == pEngineOptions)) { 458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_LOGE("numOptions=%lu and pEngineOptions=NULL", numOptions); 468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // default values 518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLboolean threadSafe = SL_BOOLEAN_TRUE; 528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLboolean lossOfControlGlobal = SL_BOOLEAN_FALSE; 538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // process engine options 558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLuint32 i; 568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const SLEngineOption *option = pEngineOptions; 578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_SUCCESS; 588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten for (i = 0; i < numOptions; ++i, ++option) { 598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten switch (option->feature) { 608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case SL_ENGINEOPTION_THREADSAFE: 618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten threadSafe = SL_BOOLEAN_FALSE != (SLboolean) option->data; // normalize 628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case SL_ENGINEOPTION_LOSSOFCONTROL: 648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten lossOfControlGlobal = SL_BOOLEAN_FALSE != (SLboolean) option->data; // normalize 658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten default: 678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_LOGE("unknown engine option: feature=%lu data=%lu", 688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten option->feature, option->data); 698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (SL_RESULT_SUCCESS != result) { 748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten unsigned exposedMask; 788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten assert(NULL != pCEngine_class); 798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = checkInterfaces(pCEngine_class, numInterfaces, 808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (SL_RESULT_SUCCESS != result) { 828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 851d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // if an engine already exists, then increment its ref count 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CEngine *thiz = theOneTrueEngine; 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NULL != thiz) { 881d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten assert(0 < theOneTrueRefCount); 891d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten ++theOneTrueRefCount; 901d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten 911d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // In order to update the engine object, we need to lock it, 921d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // but that would violate the lock order and potentially deadlock. 931d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // So we unlock now and note that it should not be unlocked later. 941d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten ok = pthread_mutex_unlock(&theOneTrueMutex); 951d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten assert(0 == ok); 961d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten needToUnlockTheOneTrueMutex = false; 97bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten object_lock_exclusive(&thiz->mObject); 981d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten 991d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // now expose additional interfaces not requested by the earlier engine create 1001d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten const struct iid_vtable *x = pCEngine_class->mInterfaces; 101bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint8 *interfaceStateP = thiz->mObject.mInterfaceStates; 1021d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten SLuint32 index; 1031d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten for (index = 0; index < pCEngine_class->mInterfaceCount; ++index, ++x, 1041d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten exposedMask >>= 1, ++interfaceStateP) { 1051d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten switch (*interfaceStateP) { 1061d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten case INTERFACE_EXPOSED: // previously exposed 1071d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten break; 1081d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten case INTERFACE_INITIALIZED: // not exposed during the earlier create 1091d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten if (exposedMask & 1) { 1101d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten const struct MPH_init *mi = &MPH_init_table[x->mMPH]; 1111d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten BoolHook expose = mi->mExpose; 112bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if ((NULL == expose) || (*expose)((char *) thiz + x->mOffset)) { 1131d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten *interfaceStateP = INTERFACE_EXPOSED; 1141d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 1151d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // FIXME log or report to application that expose hook failed 1161d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 1171d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten break; 1181d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten case INTERFACE_UNINITIALIZED: // no init hook 1191d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten break; 1201d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten default: // impossible 1211d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten assert(false); 1221d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten break; 1231d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 1241d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten object_unlock_exclusive(&thiz->mObject); 1261d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // return the shared engine object 127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pEngine = &thiz->mObject.mItf; 1281d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten break; 1291d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 1301d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten 1311d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten // here when creating the first engine reference 1321d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten assert(0 == theOneTrueRefCount); 1331d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten 1341d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten#ifdef ANDROID 1351d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten android::ProcessState::self()->startThreadPool(); 1361d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten android::DataSource::RegisterDefaultSniffers(); 1371d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten#endif 1381d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten 139bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz = (CEngine *) construct(pCEngine_class, exposedMask, NULL); 140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NULL == thiz) { 1418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_MEMORY_FAILURE; 1428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 1438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 1448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // initialize fields not associated with an interface 1468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // mThreadPool is initialized in CEngine_Realize 147bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten memset(&thiz->mThreadPool, 0, sizeof(ThreadPool)); 148bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten memset(&thiz->mSyncThread, 0, sizeof(pthread_t)); 149faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 150bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEqNumPresets = 0; 151bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEqPresetNames = NULL; 1528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif 1538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // initialize fields related to an interface 154bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mObject.mLossOfControlMask = lossOfControlGlobal ? ~0 : 0; 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEngine.mLossOfControlGlobal = lossOfControlGlobal; 156bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEngineCapabilities.mThreadSafe = threadSafe; 157bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IObject_Publish(&thiz->mObject); 158bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten theOneTrueEngine = thiz; 1591d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten theOneTrueRefCount = 1; 1608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // return the new engine object 161bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pEngine = &thiz->mObject.mItf; 1628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } while(0); 1648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1651d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten if (needToUnlockTheOneTrueMutex) { 1661d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten ok = pthread_mutex_unlock(&theOneTrueMutex); 1671d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten assert(0 == ok); 1681d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten needToUnlockTheOneTrueMutex = false; 1691d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 1708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return result; 1728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 1738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slCreateEngine Function */ 1768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1778db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slCreateEngine(SLObjectItf *pEngine, SLuint32 numOptions, 1788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const SLEngineOption *pEngineOptions, SLuint32 numInterfaces, 1798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 1808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 1818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_ENTER_GLOBAL 1828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liCreateEngine(pEngine, numOptions, pEngineOptions, numInterfaces, pInterfaceIds, 1848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pInterfaceRequired, objectIDtoClass(SL_OBJECTID_ENGINE)); 1858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_LEAVE_GLOBAL 1878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 1888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** Internal function for slQuerySupportedEngineInterfaces and xaQuerySupportedEngineInterfaces */ 1918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 1928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic SLresult liQueryNumSupportedInterfaces(SLuint32 *pNumSupportedInterfaces, 193bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten const ClassTable *clazz) 1948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 1958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLresult result; 1968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (NULL == pNumSupportedInterfaces) { 1978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 1988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } else { 199bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten assert(NULL != clazz); 2008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLuint32 count = 0; 2018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLuint32 i; 202bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten for (i = 0; i < clazz->mInterfaceCount; ++i) { 203bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten switch (clazz->mInterfaces[i].mInterface) { 2048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_IMPLICIT: 2058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_IMPLICIT_PREREALIZE: 2068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_EXPLICIT: 2078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_EXPLICIT_PREREALIZE: 2088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_DYNAMIC: 2098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten ++count; 2108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_UNAVAILABLE: 2128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten default: 2148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten assert(false); 2158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten *pNumSupportedInterfaces = count; 2198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_SUCCESS; 2208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return result; 2228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 2238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slQueryNumSupportedEngineInterfaces Function */ 2268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2278db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slQueryNumSupportedEngineInterfaces(SLuint32 *pNumSupportedInterfaces) 2288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 2298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_ENTER_GLOBAL 2308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liQueryNumSupportedInterfaces(pNumSupportedInterfaces, 2328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten objectIDtoClass(SL_OBJECTID_ENGINE)); 2338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_LEAVE_GLOBAL 2358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 2368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** Internal function for slQuerySupportedEngineInterfaces and xaQuerySupportedEngineInterfaces */ 2398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic SLresult liQuerySupportedInterfaces(SLuint32 index, SLInterfaceID *pInterfaceId, 241bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten const ClassTable *clazz) 2428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 2438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLresult result; 2448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (NULL == pInterfaceId) { 2458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 2468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } else { 2478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten *pInterfaceId = NULL; 248bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten assert(NULL != clazz); 2498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; // will be reset later 2508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLuint32 i; 251bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten for (i = 0; i < clazz->mInterfaceCount; ++i) { 252bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten switch (clazz->mInterfaces[i].mInterface) { 2538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_IMPLICIT: 2548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_IMPLICIT_PREREALIZE: 2558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_EXPLICIT: 2568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_EXPLICIT_PREREALIZE: 2578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_DYNAMIC: 2588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten case INTERFACE_UNAVAILABLE: 2608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten continue; 2618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten default: 2628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten assert(false); 2638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (index == 0) { 266bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pInterfaceId = &SL_IID_array[clazz->mInterfaces[i].mMPH]; 2678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_SUCCESS; 2688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten break; 2698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten --index; 2718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 2738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return result; 2748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 2758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slQuerySupportedEngineInterfaces Function */ 2788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2798db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slQuerySupportedEngineInterfaces(SLuint32 index, 2808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SLInterfaceID *pInterfaceId) 2818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 2828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_ENTER_GLOBAL 2838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liQuerySupportedInterfaces(index, pInterfaceId, objectIDtoClass(SL_OBJECTID_ENGINE)); 2858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten SL_LEAVE_GLOBAL 2878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 2888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaCreateEngine Function */ 2918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2928db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaCreateEngine(XAObjectItf *pEngine, XAuint32 numOptions, 2938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAEngineOption *pEngineOptions, XAuint32 numInterfaces, 2948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired) 2958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 2968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_GLOBAL 2978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 2988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liCreateEngine((SLObjectItf *) pEngine, numOptions, 2998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLEngineOption *) pEngineOptions, numInterfaces, 3008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired, 3018b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten objectIDtoClass(XA_OBJECTID_ENGINE)); 3028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_GLOBAL 3048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 3058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaQueryNumSupportedEngineInterfaces Function */ 3088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3098db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaQueryNumSupportedEngineInterfaces(XAuint32 *pNumSupportedInterfaces) 3108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 3118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_GLOBAL 3128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liQueryNumSupportedInterfaces(pNumSupportedInterfaces, 3148b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten objectIDtoClass(XA_OBJECTID_ENGINE)); 3158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_GLOBAL 3178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 3188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaQuerySupportedEngineInterfaces Function */ 3218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3228db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaQuerySupportedEngineInterfaces(XAuint32 index, 3238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAInterfaceID *pInterfaceId) 3248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 3258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_GLOBAL 3268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = liQuerySupportedInterfaces(index, (SLInterfaceID *) pInterfaceId, 3288b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten objectIDtoClass(XA_OBJECTID_ENGINE)); 3298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 3308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_GLOBAL 3318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 332