| /* | |
| * Copyright (C) 2010 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| /* EngineCapabilities implementation */ | |
| #include "sles_allinclusive.h" | |
| static SLresult IEngineCapabilities_QuerySupportedProfiles( | |
| SLEngineCapabilitiesItf self, SLuint16 *pProfilesSupported) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pProfilesSupported) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| // The generic implementation doesn't implement any of the profiles, they shouldn't be | |
| // declared as supported. Also exclude the fake profiles BASE and OPTIONAL. | |
| *pProfilesSupported = USE_PROFILES & | |
| (USE_PROFILES_GAME | USE_PROFILES_MUSIC | USE_PROFILES_PHONE); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IEngineCapabilities_QueryAvailableVoices(SLEngineCapabilitiesItf self, | |
| SLuint16 voiceType, SLint16 *pNumMaxVoices, SLboolean *pIsAbsoluteMax, SLint16 *pNumFreeVoices) | |
| { | |
| SL_ENTER_INTERFACE | |
| switch (voiceType) { | |
| case SL_VOICETYPE_2D_AUDIO: | |
| case SL_VOICETYPE_MIDI: | |
| case SL_VOICETYPE_3D_AUDIO: | |
| case SL_VOICETYPE_3D_MIDIOUTPUT: | |
| if (NULL != pNumMaxVoices) | |
| *pNumMaxVoices = MAX_INSTANCE - 2; | |
| if (NULL != pIsAbsoluteMax) | |
| *pIsAbsoluteMax = SL_BOOLEAN_TRUE; | |
| if (NULL != pNumFreeVoices) | |
| *pNumFreeVoices = MAX_INSTANCE - 2; | |
| result = SL_RESULT_SUCCESS; | |
| break; | |
| default: | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| break; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IEngineCapabilities_QueryNumberOfMIDISynthesizers( | |
| SLEngineCapabilitiesItf self, SLint16 *pNum) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pNum) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| *pNum = 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IEngineCapabilities_QueryAPIVersion(SLEngineCapabilitiesItf self, | |
| SLint16 *pMajor, SLint16 *pMinor, SLint16 *pStep) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (!(NULL != pMajor && NULL != pMinor && NULL != pStep)) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| *pMajor = 1; | |
| *pMinor = 0; | |
| *pStep = 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| SLresult IEngineCapabilities_QueryLEDCapabilities(SLEngineCapabilitiesItf self, | |
| SLuint32 *pIndex, SLuint32 *pLEDDeviceID, SLLEDDescriptor *pDescriptor) | |
| { | |
| SL_ENTER_INTERFACE | |
| IEngineCapabilities *thiz = (IEngineCapabilities *) self; | |
| const struct LED_id_descriptor *id_descriptor; | |
| SLuint32 index; | |
| if (NULL != pIndex) { | |
| result = SL_RESULT_SUCCESS; | |
| if (NULL != pLEDDeviceID || NULL != pDescriptor) { | |
| index = *pIndex; | |
| if (index >= thiz->mMaxIndexLED) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| id_descriptor = &LED_id_descriptors[index]; | |
| if (NULL != pLEDDeviceID) | |
| *pLEDDeviceID = id_descriptor->id; | |
| if (NULL != pDescriptor) | |
| *pDescriptor = *id_descriptor->descriptor; | |
| } | |
| } | |
| *pIndex = thiz->mMaxIndexLED; | |
| } else { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| if (NULL != pLEDDeviceID && NULL != pDescriptor) { | |
| SLuint32 id = *pLEDDeviceID; | |
| for (index = 0; index < thiz->mMaxIndexLED; ++index) { | |
| id_descriptor = &LED_id_descriptors[index]; | |
| if (id == id_descriptor->id) { | |
| *pDescriptor = *id_descriptor->descriptor; | |
| result = SL_RESULT_SUCCESS; | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| SLresult IEngineCapabilities_QueryVibraCapabilities(SLEngineCapabilitiesItf self, | |
| SLuint32 *pIndex, SLuint32 *pVibraDeviceID, SLVibraDescriptor *pDescriptor) | |
| { | |
| SL_ENTER_INTERFACE | |
| IEngineCapabilities *thiz = (IEngineCapabilities *) self; | |
| const struct Vibra_id_descriptor *id_descriptor; | |
| SLuint32 index; | |
| if (NULL != pIndex) { | |
| result = SL_RESULT_SUCCESS; | |
| if (NULL != pVibraDeviceID || NULL != pDescriptor) { | |
| index = *pIndex; | |
| if (index >= thiz->mMaxIndexVibra) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| id_descriptor = &Vibra_id_descriptors[index]; | |
| if (NULL != pVibraDeviceID) | |
| *pVibraDeviceID = id_descriptor->id; | |
| if (NULL != pDescriptor) | |
| *pDescriptor = *id_descriptor->descriptor; | |
| } | |
| } | |
| *pIndex = thiz->mMaxIndexVibra; | |
| } else { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| if (NULL != pVibraDeviceID && NULL != pDescriptor) { | |
| SLuint32 id = *pVibraDeviceID; | |
| for (index = 0; index < thiz->mMaxIndexVibra; ++index) { | |
| id_descriptor = &Vibra_id_descriptors[index]; | |
| if (id == id_descriptor->id) { | |
| *pDescriptor = *id_descriptor->descriptor; | |
| result = SL_RESULT_SUCCESS; | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IEngineCapabilities_IsThreadSafe(SLEngineCapabilitiesItf self, | |
| SLboolean *pIsThreadSafe) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pIsThreadSafe) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IEngineCapabilities *thiz = (IEngineCapabilities *) self; | |
| *pIsThreadSafe = thiz->mThreadSafe; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static const struct SLEngineCapabilitiesItf_ IEngineCapabilities_Itf = { | |
| IEngineCapabilities_QuerySupportedProfiles, | |
| IEngineCapabilities_QueryAvailableVoices, | |
| IEngineCapabilities_QueryNumberOfMIDISynthesizers, | |
| IEngineCapabilities_QueryAPIVersion, | |
| IEngineCapabilities_QueryLEDCapabilities, | |
| IEngineCapabilities_QueryVibraCapabilities, | |
| IEngineCapabilities_IsThreadSafe | |
| }; | |
| void IEngineCapabilities_init(void *self) | |
| { | |
| IEngineCapabilities *thiz = (IEngineCapabilities *) self; | |
| thiz->mItf = &IEngineCapabilities_Itf; | |
| // mThreadSafe is initialized in slCreateEngine | |
| const struct LED_id_descriptor *id_descriptor_LED = LED_id_descriptors; | |
| while (NULL != id_descriptor_LED->descriptor) | |
| ++id_descriptor_LED; | |
| thiz->mMaxIndexLED = id_descriptor_LED - LED_id_descriptors; | |
| const struct Vibra_id_descriptor *id_descriptor_Vibra = Vibra_id_descriptors; | |
| while (NULL != id_descriptor_Vibra->descriptor) | |
| ++id_descriptor_Vibra; | |
| thiz->mMaxIndexVibra = id_descriptor_Vibra - Vibra_id_descriptors; | |
| } |