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