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