/*
* 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) && !defined(USE_BACKPORT)
/**
* 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 *this = (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_poke(this);
this->mPreset = preset;
#if !defined(ANDROID) || defined(USE_BACKPORT)
result = SL_RESULT_SUCCESS;
#else
if (NO_PRESETREVERB(this)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_prev_setPreset(this->mPresetReverbEffect, preset);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_poke(this);
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 *this = (IPresetReverb *) self;
interface_lock_peek(this);
SLuint16 preset = SL_REVERBPRESET_NONE;
#if !defined(ANDROID) || defined(USE_BACKPORT)
preset = this->mPreset;
result = SL_RESULT_SUCCESS;
#else
if (NO_PRESETREVERB(this)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_prev_getPreset(this->mPresetReverbEffect, &preset);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_peek(this);
*pPreset = preset;
}
SL_LEAVE_INTERFACE
}
static const struct SLPresetReverbItf_ IPresetReverb_Itf = {
IPresetReverb_SetPreset,
IPresetReverb_GetPreset
};
void IPresetReverb_init(void *self)
{
IPresetReverb *this = (IPresetReverb *) self;
this->mItf = &IPresetReverb_Itf;
this->mPreset = SL_REVERBPRESET_NONE;
#if defined(ANDROID) && !defined(USE_BACKPORT)
memset(&this->mPresetReverbDescriptor, 0, sizeof(effect_descriptor_t));
// placement new (explicit constructor)
(void) new (&this->mPresetReverbEffect) android::sp<android::AudioEffect>();
#endif
}
void IPresetReverb_deinit(void *self)
{
#if defined(ANDROID) && !defined(USE_BACKPORT)
IPresetReverb *this = (IPresetReverb *) self;
// explicit destructor
this->mPresetReverbEffect.~sp();
#endif
}
bool IPresetReverb_Expose(void *self)
{
#if defined(ANDROID) && !defined(USE_BACKPORT)
IPresetReverb *this = (IPresetReverb *) self;
if (!android_fx_initEffectDescriptor(SL_IID_PRESETREVERB, &this->mPresetReverbDescriptor)) {
SL_LOGE("PresetReverb initialization failed.");
return false;
}
#endif
return true;
}