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