| /* |
| * 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; |
| } |