/*
* 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 implementation */
#include "sles_allinclusive.h"
static SLresult IAndroidEffect_CreateEffect(SLAndroidEffectItf self,
SLInterfaceID effectImplementationId) {
SL_ENTER_INTERFACE
IAndroidEffect *this = (IAndroidEffect *) self;
if (SL_OBJECTID_AUDIOPLAYER == IObjectToObjectID(this->mThis)) {
CAudioPlayer *ap = (CAudioPlayer *)this->mThis;
if (NULL != ap->mAudioTrack) {
result = android_genericFx_createEffect(this, effectImplementationId, ap->mSessionId);
} else {
result = SL_RESULT_RESOURCE_ERROR;
}
} else if (SL_OBJECTID_OUTPUTMIX == IObjectToObjectID(this->mThis)) {
result = android_genericFx_createEffect(this, effectImplementationId,
android::AudioSystem::SESSION_OUTPUT_MIX);
} else {
// the interface itself is invalid because it is not attached to an AudioPlayer or
// an OutputMix
result = SL_RESULT_PARAMETER_INVALID;
}
SL_LEAVE_INTERFACE
}
static SLresult IAndroidEffect_ReleaseEffect(SLAndroidEffectItf self,
SLInterfaceID effectImplementationId) {
SL_ENTER_INTERFACE
IAndroidEffect *this = (IAndroidEffect *) self;
result = android_genericFx_releaseEffect(this, effectImplementationId);
SL_LEAVE_INTERFACE
}
static SLresult IAndroidEffect_SetEnabled(SLAndroidEffectItf self,
SLInterfaceID effectImplementationId, SLboolean enabled) {
SL_ENTER_INTERFACE
IAndroidEffect *this = (IAndroidEffect *) self;
result = android_genericFx_setEnabled(this, effectImplementationId, enabled);
SL_LEAVE_INTERFACE
}
static SLresult IAndroidEffect_IsEnabled(SLAndroidEffectItf self,
SLInterfaceID effectImplementationId, SLboolean * pEnabled) {
SL_ENTER_INTERFACE
IAndroidEffect *this = (IAndroidEffect *) self;
result = android_genericFx_isEnabled(this, effectImplementationId, pEnabled);
SL_LEAVE_INTERFACE
}
static SLresult IAndroidEffect_SendCommand(SLAndroidEffectItf self,
SLInterfaceID effectImplementationId, SLuint32 command, SLuint32 commandSize,
void* pCommand, SLuint32 *replySize, void *pReply) {
SL_ENTER_INTERFACE
IAndroidEffect *this = (IAndroidEffect *) self;
result = android_genericFx_sendCommand(this, effectImplementationId, command, commandSize,
pCommand, replySize, pReply);
SL_LEAVE_INTERFACE
}
static const struct SLAndroidEffectItf_ IAndroidEffect_Itf = {
IAndroidEffect_CreateEffect,
IAndroidEffect_ReleaseEffect,
IAndroidEffect_SetEnabled,
IAndroidEffect_IsEnabled,
IAndroidEffect_SendCommand
};
void IAndroidEffect_init(void *self)
{
IAndroidEffect *this = (IAndroidEffect *) self;
this->mItf = &IAndroidEffect_Itf;
#ifndef TARGET_SIMULATOR
this->mEffects = new android::KeyedVector<SLuint32, android::AudioEffect* >();
#endif
}
void IAndroidEffect_deinit(void *self)
{
IAndroidEffect *this = (IAndroidEffect *) self;
#ifndef TARGET_SIMULATOR
if (NULL != this->mEffects) {
if (!this->mEffects->isEmpty()) {
for (size_t i = 0 ; i < this->mEffects->size() ; i++) {
delete this->mEffects->valueAt(i);
}
this->mEffects->clear();
}
delete this->mEffects;
this->mEffects = NULL;
}
#endif
}