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