Equalizer.java revision 1a5149e5d7f2dddc8b324f7695e69fd89af73c52
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; 28fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentimport java.nio.CharBuffer; 29ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurentimport java.util.StringTokenizer; 30fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 31fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 32fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent/** 33fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * An Equalizer is used to alter the frequency response of a particular music source or of the main 34fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * output mix. 35fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>An application creates an Equalizer object to instantiate and control an Equalizer engine 36fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * in the audio framework. The application can either simply use predefined presets or have a more 37fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * precise control of the gain in each frequency band controlled by the equalizer. 38fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>The methods, parameter types and units exposed by the Equalizer implementation are directly 39fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * mapping those defined by the OpenSL ES 1.0.1 Specification (http://www.khronos.org/opensles/) 40fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * for the SLEqualizerItf interface. Please refer to this specification for more details. 41fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>To attach the Equalizer to a particular AudioTrack or MediaPlayer, specify the audio session 42fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * ID of this AudioTrack or MediaPlayer when constructing the Equalizer. If the audio session ID 0 43fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is specified, the Equalizer applies to the main audio output mix. 441a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>Creating an Equalizer on the output mix (audio session 0) requires permission 451a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS} 461a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.MediaPlayer#getAudioSessionId()} for details on audio sessions. 471a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.audiofx.AudioEffect} class for more details on controlling audio 481a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * effects. 49fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 50fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 51fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpublic class Equalizer extends AudioEffect { 52fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 53fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final static String TAG = "Equalizer"; 54fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 55fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // These constants must be synchronized with those in 56fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // frameworks/base/include/media/EffectEqualizerApi.h 57fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 5817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Number of bands. Parameter ID for OnParameterChangeListener 59fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 60fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_NUM_BANDS = 0; 61fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 62fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level range. Parameter ID for OnParameterChangeListener 63fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 64fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_LEVEL_RANGE = 1; 65fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 66fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level. Parameter ID for OnParameterChangeListener 67fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 68fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_LEVEL = 2; 69fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 70fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band center frequency. Parameter ID for OnParameterChangeListener 71fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 72fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CENTER_FREQ = 3; 73fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 7417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Band frequency range. Parameter ID for 751a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.media.audiofx.Equalizer.OnParameterChangeListener} 76fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 77fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_FREQ_RANGE = 4; 78fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 79fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band for a given frequency. Parameter ID for OnParameterChangeListener 8017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * 81fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 82fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_BAND = 5; 83fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 84fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Current preset. Parameter ID for OnParameterChangeListener 85fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 86fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CURRENT_PRESET = 6; 87fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 88fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request number of presets. Parameter ID for OnParameterChangeListener 89fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 90fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_NUM_OF_PRESETS = 7; 91fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 92fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request preset name. Parameter ID for OnParameterChangeListener 93fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 94fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_PRESET_NAME = 8; 95ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // used by setProperties()/getProperties 96ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private static final int PARAM_PROPERTIES = 9; 97fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 9817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Maximum size for preset name 99fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 100fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_STRING_SIZE_MAX = 32; 101fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 102fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 103ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Number of bands implemented by Equalizer engine 104ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 105ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private short mNumBands = 0; 106ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 107ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 108fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Number of presets implemented by Equalizer engine 109fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 110fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private int mNumPresets; 111fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 112fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Names of presets implemented by Equalizer engine 113fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 114fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private String[] mPresetNames; 115fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 116fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 117fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registered listener for parameter changes. 118fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 119fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private OnParameterChangeListener mParamListener = null; 120fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 121fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 122fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to to receive raw parameter change event from AudioEffect super class 123fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 124fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener mBaseParamListener = null; 125fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 126fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 127fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Lock for access to mParamListener 128fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 129fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final Object mParamListenerLock = new Object(); 130fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 131fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 132fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Class constructor. 133fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param priority the priority level requested by the application for controlling the Equalizer 134fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * engine. As the same engine can be shared by several applications, this parameter indicates 135fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * how much the requesting application needs control of effect parameters. The normal priority 136fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is 0, above normal is a positive number, below normal a negative number. 13717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param audioSession system wide unique audio session identifier. If audioSession 138fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is not 0, the Equalizer will be attached to the MediaPlayer or AudioTrack in the 139fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * same audio session. Otherwise, the Equalizer will apply to the output mix. 140fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 141fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalStateException 142fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalArgumentException 143fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.UnsupportedOperationException 144fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.RuntimeException 145fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 146fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public Equalizer(int priority, int audioSession) 147fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, 148fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent UnsupportedOperationException, RuntimeException { 149fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super(EFFECT_TYPE_EQUALIZER, EFFECT_TYPE_NULL, priority, audioSession); 150fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 151ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent getNumberOfBands(); 152ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 153fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mNumPresets = (int)getNumberOfPresets(); 154fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 155fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mNumPresets != 0) { 156fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames = new String[mNumPresets]; 157fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] value = new byte[PARAM_STRING_SIZE_MAX]; 158fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 159fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_PRESET_NAME; 160fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent for (int i = 0; i < mNumPresets; i++) { 161fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = i; 162fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, value)); 163fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int length = 0; 164fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent while (value[length] != 0) length++; 165fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent try { 166fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames[i] = new String(value, 0, length, "ISO-8859-1"); 167fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } catch (java.io.UnsupportedEncodingException e) { 168fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent Log.e(TAG, "preset name decode error"); 169fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 170fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 171fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 172fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 173fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 174fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 175fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the number of frequency bands supported by the Equalizer engine. 176fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the number of bands 177fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 178fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 179fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 180fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 181fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfBands() 182fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 183ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (mNumBands != 0) { 184ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 185ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 186fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[1]; 187fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_NUM_BANDS; 18892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 18992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(param, result)); 19092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent mNumBands = result[0]; 191ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 192fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 193fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 194fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 19517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Gets the level range for use by {@link #setBandLevel(short,short)}. The level is expressed in 196fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * milliBel. 197fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the band level range in an array of short integers. The first element is the lower 198fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limit of the range, the second element the upper limit. 199fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 200fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 201fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 202fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 203fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short[] getBandLevelRange() 204fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 205fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent short[] result = new short[2]; 20692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_LEVEL_RANGE, result)); 207fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 208fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 209fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 210fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 211fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the given equalizer band to the given gain value. 21217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band that will have the new gain. The numbering of the bands starts 21317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * from 0 and ends at (number of bands - 1). 21417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param level new gain in millibels that will be set to the given band. getBandLevelRange() 215fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * will define the maximum and minimum values. 216fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 217fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 218fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 21917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfBands() 220fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 22192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public void setBandLevel(short band, short level) 222fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 223fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 22492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] value = new short[1]; 225fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 226fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 22792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 22892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent value[0] = level; 229fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(param, value)); 230fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 231fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 232fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 233fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the gain set for the given equalizer band. 23417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose gain is requested. The numbering of the bands starts 235fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * from 0 and ends at (number of bands - 1). 23617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the gain in millibels of the given band. 237fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 238fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 239fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 240fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 24192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBandLevel(short band) 242fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 243fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 24492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 245fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 246fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 24792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 248fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 249fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 25092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 251fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 252fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 253fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 254fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 255fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the center frequency of the given band. 25617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose center frequency is requested. The numbering of the bands 257fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 25817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the center frequency in milliHertz 259fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 260fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 261fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 262fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 26392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int getCenterFreq(short band) 264fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 265fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 266fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[1]; 267fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 268fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_CENTER_FREQ; 26992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 270fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 271fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 272fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 273fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 274fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 275fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 276fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the frequency range of the given frequency band. 27717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose frequency range is requested. The numbering of the bands 278fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 27917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency range in millHertz in an array of integers. The first element is the 280fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * lower limit of the range, the second element the upper limit. 281fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 282fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 283fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 284fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 28592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int[] getBandFreqRange(short band) 286fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 287fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 288fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[2]; 289fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_FREQ_RANGE; 29092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 291fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 292fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 293fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 294fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 295fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 296fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 297fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the band that has the most effect on the given frequency. 29817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param frequency frequency in milliHertz which is to be equalized via the returned band. 29917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency band that has most effect on the given frequency. 300fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 301fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 302fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 303fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 30492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBand(int frequency) 305fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 306fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 30792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 308fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 309fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_BAND; 310fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = frequency; 311fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 312fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 313fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 314fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 315fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 316fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 317fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets current preset. 31817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the preset that is set at the moment. 319fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 320fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 321fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 322fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 323fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getCurrentPreset() 324fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 32592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 32692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_CURRENT_PRESET, result)); 32792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 328fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 329fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 330fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 331fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the equalizer according to the given preset. 33217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset new preset that will be taken into use. The valid range is [0, 33317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * number of presets-1]. 334fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 335fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 336fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 33717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfPresets() 338fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 339fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void usePreset(short preset) 340fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 341fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_CURRENT_PRESET, preset)); 342fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 343fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 344fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 345fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the total number of presets the equalizer supports. The presets will have indices 346fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [0, number of presets-1]. 34717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the number of presets the equalizer supports. 348fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 349fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 350fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 351fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 352fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfPresets() 353fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 35492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 35592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_GET_NUM_OF_PRESETS, result)); 35692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 357fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 358fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 359fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 360fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the preset name based on the index. 36117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset index of the preset. The valid range is [0, number of presets-1]. 36217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return a string containing the name of the given preset. 363fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 364fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 365fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 366fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 367fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public String getPresetName(short preset) 368fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent { 369fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (preset >= 0 && preset < mNumPresets) { 370fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return mPresetNames[preset]; 371fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else { 372fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return ""; 373fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 374fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 375fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 376fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 377fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The OnParameterChangeListener interface defines a method called by the Equalizer when a 378fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter value has changed. 379fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 380fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public interface OnParameterChangeListener { 381fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 382fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Method called when a parameter value has changed. The method is called only if the 383fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter was changed by another application having the control of the same 384fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Equalizer engine. 385fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param effect the Equalizer on which the interface is registered. 386fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param status status of the set parameter operation. 387fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param1 ID of the modified parameter. See {@link #PARAM_BAND_LEVEL} ... 388fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param2 additional parameter qualifier (e.g the band for band level parameter). 389fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param value the new parameter value. 390fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 391fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent void onParameterChange(Equalizer effect, int status, int param1, int param2, int value); 392fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 393fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 394fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 395fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to receive unformatted parameter change events from AudioEffect 396fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * super class. 397fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 398fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 399fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener() { 400fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 401fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 402fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 403fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent OnParameterChangeListener l = null; 404fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 405fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 406fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener != null) { 407fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l = mParamListener; 408fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 409fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 410fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (l != null) { 411fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p1 = -1; 412fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p2 = -1; 413fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int v = -1; 414fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 415fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 4) { 416fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p1 = byteArrayToInt(param, 0); 417fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 8) { 418fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p2 = byteArrayToInt(param, 4); 419fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 420fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 421fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (value.length == 2) { 422fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = (int)byteArrayToShort(value, 0);; 423fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else if (value.length == 4) { 424fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = byteArrayToInt(value, 0); 425fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 426fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 427fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (p1 != -1 && v != -1) { 428fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l.onParameterChange(Equalizer.this, status, p1, p2, v); 429fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 430fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 431fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 432fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 433fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 434fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 435fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registers an OnParameterChangeListener interface. 436fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param listener OnParameterChangeListener interface registered 437fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 438fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setParameterListener(OnParameterChangeListener listener) { 439fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 440fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener == null) { 441fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mParamListener = listener; 442fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mBaseParamListener = new BaseParameterListener(); 443fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super.setParameterListener(mBaseParamListener); 444fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 445fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 446fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 447fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 448ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 449ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * The Settings class regroups all equalizer parameters. It is used in 450ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * conjuntion with getProperties() and setProperties() methods to backup and restore 451ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * all parameters in a single call. 452ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 453ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public static class Settings { 454ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short curPreset; 455ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short numBands = 0; 456ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short[] bandLevels = null; 457ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 458ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings() { 459ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 460ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 461ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 462ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Settings class constructor from a key=value; pairs formatted string. The string is 463ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * typically returned by Settings.toString() method. 464ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException if the string is not correctly formatted. 465ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 466ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings(String settings) { 467ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent StringTokenizer st = new StringTokenizer(settings, "=;"); 468ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent int tokens = st.countTokens(); 469ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() < 5) { 470ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 471ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 472ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String key = st.nextToken(); 473ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("Equalizer")) { 474ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException( 475ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "invalid settings for Equalizer: " + key); 476ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 477ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent try { 478ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 479ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("curPreset")) { 480ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 481ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 482ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent curPreset = Short.parseShort(st.nextToken()); 483ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 484ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("numBands")) { 485ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 486ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 487ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent numBands = Short.parseShort(st.nextToken()); 488ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() != numBands*2) { 489ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 490ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 491ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels = new short[numBands]; 492ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 493ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 494ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("band"+(i+1)+"Level")) { 495ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 496ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 497ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels[i] = Short.parseShort(st.nextToken()); 498ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 499ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } catch (NumberFormatException nfe) { 500ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid value for key: " + key); 501ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 502ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 503ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 504ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent @Override 505ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public String toString() { 506ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 507ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String str = new String ( 508ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "Equalizer"+ 509ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";curPreset="+Short.toString(curPreset)+ 510ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";numBands="+Short.toString(numBands) 511ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ); 512ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 513ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent str = str.concat(";band"+(i+1)+"Level="+Short.toString(bandLevels[i])); 514ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 515ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return str; 516ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 517ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent }; 518ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 519ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 520ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 521ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Gets the equalizer properties. This method is useful when a snapshot of current 522ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * equalizer settings must be saved by the application. 523ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @return an Equalizer.Settings object containing all current parameters values 524ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 525ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 526ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 527ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 528ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Equalizer.Settings getProperties() 529ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 530ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = new byte[4 + mNumBands * 2]; 531ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(getParameter(PARAM_PROPERTIES, param)); 532ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent Settings settings = new Settings(); 533ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.curPreset = byteArrayToShort(param, 0); 534ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands = byteArrayToShort(param, 2); 535ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels = new short[mNumBands]; 536ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 537ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels[i] = byteArrayToShort(param, 4 + 2*i); 538ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 539ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return settings; 540ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 541ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 542ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 543ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Sets the equalizer properties. This method is useful when equalizer settings have to 544ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * be applied from a previous backup. 54517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param settings an Equalizer.Settings object containing the properties to apply 546ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 547ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 548ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 549ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 550ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public void setProperties(Equalizer.Settings settings) 551ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 552ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (settings.numBands != settings.bandLevels.length || 553ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands != mNumBands) { 554ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings invalid band count: " +settings.numBands); 555ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 556ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 557ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = concatArrays(shortToByteArray(settings.curPreset), 558ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(mNumBands)); 559ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 560ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent param = concatArrays(param, 561ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.bandLevels[i])); 562ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 563ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(setParameter(PARAM_PROPERTIES, param)); 564ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 565fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent} 566