entry.c revision faf90312d2156acbf27c62e114fd180708aa7654
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);
348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    do {
368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#ifdef ANDROID
388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        android::ProcessState::self()->startThreadPool();
398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        android::DataSource::RegisterDefaultSniffers();
408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (NULL == pEngine) {
438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        *pEngine = NULL;
478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (NULL != theOneTrueEngine) {
498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            SL_LOGE("slCreateEngine while another engine %p is active", theOneTrueEngine);
508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            result = SL_RESULT_RESOURCE_ERROR;
518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if ((0 < numOptions) && (NULL == pEngineOptions)) {
558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            SL_LOGE("numOptions=%lu and pEngineOptions=NULL", numOptions);
568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // default values
618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLboolean threadSafe = SL_BOOLEAN_TRUE;
628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLboolean lossOfControlGlobal = SL_BOOLEAN_FALSE;
638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // process engine options
658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLuint32 i;
668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        const SLEngineOption *option = pEngineOptions;
678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = SL_RESULT_SUCCESS;
688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        for (i = 0; i < numOptions; ++i, ++option) {
698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            switch (option->feature) {
708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case SL_ENGINEOPTION_THREADSAFE:
718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                threadSafe = SL_BOOLEAN_FALSE != (SLboolean) option->data; // normalize
728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case SL_ENGINEOPTION_LOSSOFCONTROL:
748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                lossOfControlGlobal = SL_BOOLEAN_FALSE != (SLboolean) option->data; // normalize
758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            default:
778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                SL_LOGE("unknown engine option: feature=%lu data=%lu",
788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    option->feature, option->data);
798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                result = SL_RESULT_PARAMETER_INVALID;
808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (SL_RESULT_SUCCESS != result) {
848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        unsigned exposedMask;
888b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten        // const ClassTable *pCEngine_class = objectIDtoClass(SL_OBJECTID_ENGINE);
898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        assert(NULL != pCEngine_class);
908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = checkInterfaces(pCEngine_class, numInterfaces,
918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            pInterfaceIds, pInterfaceRequired, &exposedMask);
928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (SL_RESULT_SUCCESS != result) {
938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        CEngine *this = (CEngine *) construct(pCEngine_class, exposedMask, NULL);
978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (NULL == this) {
988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            result = SL_RESULT_MEMORY_FAILURE;
998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            break;
1008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
1018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // initialize fields not associated with an interface
1038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // mThreadPool is initialized in CEngine_Realize
1048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        memset(&this->mThreadPool, 0, sizeof(ThreadPool));
1058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        memset(&this->mSyncThread, 0, sizeof(pthread_t));
106faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
1078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        this->mEqNumPresets = 0;
1088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        this->mEqPresetNames = NULL;
1098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
1108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // initialize fields related to an interface
1118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        this->mObject.mLossOfControlMask = lossOfControlGlobal ? ~0 : 0;
1128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        this->mEngine.mLossOfControlGlobal = lossOfControlGlobal;
1138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        this->mEngineCapabilities.mThreadSafe = threadSafe;
1148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        IObject_Publish(&this->mObject);
1158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        theOneTrueEngine = this;
1168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        // return the new engine object
1178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        *pEngine = &this->mObject.mItf;
1188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    } while(0);
1208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    ok = pthread_mutex_unlock(&theOneTrueMutex);
1228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    assert(0 == ok);
1238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    return result;
1258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
1268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slCreateEngine Function */
1298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1308db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slCreateEngine(SLObjectItf *pEngine, SLuint32 numOptions,
1318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    const SLEngineOption *pEngineOptions, SLuint32 numInterfaces,
1328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
1338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
1348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_ENTER_GLOBAL
1358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liCreateEngine(pEngine, numOptions, pEngineOptions, numInterfaces, pInterfaceIds,
1378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            pInterfaceRequired, objectIDtoClass(SL_OBJECTID_ENGINE));
1388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_LEAVE_GLOBAL
1408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
1418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** Internal function for slQuerySupportedEngineInterfaces and xaQuerySupportedEngineInterfaces */
1448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic SLresult liQueryNumSupportedInterfaces(SLuint32 *pNumSupportedInterfaces,
1468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        const ClassTable *class__)
1478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
1488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SLresult result;
1498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    if (NULL == pNumSupportedInterfaces) {
1508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
1518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    } else {
1528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        assert(NULL != class__);
1538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLuint32 count = 0;
1548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLuint32 i;
1558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        for (i = 0; i < class__->mInterfaceCount; ++i) {
1568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            switch (class__->mInterfaces[i].mInterface) {
1578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_IMPLICIT:
1588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_IMPLICIT_PREREALIZE:
1598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_EXPLICIT:
1608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_EXPLICIT_PREREALIZE:
1618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_DYNAMIC:
1628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                ++count;
1638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
1648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_UNAVAILABLE:
1658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
1668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            default:
1678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                assert(false);
1688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
1698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
1708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
1718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        *pNumSupportedInterfaces = count;
1728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = SL_RESULT_SUCCESS;
1738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
1748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    return result;
1758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
1768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slQueryNumSupportedEngineInterfaces Function */
1798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1808db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slQueryNumSupportedEngineInterfaces(SLuint32 *pNumSupportedInterfaces)
1818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
1828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_ENTER_GLOBAL
1838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liQueryNumSupportedInterfaces(pNumSupportedInterfaces,
1858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            objectIDtoClass(SL_OBJECTID_ENGINE));
1868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_LEAVE_GLOBAL
1888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
1898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** Internal function for slQuerySupportedEngineInterfaces and xaQuerySupportedEngineInterfaces */
1928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
1938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic SLresult liQuerySupportedInterfaces(SLuint32 index, SLInterfaceID *pInterfaceId,
1948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        const ClassTable *class__)
1958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
1968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SLresult result;
1978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    if (NULL == pInterfaceId) {
1988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
1998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    } else {
2008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        *pInterfaceId = NULL;
2018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        assert(NULL != class__);
2028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        result = SL_RESULT_PARAMETER_INVALID;   // will be reset later
2038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLuint32 i;
2048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        for (i = 0; i < class__->mInterfaceCount; ++i) {
2058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            switch (class__->mInterfaces[i].mInterface) {
2068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_IMPLICIT:
2078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_IMPLICIT_PREREALIZE:
2088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_EXPLICIT:
2098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_EXPLICIT_PREREALIZE:
2108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_DYNAMIC:
2118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
2128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            case INTERFACE_UNAVAILABLE:
2138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                continue;
2148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            default:
2158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                assert(false);
2168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
2178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
2188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            if (index == 0) {
2198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                *pInterfaceId = &SL_IID_array[class__->mInterfaces[i].mMPH];
2208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                result = SL_RESULT_SUCCESS;
2218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                break;
2228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
2238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            --index;
2248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
2258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
2268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    return result;
2278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
2288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief slQuerySupportedEngineInterfaces Function */
2318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2328db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSL_API SLresult SLAPIENTRY slQuerySupportedEngineInterfaces(SLuint32 index,
2338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        SLInterfaceID *pInterfaceId)
2348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
2358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_ENTER_GLOBAL
2368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liQuerySupportedInterfaces(index, pInterfaceId, objectIDtoClass(SL_OBJECTID_ENGINE));
2388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SL_LEAVE_GLOBAL
2408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
2418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaCreateEngine Function */
2448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2458db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaCreateEngine(XAObjectItf *pEngine, XAuint32 numOptions,
2468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        const XAEngineOption *pEngineOptions, XAuint32 numInterfaces,
2478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired)
2488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
2498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_ENTER_GLOBAL
2508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liCreateEngine((SLObjectItf *) pEngine, numOptions,
2528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            (const SLEngineOption *) pEngineOptions, numInterfaces,
2538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired,
2548b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten            objectIDtoClass(XA_OBJECTID_ENGINE));
2558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_LEAVE_GLOBAL
2578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
2588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaQueryNumSupportedEngineInterfaces Function */
2618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2628db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaQueryNumSupportedEngineInterfaces(XAuint32 *pNumSupportedInterfaces)
2638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
2648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_ENTER_GLOBAL
2658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liQueryNumSupportedInterfaces(pNumSupportedInterfaces,
2678b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten            objectIDtoClass(XA_OBJECTID_ENGINE));
2688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_LEAVE_GLOBAL
2708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
2718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief xaQuerySupportedEngineInterfaces Function */
2748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2758db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenXA_API XAresult XAAPIENTRY xaQuerySupportedEngineInterfaces(XAuint32 index,
2768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        XAInterfaceID *pInterfaceId)
2778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
2788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_ENTER_GLOBAL
2798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    result = liQuerySupportedInterfaces(index, (SLInterfaceID *) pInterfaceId,
2818b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten            objectIDtoClass(XA_OBJECTID_ENGINE));
2828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    XA_LEAVE_GLOBAL
2848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
285