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