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