blob: 9402b27f4cccbbf31af22ddb3b4b5b32832cc068 [file] [log] [blame]
/*
* 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.
*/
/* EnvironmentalReverb implementation */
#include "sles_allinclusive.h"
#ifdef ANDROID
#include <system/audio_effects/effect_environmentalreverb.h>
#endif
// Note: all Set operations use exclusive not poke,
// because SetEnvironmentalReverbProperties is exclusive.
// It is safe for the Get operations to use peek,
// on the assumption that the block copy will atomically
// replace each word of the block.
#if defined(ANDROID)
/**
* returns true if this interface is not associated with an initialized EnvironmentalReverb effect
*/
static inline bool NO_ENVREVERB(IEnvironmentalReverb* ier) {
return (ier->mEnvironmentalReverbEffect == 0);
}
#endif
static SLresult IEnvironmentalReverb_SetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel room)
{
SL_ENTER_INTERFACE
//if (!(SL_MILLIBEL_MIN <= room && room <= 0)) {
// comparison (SL_MILLIBEL_MIN <= room) is always true due to range of SLmillibel
if (!(room <= 0)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.roomLevel = room;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_ROOM_LEVEL, &room);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel *pRoom)
{
SL_ENTER_INTERFACE
if (NULL == pRoom) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_ROOM_LEVEL, &thiz->mProperties.roomLevel);
result = android_fx_statusToResult(status);
}
#endif
*pRoom = thiz->mProperties.roomLevel;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetRoomHFLevel(
SLEnvironmentalReverbItf self, SLmillibel roomHF)
{
SL_ENTER_INTERFACE
//if (!(SL_MILLIBEL_MIN <= roomHF && roomHF <= 0)) {
// comparison (SL_MILLIBEL_MIN <= roomHF) is always true due to range of SLmillibel
if (!(roomHF <= 0)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.roomHFLevel = roomHF;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_ROOM_HF_LEVEL, &roomHF);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetRoomHFLevel(
SLEnvironmentalReverbItf self, SLmillibel *pRoomHF)
{
SL_ENTER_INTERFACE
if (NULL == pRoomHF) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_ROOM_HF_LEVEL, &thiz->mProperties.roomHFLevel);
result = android_fx_statusToResult(status);
}
#endif
*pRoomHF = thiz->mProperties.roomHFLevel;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetDecayTime(
SLEnvironmentalReverbItf self, SLmillisecond decayTime)
{
SL_ENTER_INTERFACE
if (!(100 <= decayTime && decayTime <= 20000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.decayTime = decayTime;
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DECAY_TIME, &decayTime);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetDecayTime(
SLEnvironmentalReverbItf self, SLmillisecond *pDecayTime)
{
SL_ENTER_INTERFACE
if (NULL == pDecayTime) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DECAY_TIME, &thiz->mProperties.decayTime);
result = android_fx_statusToResult(status);
}
#endif
*pDecayTime = thiz->mProperties.decayTime;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetDecayHFRatio(
SLEnvironmentalReverbItf self, SLpermille decayHFRatio)
{
SL_ENTER_INTERFACE
if (!(100 <= decayHFRatio && decayHFRatio <= 2000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.decayHFRatio = decayHFRatio;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DECAY_HF_RATIO, &decayHFRatio);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetDecayHFRatio(
SLEnvironmentalReverbItf self, SLpermille *pDecayHFRatio)
{
SL_ENTER_INTERFACE
if (NULL == pDecayHFRatio) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DECAY_HF_RATIO, &thiz->mProperties.decayHFRatio);
result = android_fx_statusToResult(status);
}
#endif
*pDecayHFRatio = thiz->mProperties.decayHFRatio;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetReflectionsLevel(
SLEnvironmentalReverbItf self, SLmillibel reflectionsLevel)
{
SL_ENTER_INTERFACE
//if (!(SL_MILLIBEL_MIN <= reflectionsLevel && reflectionsLevel <= 1000)) {
// comparison (SL_MILLIBEL_MIN <= reflectionsLevel) is always true due to range of SLmillibel
if (!(reflectionsLevel <= 1000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.reflectionsLevel = reflectionsLevel;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REFLECTIONS_LEVEL, &reflectionsLevel);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetReflectionsLevel(
SLEnvironmentalReverbItf self, SLmillibel *pReflectionsLevel)
{
SL_ENTER_INTERFACE
if (NULL == pReflectionsLevel) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REFLECTIONS_LEVEL, &thiz->mProperties.reflectionsLevel);
result = android_fx_statusToResult(status);
}
#endif
*pReflectionsLevel = thiz->mProperties.reflectionsLevel;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetReflectionsDelay(
SLEnvironmentalReverbItf self, SLmillisecond reflectionsDelay)
{
SL_ENTER_INTERFACE
if (!(/* 0 <= reflectionsDelay && */ reflectionsDelay <= 300)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.reflectionsDelay = reflectionsDelay;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REFLECTIONS_DELAY, &reflectionsDelay);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetReflectionsDelay(
SLEnvironmentalReverbItf self, SLmillisecond *pReflectionsDelay)
{
SL_ENTER_INTERFACE
if (NULL == pReflectionsDelay) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REFLECTIONS_DELAY, &thiz->mProperties.reflectionsDelay);
result = android_fx_statusToResult(status);
}
#endif
*pReflectionsDelay = thiz->mProperties.reflectionsDelay;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetReverbLevel(
SLEnvironmentalReverbItf self, SLmillibel reverbLevel)
{
SL_ENTER_INTERFACE
//if (!(SL_MILLIBEL_MIN <= reverbLevel && reverbLevel <= 2000)) {
// comparison (SL_MILLIBEL_MIN <= reverbLevel) is always true due to range of SLmillibel
if (!(reverbLevel <= 2000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.reverbLevel = reverbLevel;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REVERB_LEVEL, &reverbLevel);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetReverbLevel(
SLEnvironmentalReverbItf self, SLmillibel *pReverbLevel)
{
SL_ENTER_INTERFACE
if (NULL == pReverbLevel) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REVERB_LEVEL, &thiz->mProperties.reverbLevel);
result = android_fx_statusToResult(status);
}
#endif
*pReverbLevel = thiz->mProperties.reverbLevel;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetReverbDelay(
SLEnvironmentalReverbItf self, SLmillisecond reverbDelay)
{
SL_ENTER_INTERFACE
if (!(/* 0 <= reverbDelay && */ reverbDelay <= 100)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.reverbDelay = reverbDelay;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REVERB_DELAY, &reverbDelay);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetReverbDelay(
SLEnvironmentalReverbItf self, SLmillisecond *pReverbDelay)
{
SL_ENTER_INTERFACE
if (NULL == pReverbDelay) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_REVERB_DELAY, &thiz->mProperties.reverbDelay);
result = android_fx_statusToResult(status);
}
#endif
*pReverbDelay = thiz->mProperties.reverbDelay;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetDiffusion(
SLEnvironmentalReverbItf self, SLpermille diffusion)
{
SL_ENTER_INTERFACE
if (!(0 <= diffusion && diffusion <= 1000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.diffusion = diffusion;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DIFFUSION, &diffusion);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetDiffusion(SLEnvironmentalReverbItf self,
SLpermille *pDiffusion)
{
SL_ENTER_INTERFACE
if (NULL == pDiffusion) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DIFFUSION, &thiz->mProperties.diffusion);
result = android_fx_statusToResult(status);
}
#endif
*pDiffusion = thiz->mProperties.diffusion;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetDensity(SLEnvironmentalReverbItf self,
SLpermille density)
{
SL_ENTER_INTERFACE
if (!(0 <= density && density <= 1000)) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties.density = density;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DENSITY, &density);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetDensity(SLEnvironmentalReverbItf self,
SLpermille *pDensity)
{
SL_ENTER_INTERFACE
if (NULL == pDensity) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_DENSITY, &thiz->mProperties.density);
result = android_fx_statusToResult(status);
}
#endif
*pDensity = thiz->mProperties.density;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_SetEnvironmentalReverbProperties(SLEnvironmentalReverbItf self,
const SLEnvironmentalReverbSettings *pProperties)
{
SL_ENTER_INTERFACE
// note that it's unnecessary to verify that any level stored inside the "properties" struct
// is >= SL_MILLIBEL_MIN before using it, due to range of SLmillibel
result = SL_RESULT_PARAMETER_INVALID;
do {
if (NULL == pProperties)
break;
SLEnvironmentalReverbSettings properties = *pProperties;
if (!(properties.roomLevel <= 0))
break;
if (!(properties.roomHFLevel <= 0))
break;
if (!(100 <= properties.decayTime && properties.decayTime <= 20000))
break;
if (!(100 <= properties.decayHFRatio && properties.decayHFRatio <= 2000))
break;
if (!(properties.reflectionsLevel <= 1000))
break;
if (!(/* 0 <= properties.reflectionsDelay && */ properties.reflectionsDelay <= 300))
break;
if (!(properties.reverbLevel <= 2000))
break;
if (!(/* 0 <= properties.reverbDelay && */ properties.reverbDelay <= 100))
break;
if (!(0 <= properties.diffusion && properties.diffusion <= 1000))
break;
if (!(0 <= properties.density && properties.density <= 1000))
break;
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_exclusive(thiz);
thiz->mProperties = properties;
#if !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_PROPERTIES, &properties);
result = android_fx_statusToResult(status);
}
#endif
interface_unlock_exclusive(thiz);
} while (0);
SL_LEAVE_INTERFACE
}
static SLresult IEnvironmentalReverb_GetEnvironmentalReverbProperties(
SLEnvironmentalReverbItf self, SLEnvironmentalReverbSettings *pProperties)
{
SL_ENTER_INTERFACE
if (NULL == pProperties) {
result = SL_RESULT_PARAMETER_INVALID;
} else {
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
interface_lock_shared(thiz);
#if 1 // !defined(ANDROID)
result = SL_RESULT_SUCCESS;
#else
if (NO_ENVREVERB(thiz)) {
result = SL_RESULT_CONTROL_LOST;
} else {
android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
REVERB_PARAM_PROPERTIES, &thiz->mProperties);
result = android_fx_statusToResult(status);
}
#endif
*pProperties = thiz->mProperties;
interface_unlock_shared(thiz);
}
SL_LEAVE_INTERFACE
}
static const struct SLEnvironmentalReverbItf_ IEnvironmentalReverb_Itf = {
IEnvironmentalReverb_SetRoomLevel,
IEnvironmentalReverb_GetRoomLevel,
IEnvironmentalReverb_SetRoomHFLevel,
IEnvironmentalReverb_GetRoomHFLevel,
IEnvironmentalReverb_SetDecayTime,
IEnvironmentalReverb_GetDecayTime,
IEnvironmentalReverb_SetDecayHFRatio,
IEnvironmentalReverb_GetDecayHFRatio,
IEnvironmentalReverb_SetReflectionsLevel,
IEnvironmentalReverb_GetReflectionsLevel,
IEnvironmentalReverb_SetReflectionsDelay,
IEnvironmentalReverb_GetReflectionsDelay,
IEnvironmentalReverb_SetReverbLevel,
IEnvironmentalReverb_GetReverbLevel,
IEnvironmentalReverb_SetReverbDelay,
IEnvironmentalReverb_GetReverbDelay,
IEnvironmentalReverb_SetDiffusion,
IEnvironmentalReverb_GetDiffusion,
IEnvironmentalReverb_SetDensity,
IEnvironmentalReverb_GetDensity,
IEnvironmentalReverb_SetEnvironmentalReverbProperties,
IEnvironmentalReverb_GetEnvironmentalReverbProperties
};
static const SLEnvironmentalReverbSettings IEnvironmentalReverb_default = {
SL_MILLIBEL_MIN, // roomLevel
0, // roomHFLevel
1000, // decayTime
500, // decayHFRatio
SL_MILLIBEL_MIN, // reflectionsLevel
20, // reflectionsDelay
SL_MILLIBEL_MIN, // reverbLevel
40, // reverbDelay
1000, // diffusion
1000 // density
};
void IEnvironmentalReverb_init(void *self)
{
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
thiz->mItf = &IEnvironmentalReverb_Itf;
thiz->mProperties = IEnvironmentalReverb_default;
#if defined(ANDROID)
memset(&thiz->mEnvironmentalReverbDescriptor, 0, sizeof(effect_descriptor_t));
// placement new (explicit constructor)
(void) new (&thiz->mEnvironmentalReverbEffect) android::sp<android::AudioEffect>();
#endif
}
void IEnvironmentalReverb_deinit(void *self)
{
#if defined(ANDROID)
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
// explicit destructor
thiz->mEnvironmentalReverbEffect.~sp();
#endif
}
bool IEnvironmentalReverb_Expose(void *self)
{
#if defined(ANDROID)
IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
if (!android_fx_initEffectDescriptor(SL_IID_ENVIRONMENTALREVERB,
&thiz->mEnvironmentalReverbDescriptor)) {
SL_LOGE("EnvironmentalReverb initialization failed.");
return false;
}
#endif
return true;
}