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