14c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten/*
24c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
34c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten *
44c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
54c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * you may not use this file except in compliance with the License.
64c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * You may obtain a copy of the License at
74c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten *
84c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
94c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten *
104c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * Unless required by applicable law or agreed to in writing, software
114c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
124c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * See the License for the specific language governing permissions and
144c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten * limitations under the License.
154c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten */
164c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
174c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten/* EngineCapabilities implementation */
184c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
194c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten#include "sles_allinclusive.h"
204c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
21f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
224c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenstatic SLresult IEngineCapabilities_QuerySupportedProfiles(
234c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLEngineCapabilitiesItf self, SLuint16 *pProfilesSupported)
244c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
25f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
26f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
27f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pProfilesSupported) {
28f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
29f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
3051cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten        // The generic implementation doesn't implement any of the profiles, they shouldn't be
3151cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten        // declared as supported. Also exclude the fake profiles BASE and OPTIONAL.
3251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten        *pProfilesSupported = USE_PROFILES &
3351cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten                (USE_PROFILES_GAME | USE_PROFILES_MUSIC | USE_PROFILES_PHONE);
34f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
35f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
36f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
37f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
384c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
394c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
40f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
41c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kastenstatic SLresult IEngineCapabilities_QueryAvailableVoices(SLEngineCapabilitiesItf self,
42c37c934e00a96afe18aaadd9f9a1863c721bf8eaGlenn Kasten    SLuint16 voiceType, SLint16 *pNumMaxVoices, SLboolean *pIsAbsoluteMax, SLint16 *pNumFreeVoices)
434c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
44f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
45f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
464c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    switch (voiceType) {
474c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_VOICETYPE_2D_AUDIO:
484c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_VOICETYPE_MIDI:
494c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_VOICETYPE_3D_AUDIO:
504c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_VOICETYPE_3D_MIDIOUTPUT:
51f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (NULL != pNumMaxVoices)
5251cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten            *pNumMaxVoices = MAX_INSTANCE - 2;
53f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (NULL != pIsAbsoluteMax)
54f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            *pIsAbsoluteMax = SL_BOOLEAN_TRUE;
55f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (NULL != pNumFreeVoices)
5651cb31b09f6af53402b3fbe7e9de29badc1155a2Glenn Kasten            *pNumFreeVoices = MAX_INSTANCE - 2;
57f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
584c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        break;
594c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    default:
60f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
61f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        break;
624c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    }
63f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
64f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
654c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
664c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
67f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
684c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenstatic SLresult IEngineCapabilities_QueryNumberOfMIDISynthesizers(
694c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLEngineCapabilitiesItf self, SLint16 *pNum)
704c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
71f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
72f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
73f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pNum) {
74f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
75f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
76f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        *pNum = 1;
77f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
78f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
79f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
80f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
814c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
824c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
83f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
844c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenstatic SLresult IEngineCapabilities_QueryAPIVersion(SLEngineCapabilitiesItf self,
854c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLint16 *pMajor, SLint16 *pMinor, SLint16 *pStep)
864c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
87f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
88f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
89f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(NULL != pMajor && NULL != pMinor && NULL != pStep)) {
90f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
91f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
92f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        *pMajor = 1;
93f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        *pMinor = 0;
94f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        *pStep = 1;
95f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
96f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
97f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
98f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
994c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
1004c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
101f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
1023be625f40588941aa23e35fed5cb693ddc9718daGlenn KastenSLresult IEngineCapabilities_QueryLEDCapabilities(SLEngineCapabilitiesItf self,
103437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    SLuint32 *pIndex, SLuint32 *pLEDDeviceID, SLLEDDescriptor *pDescriptor)
1044c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
105f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
106f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
10750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEngineCapabilities *thiz = (IEngineCapabilities *) self;
1087e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    const struct LED_id_descriptor *id_descriptor;
1094c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLuint32 index;
1104c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    if (NULL != pIndex) {
111f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
1124c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        if (NULL != pLEDDeviceID || NULL != pDescriptor) {
1134c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            index = *pIndex;
11450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            if (index >= thiz->mMaxIndexLED) {
115f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                result = SL_RESULT_PARAMETER_INVALID;
116f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            } else {
117f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                id_descriptor = &LED_id_descriptors[index];
118f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                if (NULL != pLEDDeviceID)
119f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    *pLEDDeviceID = id_descriptor->id;
120f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                if (NULL != pDescriptor)
121f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    *pDescriptor = *id_descriptor->descriptor;
122f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            }
1234c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        }
12450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pIndex = thiz->mMaxIndexLED;
1254c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    } else {
126f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
1274c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        if (NULL != pLEDDeviceID && NULL != pDescriptor) {
1284c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            SLuint32 id = *pLEDDeviceID;
12950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            for (index = 0; index < thiz->mMaxIndexLED; ++index) {
1304c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                id_descriptor = &LED_id_descriptors[index];
1314c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                if (id == id_descriptor->id) {
1324c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                    *pDescriptor = *id_descriptor->descriptor;
133f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    result = SL_RESULT_SUCCESS;
134f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    break;
1354c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                }
1364c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            }
1374c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        }
1384c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    }
139f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
140f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
1414c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
1424c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
143f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
1443be625f40588941aa23e35fed5cb693ddc9718daGlenn KastenSLresult IEngineCapabilities_QueryVibraCapabilities(SLEngineCapabilitiesItf self,
145437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kasten    SLuint32 *pIndex, SLuint32 *pVibraDeviceID, SLVibraDescriptor *pDescriptor)
1464c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
147f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
148f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
14950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEngineCapabilities *thiz = (IEngineCapabilities *) self;
1507e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    const struct Vibra_id_descriptor *id_descriptor;
1514c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLuint32 index;
1524c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    if (NULL != pIndex) {
153f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
1544c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        if (NULL != pVibraDeviceID || NULL != pDescriptor) {
1554c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            index = *pIndex;
15650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            if (index >= thiz->mMaxIndexVibra) {
157f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                result = SL_RESULT_PARAMETER_INVALID;
158f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            } else {
159f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                id_descriptor = &Vibra_id_descriptors[index];
160f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                if (NULL != pVibraDeviceID)
161f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    *pVibraDeviceID = id_descriptor->id;
162f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                if (NULL != pDescriptor)
163f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    *pDescriptor = *id_descriptor->descriptor;
164f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            }
1654c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        }
16650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pIndex = thiz->mMaxIndexVibra;
1674c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    } else {
168f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
1694c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        if (NULL != pVibraDeviceID && NULL != pDescriptor) {
1704c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            SLuint32 id = *pVibraDeviceID;
17150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            for (index = 0; index < thiz->mMaxIndexVibra; ++index) {
1724c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                id_descriptor = &Vibra_id_descriptors[index];
1734c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                if (id == id_descriptor->id) {
1744c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                    *pDescriptor = *id_descriptor->descriptor;
175f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    result = SL_RESULT_SUCCESS;
176f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten                    break;
1774c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten                }
1784c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten            }
1794c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        }
1804c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    }
181f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
182f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
1834c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
1844c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
185f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
1864c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenstatic SLresult IEngineCapabilities_IsThreadSafe(SLEngineCapabilitiesItf self,
1874c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    SLboolean *pIsThreadSafe)
1884c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
189f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
190f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
191f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pIsThreadSafe) {
192f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
193f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
19450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEngineCapabilities *thiz = (IEngineCapabilities *) self;
19550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pIsThreadSafe = thiz->mThreadSafe;
196f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
197f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
198f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
199f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
2004c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
2014c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
202f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
2034c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenstatic const struct SLEngineCapabilitiesItf_ IEngineCapabilities_Itf = {
2044c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QuerySupportedProfiles,
2054c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QueryAvailableVoices,
2064c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QueryNumberOfMIDISynthesizers,
2074c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QueryAPIVersion,
2084c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QueryLEDCapabilities,
2094c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_QueryVibraCapabilities,
2104c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IEngineCapabilities_IsThreadSafe
2114c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten};
2124c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten
2134c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kastenvoid IEngineCapabilities_init(void *self)
2144c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten{
21550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEngineCapabilities *thiz = (IEngineCapabilities *) self;
21650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mItf = &IEngineCapabilities_Itf;
2174c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    // mThreadSafe is initialized in slCreateEngine
2187e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    const struct LED_id_descriptor *id_descriptor_LED = LED_id_descriptors;
2197e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    while (NULL != id_descriptor_LED->descriptor)
2207e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten        ++id_descriptor_LED;
22150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mMaxIndexLED = id_descriptor_LED - LED_id_descriptors;
2227e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    const struct Vibra_id_descriptor *id_descriptor_Vibra = Vibra_id_descriptors;
2237e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten    while (NULL != id_descriptor_Vibra->descriptor)
2247e5dd9fa6ab032d7eeaac79bee4370a133eda8c2Glenn Kasten        ++id_descriptor_Vibra;
22550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mMaxIndexVibra = id_descriptor_Vibra - Vibra_id_descriptors;
2264c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten}
227