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