IEnvironmentalReverb.c revision faf90312d2156acbf27c62e114fd180708aa7654
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* EnvironmentalReverb implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// Note: all Set operations use exclusive not poke, 22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// because SetEnvironmentalReverbProperties is exclusive. 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// It is safe for the Get operations to use peek, 24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// on the assumption that the block copy will atomically 25a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// replace each word of the block. 26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 28faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 29f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi/** 30f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi * returns true if this interface is not associated with an initialized EnvironmentalReverb effect 31f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi */ 32f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivistatic inline bool NO_ENVREVERB(IEnvironmentalReverb* ier) { 33f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi return (ier->mEnvironmentalReverbEffect == 0); 34f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi} 35f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 36f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 37f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 38d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel room) 39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= room && room <= 0)) { 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.roomLevel = room; 48faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 50f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 51f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 52f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 53f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 54f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 55f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_ROOM_LEVEL, &room); 56f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 57f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 58f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 59f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 66d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel *pRoom) 67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pRoom) { 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 75faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 77f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 78f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 79f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 80f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 81f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 82f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_ROOM_LEVEL, &this->mProperties.roomLevel); 83f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 84f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 85f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 86f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pRoom = this->mProperties.roomLevel; 87f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 88f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 89f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomHFLevel( 97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel roomHF) 98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= roomHF && roomHF <= 0)) { 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.roomHFLevel = roomHF; 107faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 109f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 110f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 111f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 112f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 113f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 114f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_ROOM_HF_LEVEL, &roomHF); 115f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 116f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 117f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 118f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomHFLevel( 126a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel *pRoomHF) 127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pRoomHF) { 131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 135faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 137f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 138f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 139f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 140f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 141f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 142f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_ROOM_HF_LEVEL, &this->mProperties.roomHFLevel); 143f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 144f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 145f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 146f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pRoomHF = this->mProperties.roomHFLevel; 147f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 148f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 152a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 153a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 155a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayTime( 156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond decayTime) 157a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(100 <= decayTime && decayTime <= 20000)) { 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 164ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.decayTime = decayTime; 166faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 168f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 169f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 170f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 171f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 172f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 173f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DECAY_TIME, &decayTime); 174f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 175f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 176f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 177f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayTime( 185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond *pDecayTime) 186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 189ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDecayTime) { 190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 193ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 194faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 196f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 197f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 198f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 199f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 200f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 201f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DECAY_TIME, &this->mProperties.decayTime); 202f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 203f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 204f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 205f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pDecayTime = this->mProperties.decayTime; 206f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 207f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 208ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 210ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 211a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 212a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 213ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayHFRatio( 215a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLpermille decayHFRatio) 216a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 217ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 218ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 219ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(100 <= decayHFRatio && decayHFRatio <= 2000)) { 220ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 221ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 224ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.decayHFRatio = decayHFRatio; 225faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 226ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 227f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 228f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 229f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 230f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 231f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 232f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DECAY_HF_RATIO, &decayHFRatio); 233f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 234f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 235f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 236f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 237ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 239ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 240a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 241a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 243a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayHFRatio( 244a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLpermille *pDecayHFRatio) 245a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 247ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 248ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDecayHFRatio) { 249ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 250ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 252ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 253faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 255f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 256f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 257f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 258f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 259f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 260f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DECAY_HF_RATIO, &this->mProperties.decayHFRatio); 261f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 262f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 263f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 264f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pDecayHFRatio = this->mProperties.decayHFRatio; 265f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 266f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 267ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 268ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 269ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 270a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 271a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 272ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 273a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsLevel( 274a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel reflectionsLevel) 275a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 277ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= reflectionsLevel && reflectionsLevel <= 1000)) { 279ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 280ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 282ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.reflectionsLevel = reflectionsLevel; 284faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 285ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 286f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 287f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 288f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 289f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 290f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 291f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REFLECTIONS_LEVEL, &reflectionsLevel); 292f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 293f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 294f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 295f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 296ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 297ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 298ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 299a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 300a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 301ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 302a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsLevel( 303a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel *pReflectionsLevel) 304a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 305ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 306ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 307ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pReflectionsLevel) { 308ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 309ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 310ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 311ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 312faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 313ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 314f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 315f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 316f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 317f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 318f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 319f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REFLECTIONS_LEVEL, &this->mProperties.reflectionsLevel); 320f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 321f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 322f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 323f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pReflectionsLevel = this->mProperties.reflectionsLevel; 324f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 325f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 326ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 327ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 328ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 329a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 330a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 331ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 332a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsDelay( 333a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond reflectionsDelay) 334a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 335ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 336ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 337ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(/* 0 <= reflectionsDelay && */ reflectionsDelay <= 300)) { 338ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 339ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 340ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 341ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 342ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.reflectionsDelay = reflectionsDelay; 343faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 344ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 345f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 346f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 347f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 348f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 349f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 350f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REFLECTIONS_DELAY, &reflectionsDelay); 351f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 352f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 353f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 354f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 355ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 356ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 357ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 358a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 359a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 360ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 361a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsDelay( 362a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond *pReflectionsDelay) 363a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 364ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 365ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 366ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pReflectionsDelay) { 367ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 368ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 369ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 370ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 371faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 372ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 373f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 374f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 375f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 376f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 377f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 378f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REFLECTIONS_DELAY, &this->mProperties.reflectionsDelay); 379f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 380f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 381f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 382f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pReflectionsDelay = this->mProperties.reflectionsDelay; 383f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 384f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 385ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 386ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 387ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 388a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 389a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 390ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 391a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbLevel( 392a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel reverbLevel) 393a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 394ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 395ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 396ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= reverbLevel && reverbLevel <= 2000)) { 397ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 398ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 399ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 400ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 401ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.reverbLevel = reverbLevel; 402faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 403ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 404f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 405f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 406f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 407f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 408f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 409f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REVERB_LEVEL, &reverbLevel); 410f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 411f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 412f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 413f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 414ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 415ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 416ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 417a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 418a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 419ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 420a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbLevel( 421a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillibel *pReverbLevel) 422a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 423ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 424ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 425ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pReverbLevel) { 426ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 427ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 428ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 429ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 430faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 431ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 432f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 433f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 434f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 435f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 436f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 437f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REVERB_LEVEL, &this->mProperties.reverbLevel); 438f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 439f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 440f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 441f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pReverbLevel = this->mProperties.reverbLevel; 442f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 443f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 444ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 445ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 446ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 447a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 448a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 449ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 450a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbDelay( 451a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond reverbDelay) 452a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 453ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 454ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 455ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(/* 0 <= reverbDelay && */ reverbDelay <= 100)) { 456ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 457ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 458ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 459ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 460ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.reverbDelay = reverbDelay; 461faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 462ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 463f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 464f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 465f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 466f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 467f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 468f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REVERB_DELAY, &reverbDelay); 469f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 470f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 471f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 472f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 473ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 474ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 475ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 476a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 477a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 478ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 479a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbDelay( 480a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLmillisecond *pReverbDelay) 481a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 482ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 483ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 484ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pReverbDelay) { 485ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 486ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 487ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 488ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 489faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 490ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 491f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 492f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 493f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 494f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 495f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 496f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_REVERB_DELAY, &this->mProperties.reverbDelay); 497f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 498f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 499f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 500f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pReverbDelay = this->mProperties.reverbDelay; 501f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 502f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 503ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 504ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 505ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 506a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 507a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 508ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 509a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDiffusion( 510a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLpermille diffusion) 511a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 512ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 513ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 514ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= diffusion && diffusion <= 1000)) { 515ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 516ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 517ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 518ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 519ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties.diffusion = diffusion; 520faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 521ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 522f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 523f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 524f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 525f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 526f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 527f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DIFFUSION, &diffusion); 528f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 529f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 530f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 531f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 532ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 533ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 534ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 535a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 536a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 537ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 538a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDiffusion(SLEnvironmentalReverbItf self, 539a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLpermille *pDiffusion) 540a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 541ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 542ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 543ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDiffusion) { 544ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 545ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 546ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 547ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 548faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 549ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 550f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 551f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 552f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 553f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 554f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 555f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DIFFUSION, &this->mProperties.diffusion); 556f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 557f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 558f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 559f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pDiffusion = this->mProperties.diffusion; 560f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 561f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 562ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 563ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 564ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 565a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 566a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 567ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 568a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDensity(SLEnvironmentalReverbItf self, 569a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLpermille density) 570a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 571ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 572ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 573ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= density && density <= 1000)) { 574ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 575ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 576ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 577ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 578faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 579f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_SUCCESS; 580f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 581f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 582f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 583f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 584f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 585f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DENSITY, &density); 586f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 587f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 588f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 589ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive(this); 590ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 591ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 592ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 593a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 594a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 595ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 596a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDensity(SLEnvironmentalReverbItf self, 597a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLpermille *pDensity) 598a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 599ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 600ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 601ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDensity) { 602ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 603ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 604ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 605ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 606faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 607ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 608f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 609f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 610f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 611f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 612f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 613f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_DENSITY, &this->mProperties.density); 614f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 615f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 616f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 617f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pDensity = this->mProperties.density; 618f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 619f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_peek(this); 620ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 621ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 622ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 623a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 624a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 625ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 626d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_SetEnvironmentalReverbProperties(SLEnvironmentalReverbItf self, 627a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten const SLEnvironmentalReverbSettings *pProperties) 628a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 629ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 630ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 631ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 632ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten do { 633ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pProperties) 634ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 635ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLEnvironmentalReverbSettings properties = *pProperties; 636ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= properties.roomLevel && properties.roomLevel <= 0)) 637ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 638ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= properties.roomHFLevel && properties.roomHFLevel <= 0)) 639ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 640ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(100 <= properties.decayTime && properties.decayTime <= 20000)) 641ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 642ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(100 <= properties.decayHFRatio && properties.decayHFRatio <= 2000)) 643ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 644ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= properties.reflectionsLevel && 645ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten properties.reflectionsLevel <= 1000)) 646ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 647ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(/* 0 <= properties.reflectionsDelay && */ properties.reflectionsDelay <= 300)) 648ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 649ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(SL_MILLIBEL_MIN <= properties.reverbLevel && properties.reverbLevel <= 2000)) 650ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 651ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(/* 0 <= properties.reverbDelay && */ properties.reverbDelay <= 100)) 652ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 653ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= properties.diffusion && properties.diffusion <= 1000)) 654ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 655ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= properties.density && properties.density <= 1000)) 656ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 657ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 658ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 659ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mProperties = properties; 660faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 661ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 662f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 663f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 664f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 665f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 666f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_setParam(this->mEnvironmentalReverbEffect, 667f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_PROPERTIES, &properties); 668f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 669f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 670f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 671f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi interface_unlock_exclusive(this); 672ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } while (0); 673ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 674ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 675a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 676a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 677ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 678a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetEnvironmentalReverbProperties( 679a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLEnvironmentalReverbItf self, SLEnvironmentalReverbSettings *pProperties) 680a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 681ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 682ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 683ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pProperties) { 684ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 685ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 686ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 687ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_shared(this); 688faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 689ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 690f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else 691f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (NO_ENVREVERB(this)) { 692f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 693f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } else { 694f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi android::status_t status = android_erev_getParam(this->mEnvironmentalReverbEffect, 695f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi REVERB_PARAM_PROPERTIES, &this->mProperties); 696f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi result = android_fx_statusToResult(status); 697f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 698f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 699f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi *pProperties = this->mProperties; 700f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 7019e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten interface_unlock_shared(this); 702ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 703ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 704ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 705a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 706a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 707ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 708a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLEnvironmentalReverbItf_ IEnvironmentalReverb_Itf = { 709a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetRoomLevel, 710a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetRoomLevel, 711a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetRoomHFLevel, 712a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetRoomHFLevel, 713a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetDecayTime, 714a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetDecayTime, 715a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetDecayHFRatio, 716a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetDecayHFRatio, 717a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetReflectionsLevel, 718a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetReflectionsLevel, 719a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetReflectionsDelay, 720a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetReflectionsDelay, 721a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetReverbLevel, 722a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetReverbLevel, 723a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetReverbDelay, 724a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetReverbDelay, 725a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetDiffusion, 726a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetDiffusion, 727a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetDensity, 728a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetDensity, 729a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_SetEnvironmentalReverbProperties, 730a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb_GetEnvironmentalReverbProperties 731a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 732a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 733a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLEnvironmentalReverbSettings IEnvironmentalReverb_default = { 734a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SL_MILLIBEL_MIN, // roomLevel 735a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 0, // roomHFLevel 736a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 1000, // decayTime 737a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 500, // decayHFRatio 738a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SL_MILLIBEL_MIN, // reflectionsLevel 739a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 20, // reflectionsDelay 740a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SL_MILLIBEL_MIN, // reverbLevel 741a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 40, // reverbDelay 742a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 1000, // diffusion 743a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 1000 // density 744a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 745a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 746a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IEnvironmentalReverb_init(void *self) 747a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 748a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 749a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mItf = &IEnvironmentalReverb_Itf; 750a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mProperties = IEnvironmentalReverb_default; 751faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 752a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten memset(&this->mEnvironmentalReverbDescriptor, 0, sizeof(effect_descriptor_t)); 753a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // placement new (explicit constructor) 754a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten (void) new (&this->mEnvironmentalReverbEffect) android::sp<android::AudioEffect>(); 755a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 756a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 757f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi 758a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IEnvironmentalReverb_deinit(void *self) 759a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 760faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 761a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 762a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // explicit destructor 763a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mEnvironmentalReverbEffect.~sp(); 764a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 765a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 766a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 767a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IEnvironmentalReverb_Expose(void *self) 768a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 769faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 770a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten IEnvironmentalReverb *this = (IEnvironmentalReverb *) self; 771f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi if (!android_fx_initEffectDescriptor(SL_IID_ENVIRONMENTALREVERB, 772f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi &this->mEnvironmentalReverbDescriptor)) { 773f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi SL_LOGE("EnvironmentalReverb initialization failed."); 774a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return false; 775f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi } 776f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif 777a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return true; 778a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 779