1fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent/* 217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Copyright (C) 2010 The Android Open Source Project 3fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 4fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * you may not use this file except in compliance with the License. 6fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * You may obtain a copy of the License at 7fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 8fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 10fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Unless required by applicable law or agreed to in writing, software 11fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * See the License for the specific language governing permissions and 14fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limitations under the License. 15fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 16fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 171a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentpackage android.media.audiofx; 18fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 191a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.AudioEffect; 20ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurentimport java.util.StringTokenizer; 21fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 22fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent/** 231a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * A sound generated within a room travels in many directions. The listener first hears the direct 241a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * sound from the source itself. Later, he or she hears discrete echoes caused by sound bouncing off 251a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * nearby walls, the ceiling and the floor. As sound waves arrive after undergoing more and more 261a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * reflections, individual reflections become indistinguishable and the listener hears continuous 271a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * reverberation that decays over time. 28fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Reverb is vital for modeling a listener's environment. It can be used in music applications 29fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * to simulate music being played back in various environments, or in games to immerse the 30fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * listener within the game's environment. 31fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The EnvironmentalReverb class allows an application to control each reverb engine property in a 32fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * global reverb environment and is more suitable for games. For basic control, more suitable for 33fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * music applications, it is recommended to use the 341a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.media.audiofx.PresetReverb} class. 35fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>An application creates a EnvironmentalReverb object to instantiate and control a reverb engine 36fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * in the audio framework. 37fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>The methods, parameter types and units exposed by the EnvironmentalReverb implementation are 38fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * directly mapping those defined by the OpenSL ES 1.0.1 Specification 39fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * (http://www.khronos.org/opensles/) for the SLEnvironmentalReverbItf interface. 40fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Please refer to this specification for more details. 41fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>The EnvironmentalReverb is an output mix auxiliary effect and should be created on 42fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Audio session 0. In order for a MediaPlayer or AudioTrack to be fed into this effect, 43fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * they must be explicitely attached to it and a send level must be specified. Use the effect ID 44fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * returned by getId() method to designate this particular effect when attaching it to the 45fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * MediaPlayer or AudioTrack. 461a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>Creating a reverb on the output mix (audio session 0) requires permission 471a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS} 481a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.audiofx.AudioEffect} class for more details on controlling 49fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * audio effects. 50fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 51fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 52fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpublic class EnvironmentalReverb extends AudioEffect { 53fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 54fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final static String TAG = "EnvironmentalReverb"; 55fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 56fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // These constants must be synchronized with those in 57fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // frameworks/base/include/media/EffectEnvironmentalReverbApi.h 58fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 59fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 6017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Room level. Parameter ID for OnParameterChangeListener 61fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 62fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_ROOM_LEVEL = 0; 63fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 64fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Room HF level. Parameter ID for OnParameterChangeListener 65fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 66fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_ROOM_HF_LEVEL = 1; 67fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 68fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Decay time. Parameter ID for OnParameterChangeListener 69fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 70fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_DECAY_TIME = 2; 71fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 7217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Decay HF ratio. Parameter ID for 731a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.media.audiofx.EnvironmentalReverb.OnParameterChangeListener} 74fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 75fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_DECAY_HF_RATIO = 3; 76fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 77fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Early reflections level. Parameter ID for OnParameterChangeListener 78fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 79fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_REFLECTIONS_LEVEL = 4; 80fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 81fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Early reflections delay. Parameter ID for OnParameterChangeListener 82fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 83fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_REFLECTIONS_DELAY = 5; 84fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 85fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Reverb level. Parameter ID for OnParameterChangeListener 86fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 87fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_REVERB_LEVEL = 6; 88fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 89fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Reverb delay. Parameter ID for OnParameterChangeListener 90fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 91fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_REVERB_DELAY = 7; 92fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 93fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Diffusion. Parameter ID for OnParameterChangeListener 94fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 95fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_DIFFUSION = 8; 96fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 97fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Density. Parameter ID for OnParameterChangeListener 98fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 99fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_DENSITY = 9; 100fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 101ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // used by setProperties()/getProperties 102ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private static final int PARAM_PROPERTIES = 10; 103ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 104fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 105fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registered listener for parameter changes 106fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 107fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private OnParameterChangeListener mParamListener = null; 108fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 109fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 110fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to to receive raw parameter change event from AudioEffect super 111fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * class 112fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 113fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener mBaseParamListener = null; 114fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 115fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 116fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Lock for access to mParamListener 117fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 118fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final Object mParamListenerLock = new Object(); 119fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 120fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 121fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Class constructor. 122fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param priority the priority level requested by the application for controlling the 123fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * EnvironmentalReverb engine. As the same engine can be shared by several applications, this 124fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter indicates how much the requesting application needs control of effect parameters. 125fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The normal priority is 0, above normal is a positive number, below normal a negative number. 12617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param audioSession system wide unique audio session identifier. If audioSession 127fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is not 0, the EnvironmentalReverb will be attached to the MediaPlayer or AudioTrack in the 128fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * same audio session. Otherwise, the EnvironmentalReverb will apply to the output mix. 129fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * As the EnvironmentalReverb is an auxiliary effect it is recommended to instantiate it on 130fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * audio session 0 and to attach it to the MediaPLayer auxiliary output. 131fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 132fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalArgumentException 133fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.UnsupportedOperationException 134fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.RuntimeException 135fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 136fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public EnvironmentalReverb(int priority, int audioSession) 137fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalArgumentException, UnsupportedOperationException, RuntimeException { 138fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super(EFFECT_TYPE_ENV_REVERB, EFFECT_TYPE_NULL, priority, audioSession); 139fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 140fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 141fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 142fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the master volume level of the environmental reverb effect. 14317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param room room level in millibels. The valid range is [-9000, 0]. 144fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 145fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 146fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 147fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 148fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setRoomLevel(short room) 149fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 150fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(room); 151fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_ROOM_LEVEL, param)); 152fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 153fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 154fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 155fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the master volume level of the environmental reverb effect. 156fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the room level in millibels. 157fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 158fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 159fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 160fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 161fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getRoomLevel() 162fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 163fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 164fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_ROOM_LEVEL, param)); 165fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 166fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 167fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 168fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 169fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the volume level at 5 kHz relative to the volume level at low frequencies of the 170fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * overall reverb effect. 171fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>This controls a low-pass filter that will reduce the level of the high-frequency. 17217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param roomHF high frequency attenuation level in millibels. The valid range is [-9000, 0]. 173fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 174fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 175fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 176fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 177fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setRoomHFLevel(short roomHF) 178fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 179fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(roomHF); 180fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_ROOM_HF_LEVEL, param)); 181fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 182fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 183fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 184fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the room HF level. 185fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the room HF level in millibels. 186fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 187fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 188fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 189fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 190fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getRoomHFLevel() 191fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 192fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 193fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_ROOM_HF_LEVEL, param)); 194fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 195fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 196fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 197fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 198fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the time taken for the level of reverberation to decay by 60 dB. 19917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param decayTime decay time in milliseconds. The valid range is [100, 20000]. 200fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 201fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 202fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 203fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 204fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setDecayTime(int decayTime) 205fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 206fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = intToByteArray(decayTime); 207fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_DECAY_TIME, param)); 208fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 209fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 210fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 211fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the decay time. 212fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the decay time in milliseconds. 213fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 214fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 215fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 216fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 217fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public int getDecayTime() 218fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 219fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[4]; 220fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_DECAY_TIME, param)); 221fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToInt(param); 222fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 223fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 224fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 225fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the ratio of high frequency decay time (at 5 kHz) relative to the decay time at low 226fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * frequencies. 22717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param decayHFRatio high frequency decay ratio using a permille scale. The valid range is 228fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [100, 2000]. A ratio of 1000 indicates that all frequencies decay at the same rate. 229fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 230fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 231fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 232fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 233fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setDecayHFRatio(short decayHFRatio) 234fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 235fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(decayHFRatio); 236fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_DECAY_HF_RATIO, param)); 237fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 238fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 239fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 240fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the ratio of high frequency decay time (at 5 kHz) relative to low frequencies. 241fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the decay HF ration. See {@link #setDecayHFRatio(short)} for units. 242fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 243fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 244fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 245fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 246fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getDecayHFRatio() 247fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 248fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 249fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_DECAY_HF_RATIO, param)); 250fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 251fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 252fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 253fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 254fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the volume level of the early reflections. 255fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>This level is combined with the overall room level 256fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * (set using {@link #setRoomLevel(short)}). 25717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param reflectionsLevel reflection level in millibels. The valid range is [-9000, 1000]. 258fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 259fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 260fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 261fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 262fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setReflectionsLevel(short reflectionsLevel) 263fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 264fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(reflectionsLevel); 265fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_REFLECTIONS_LEVEL, param)); 266fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 267fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 268fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 269fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the volume level of the early reflections. 270fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the early reflections level in millibels. 271fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 272fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 273fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 274fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 275fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getReflectionsLevel() 276fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 277fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 278fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_REFLECTIONS_LEVEL, param)); 279fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 280fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 281fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 282fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 283fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the delay time for the early reflections. 284fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>This method sets the time between when the direct path is heard and when the first 285fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * reflection is heard. 28617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param reflectionsDelay reflections delay in milliseconds. The valid range is [0, 300]. 287fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 288fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 289fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 290fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 291fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setReflectionsDelay(int reflectionsDelay) 292fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 293fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = intToByteArray(reflectionsDelay); 294fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_REFLECTIONS_DELAY, param)); 295fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 296fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 297fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 298fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the reflections delay. 299fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the early reflections delay in milliseconds. 300fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 301fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 302fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 303fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 304fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public int getReflectionsDelay() 305fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 306fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[4]; 307fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_REFLECTIONS_DELAY, param)); 308fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToInt(param); 309fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 310fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 311fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 312fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the volume level of the late reverberation. 313fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>This level is combined with the overall room level (set using {@link #setRoomLevel(short)}). 31417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param reverbLevel reverb level in millibels. The valid range is [-9000, 2000]. 315fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 316fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 317fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 318fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 319fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setReverbLevel(short reverbLevel) 320fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 321fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(reverbLevel); 322fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_REVERB_LEVEL, param)); 323fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 324fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 325fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 326fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the reverb level. 327fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the reverb level in millibels. 328fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 329fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 330fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 331fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 332fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getReverbLevel() 333fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 334fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 335fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_REVERB_LEVEL, param)); 336fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 337fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 338fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 339fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 340fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the time between the first reflection and the reverberation. 34117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param reverbDelay reverb delay in milliseconds. The valid range is [0, 100]. 342fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 343fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 344fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 345fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 346fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setReverbDelay(int reverbDelay) 347fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 348fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = intToByteArray(reverbDelay); 349fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_REVERB_DELAY, param)); 350fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 351fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 352fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 353fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the reverb delay. 354fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the reverb delay in milliseconds. 355fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 356fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 357fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 358fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 359fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public int getReverbDelay() 360fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 361fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[4]; 362fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_REVERB_DELAY, param)); 363fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToInt(param); 364fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 365fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 366fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 367fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the echo density in the late reverberation decay. 368fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>The scale should approximately map linearly to the perceived change in reverberation. 36917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param diffusion diffusion specified using a permille scale. The diffusion valid range is 370fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [0, 1000]. A value of 1000 o/oo indicates a smooth reverberation decay. 371fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Values below this level give a more <i>grainy</i> character. 372fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 373fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 374fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 375fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 376fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setDiffusion(short diffusion) 377fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 378fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(diffusion); 379fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_DIFFUSION, param)); 380fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 381fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 382fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 383fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets diffusion level. 384fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the diffusion level. See {@link #setDiffusion(short)} for units. 385fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 386fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 387fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 388fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 389fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getDiffusion() 390fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 391fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 392fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_DIFFUSION, param)); 393fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 394fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 395fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 396fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 397fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 398fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Controls the modal density of the late reverberation decay. 399fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p> The scale should approximately map linearly to the perceived change in reverberation. 400fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * A lower density creates a hollow sound that is useful for simulating small reverberation 401fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * spaces such as bathrooms. 40217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param density density specified using a permille scale. The valid range is [0, 1000]. 403fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * A value of 1000 o/oo indicates a natural sounding reverberation. Values below this level 404fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * produce a more colored effect. 405fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 406fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 407fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 408fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 409fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setDensity(short density) 410fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 411fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = shortToByteArray(density); 412fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_DENSITY, param)); 413fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 414fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 415fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 416fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the density level. 417fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the density level. See {@link #setDiffusion(short)} for units. 418fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 419fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 420fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 421fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 422fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getDensity() 423fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 424fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] param = new byte[2]; 425fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(PARAM_DENSITY, param)); 426fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return byteArrayToShort(param); 427fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 428fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 429fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 430fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 431fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The OnParameterChangeListener interface defines a method called by the EnvironmentalReverb 432fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * when a parameter value has changed. 433fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 434fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public interface OnParameterChangeListener { 435fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 436fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Method called when a parameter value has changed. The method is called only if the 437fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter was changed by another application having the control of the same 438fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * EnvironmentalReverb engine. 439fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param effect the EnvironmentalReverb on which the interface is registered. 440fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param status status of the set parameter operation. 441fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param ID of the modified parameter. See {@link #PARAM_ROOM_LEVEL} ... 442fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param value the new parameter value. 443fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 444fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent void onParameterChange(EnvironmentalReverb effect, int status, int param, int value); 445fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 446fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 447fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 448fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to receive unformatted parameter change events from AudioEffect 449fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * super class. 450fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 451fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 452fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener() { 453fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 454fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 455fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 456fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent OnParameterChangeListener l = null; 457fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 458fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 459fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener != null) { 460fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l = mParamListener; 461fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 462fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 463fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (l != null) { 464fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p = -1; 465fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int v = -1; 466fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 467fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length == 4) { 468fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p = byteArrayToInt(param, 0); 469fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 470fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (value.length == 2) { 471fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = (int)byteArrayToShort(value, 0); 472fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else if (value.length == 4) { 473fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = byteArrayToInt(value, 0); 474fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 475fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (p != -1 && v != -1) { 476fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l.onParameterChange(EnvironmentalReverb.this, status, p, v); 477fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 478fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 479fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 480fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 481fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 482fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 483fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registers an OnParameterChangeListener interface. 484fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param listener OnParameterChangeListener interface registered 485fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 486fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setParameterListener(OnParameterChangeListener listener) { 487fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 488fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener == null) { 489fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mParamListener = listener; 490fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mBaseParamListener = new BaseParameterListener(); 491fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super.setParameterListener(mBaseParamListener); 492fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 493fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 494fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 495ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 496ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 497ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * The Settings class regroups all environmental reverb parameters. It is used in 498ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * conjuntion with getProperties() and setProperties() methods to backup and restore 499ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * all parameters in a single call. 500ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 501ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public static class Settings { 502ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short roomLevel; 503ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short roomHFLevel; 504ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public int decayTime; 505ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short decayHFRatio; 506ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short reflectionsLevel; 507ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public int reflectionsDelay; 508ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short reverbLevel; 509ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public int reverbDelay; 510ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short diffusion; 511ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short density; 512ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 513ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings() { 514ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 515ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 516ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 517ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Settings class constructor from a key=value; pairs formatted string. The string is 518ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * typically returned by Settings.toString() method. 519ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException if the string is not correctly formatted. 520ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 521ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings(String settings) { 522ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent StringTokenizer st = new StringTokenizer(settings, "=;"); 523ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent int tokens = st.countTokens(); 524ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() != 21) { 525ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 526ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 527ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String key = st.nextToken(); 528ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("EnvironmentalReverb")) { 529ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException( 530ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "invalid settings for EnvironmentalReverb: " + key); 531ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 532ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 533ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent try { 534ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 535ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("roomLevel")) { 536ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 537ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 538ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent roomLevel = Short.parseShort(st.nextToken()); 539ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 540ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("roomHFLevel")) { 541ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 542ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 543ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent roomHFLevel = Short.parseShort(st.nextToken()); 544ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 545ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("decayTime")) { 546ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 547ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 548ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent decayTime = Integer.parseInt(st.nextToken()); 549ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 550ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("decayHFRatio")) { 551ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 552ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 553ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent decayHFRatio = Short.parseShort(st.nextToken()); 554ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 555ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("reflectionsLevel")) { 556ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 557ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 558ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent reflectionsLevel = Short.parseShort(st.nextToken()); 559ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 560ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("reflectionsDelay")) { 561ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 562ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 563ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent reflectionsDelay = Integer.parseInt(st.nextToken()); 564ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 565ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("reverbLevel")) { 566ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 567ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 568ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent reverbLevel = Short.parseShort(st.nextToken()); 569ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 570ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("reverbDelay")) { 571ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 572ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 573ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent reverbDelay = Integer.parseInt(st.nextToken()); 574ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 575ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("diffusion")) { 576ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 577ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 578ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent diffusion = Short.parseShort(st.nextToken()); 579ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 580ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("density")) { 581ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 582ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 583ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent density = Short.parseShort(st.nextToken()); 584ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } catch (NumberFormatException nfe) { 585ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid value for key: " + key); 586ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 587ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 588ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 589ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent @Override 590ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public String toString() { 591ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return new String ( 592ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "EnvironmentalReverb"+ 593ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";roomLevel="+Short.toString(roomLevel)+ 594ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";roomHFLevel="+Short.toString(roomHFLevel)+ 595ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";decayTime="+Integer.toString(decayTime)+ 596ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";decayHFRatio="+Short.toString(decayHFRatio)+ 597ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";reflectionsLevel="+Short.toString(reflectionsLevel)+ 598ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";reflectionsDelay="+Integer.toString(reflectionsDelay)+ 599ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";reverbLevel="+Short.toString(reverbLevel)+ 600ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";reverbDelay="+Integer.toString(reverbDelay)+ 601ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";diffusion="+Short.toString(diffusion)+ 602ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";density="+Short.toString(density) 603ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ); 604ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 605ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent }; 606ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 607ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // Keep this in sync with sizeof(s_reverb_settings) defined in 608ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // frameworks/base/include/media/EffectEnvironmentalReverbApi.h 609ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent static private int PROPERTY_SIZE = 26; 610ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 611ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 612ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Gets the environmental reverb properties. This method is useful when a snapshot of current 613ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * reverb settings must be saved by the application. 614ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @return an EnvironmentalReverb.Settings object containing all current parameters values 615ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 616ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 617ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 618ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 619ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public EnvironmentalReverb.Settings getProperties() 620ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 621ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = new byte[PROPERTY_SIZE]; 622ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(getParameter(PARAM_PROPERTIES, param)); 623ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent Settings settings = new Settings(); 624ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.roomLevel = byteArrayToShort(param, 0); 625ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.roomHFLevel = byteArrayToShort(param, 2); 626ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.decayTime = byteArrayToInt(param, 4); 627ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.decayHFRatio = byteArrayToShort(param, 8); 628ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.reflectionsLevel = byteArrayToShort(param, 10); 629ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.reflectionsDelay = byteArrayToInt(param, 12); 630ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.reverbLevel = byteArrayToShort(param, 16); 631ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.reverbDelay = byteArrayToInt(param, 18); 632ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.diffusion = byteArrayToShort(param, 22); 633ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.density = byteArrayToShort(param, 24); 634ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return settings; 635ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 636ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 637ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 638ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Sets the environmental reverb properties. This method is useful when reverb settings have to 639ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * be applied from a previous backup. 64017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param settings a EnvironmentalReverb.Settings object containing the properties to apply 641ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 642ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 643ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 644ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 645ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public void setProperties(EnvironmentalReverb.Settings settings) 646ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 647ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 648ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = concatArrays(shortToByteArray(settings.roomLevel), 649ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.roomHFLevel), 650ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent intToByteArray(settings.decayTime), 651ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.decayHFRatio), 652ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.reflectionsLevel), 653ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent intToByteArray(settings.reflectionsDelay), 654ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.reverbLevel), 655ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent intToByteArray(settings.reverbDelay), 656ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.diffusion), 657ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.density)); 658ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 659ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(setParameter(PARAM_PROPERTIES, param)); 660ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 661fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent} 662