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