| /* |
| * 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. |
| */ |
| |
| /* Android Effect Capabilities implementation */ |
| |
| #include "sles_allinclusive.h" |
| |
| |
| static SLresult IAndroidEffectCapabilities_QueryNumEffects(SLAndroidEffectCapabilitiesItf self, |
| SLuint32 * pNumSupportedAudioEffects) { |
| |
| SL_ENTER_INTERFACE |
| |
| if (NULL == pNumSupportedAudioEffects) { |
| result = SL_RESULT_PARAMETER_INVALID; |
| } else { |
| IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; |
| interface_lock_shared(thiz); |
| |
| *pNumSupportedAudioEffects = thiz->mNumFx; |
| result = SL_RESULT_SUCCESS; |
| |
| interface_unlock_shared(thiz); |
| } |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static SLresult IAndroidEffectCapabilities_QueryEffect(SLAndroidEffectCapabilitiesItf self, |
| SLuint32 index, SLInterfaceID *pEffectType, SLInterfaceID *pEffectImplementation, |
| SLchar * pName, SLuint16 *pNameSize) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; |
| if (index > thiz->mNumFx) { |
| result = SL_RESULT_PARAMETER_INVALID; |
| } else { |
| interface_lock_shared(thiz); |
| if (NULL != pEffectType) { |
| *pEffectType = (SLInterfaceID) &thiz->mFxDescriptors[index].type; |
| } |
| if (NULL != pEffectImplementation) { |
| *pEffectImplementation = (SLInterfaceID) &thiz->mFxDescriptors[index].uuid; |
| } |
| if ((NULL != pName) && (0 < *pNameSize)) { |
| int len = strlen(thiz->mFxDescriptors[index].name); |
| strncpy((char*)pName, thiz->mFxDescriptors[index].name, |
| *pNameSize > len ? len : *pNameSize ); |
| *pNameSize = len; |
| } |
| interface_unlock_shared(thiz); |
| result = SL_RESULT_SUCCESS; |
| } |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static const struct SLAndroidEffectCapabilitiesItf_ IAndroidEffectCapabilities_Itf = { |
| IAndroidEffectCapabilities_QueryNumEffects, |
| IAndroidEffectCapabilities_QueryEffect |
| }; |
| |
| void IAndroidEffectCapabilities_init(void *self) |
| { |
| IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; |
| thiz->mItf = &IAndroidEffectCapabilities_Itf; |
| |
| // This is the default initialization; fields will be updated when interface is exposed |
| thiz->mNumFx = 0; |
| thiz->mFxDescriptors = NULL; |
| } |
| |
| bool IAndroidEffectCapabilities_Expose(void *self) |
| { |
| IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; |
| SLuint32 numEffects = 0; |
| SLresult result = android_genericFx_queryNumEffects(&numEffects); |
| if (SL_RESULT_SUCCESS != result) { |
| SL_LOGE("android_genericFx_queryNumEffects %u", result); |
| return false; |
| } |
| thiz->mNumFx = numEffects; |
| SL_LOGV("Effect Capabilities has %d effects", thiz->mNumFx); |
| if (thiz->mNumFx > 0) { |
| thiz->mFxDescriptors = (effect_descriptor_t*) new effect_descriptor_t[thiz->mNumFx]; |
| for (SLuint32 i = 0 ; i < thiz->mNumFx ; i++) { |
| SLresult result2; |
| result2 = android_genericFx_queryEffect(i, &thiz->mFxDescriptors[i]); |
| if (SL_RESULT_SUCCESS != result2) { |
| SL_LOGE("Error (SLresult is %d) querying effect %d", result2, i); |
| // Remember the first failing result code, but keep going |
| if (SL_RESULT_SUCCESS == result) { |
| result = result2; |
| } |
| } else { |
| SL_LOGV("effect %d: type=%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x name=%s", |
| i, |
| thiz->mFxDescriptors[i].type.timeLow, |
| thiz->mFxDescriptors[i].type.timeMid, |
| thiz->mFxDescriptors[i].type.timeHiAndVersion, |
| thiz->mFxDescriptors[i].type.clockSeq, |
| thiz->mFxDescriptors[i].type.node[0], |
| thiz->mFxDescriptors[i].type.node[1], |
| thiz->mFxDescriptors[i].type.node[2], |
| thiz->mFxDescriptors[i].type.node[3], |
| thiz->mFxDescriptors[i].type.node[4], |
| thiz->mFxDescriptors[i].type.node[5], |
| thiz->mFxDescriptors[i].name); |
| } |
| } |
| } |
| return SL_RESULT_SUCCESS == result; |
| } |
| |
| void IAndroidEffectCapabilities_deinit(void *self) |
| { |
| IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; |
| // free effect library data |
| if (NULL != thiz->mFxDescriptors) { |
| delete[] thiz->mFxDescriptors; |
| thiz->mFxDescriptors = NULL; |
| } |
| } |