/*
* 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.
*/
/* PresetReverb implementation */
#include "sles_allinclusive.h"
#if defined(ANDROID)
/**
* returns true if this interface is not associated with an initialized PresetReverb effect
*/
static inline bool NO_PRESETREVERB(IPresetReverb* ipr) {
return (ipr->mPresetReverbEffect == 0);
}
#endif
static SLresult IPresetReverb_SetPreset(SLPresetReverbItf self, SLuint16 preset)
{
SL_ENTER_INTERFACE
IPresetReverb *thiz = (IPresetReverb *) self;
switch (preset) {
case SL_REVERBPRESET_NONE:
case SL_REVERBPRESET_SMALLROOM:
case SL_REVERBPRESET_MEDIUMROOM:
case SL_REVERBPRESET_LARGEROOM:
case SL_REVERBPRESET_MEDIUMHALL:
case SL_REVERBPRESET_LARGEHALL:
case SL_REVERBPRESET_PLATE:
interface_lock_exclusive(thiz);
thiz->mPreset = preset;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_PRESETREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_prev_setPreset(thiz->mPresetReverbEffect, preset);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
break;
default:
result = SL_RESULT_PARAMETER_INVALID;
break;
}
SL_LEAVE_INTERFACE
}
static SLresult IPresetReverb_GetPreset(SLPresetReverbItf self, SLuint16 *pPreset)
{
SL_ENTER_INTERFACE
if (NULL == pPreset) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IPresetReverb *thiz = (IPresetReverb *) self;
interface_lock_shared(thiz);
SLuint16 preset = SL_REVERBPRESET_NONE;
#if 1 // !defined(ANDROID)
preset = thiz->mPreset;
result = SL_RESULT_SUCCESS;
#else
if (NO_PRESETREVERB(thiz)) {
preset = thiz->mPreset;
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_prev_getPreset(thiz->mPresetReverbEffect, &preset);
result = android_fx_statusToResult(status);
}
// OpenSL ES 1.0.1 spec and conformance test do not permit SL_RESULT_CONTROL_LOST
if (SL_RESULT_CONTROL_LOST == result) {
result = SL_RESULT_SUCCESS;
}
#endif
interface_unlock_shared(thiz);
*pPreset = preset;
}
SL_LEAVE_INTERFACE
}
static const struct SLPresetReverbItf_ IPresetReverb_Itf = {
IPresetReverb_SetPreset,
IPresetReverb_GetPreset
};
void IPresetReverb_init(void *self)
{
IPresetReverb *thiz = (IPresetReverb *) self;
thiz->mItf = &IPresetReverb_Itf;
thiz->mPreset = SL_REVERBPRESET_NONE;
#if defined(ANDROID)
memset(&thiz->mPresetReverbDescriptor, 0, sizeof(effect_descriptor_t));
// placement new (explicit constructor)
(void) new (&thiz->mPresetReverbEffect) android::sp<android::AudioEffect>();
#endif
}
void IPresetReverb_deinit(void *self)
{
#if defined(ANDROID)
IPresetReverb *thiz = (IPresetReverb *) self;
// explicit destructor
thiz->mPresetReverbEffect.~sp();
#endif
}
bool IPresetReverb_Expose(void *self)
{
#if defined(ANDROID)
IPresetReverb *thiz = (IPresetReverb *) self;
if (!android_fx_initEffectDescriptor(SL_IID_PRESETREVERB, &thiz->mPresetReverbDescriptor)) {
SL_LOGE("PresetReverb initialization failed.");
return false;
}
#endif
return true;
}