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