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 4262f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * ID of this AudioTrack or MediaPlayer when constructing the Equalizer. 4362f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * <p>NOTE: attaching an Equalizer to the global audio output mix by use of session 0 is deprecated. 441a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.MediaPlayer#getAudioSessionId()} for details on audio sessions. 451a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.audiofx.AudioEffect} class for more details on controlling audio 461a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * effects. 47fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 48fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 49fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpublic class Equalizer extends AudioEffect { 50fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 51fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final static String TAG = "Equalizer"; 52fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 53fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // These constants must be synchronized with those in 54fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // frameworks/base/include/media/EffectEqualizerApi.h 55fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 5617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Number of bands. Parameter ID for OnParameterChangeListener 57fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 58fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_NUM_BANDS = 0; 59fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 60fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level range. Parameter ID for OnParameterChangeListener 61fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 62fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_LEVEL_RANGE = 1; 63fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 64fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level. Parameter ID for OnParameterChangeListener 65fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 66fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_LEVEL = 2; 67fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 68fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band center frequency. Parameter ID for OnParameterChangeListener 69fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 70fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CENTER_FREQ = 3; 71fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 7217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Band frequency range. Parameter ID for 731a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.media.audiofx.Equalizer.OnParameterChangeListener} 74fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 75fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_FREQ_RANGE = 4; 76fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 77fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band for a given frequency. Parameter ID for OnParameterChangeListener 7817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * 79fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 80fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_BAND = 5; 81fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 82fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Current preset. Parameter ID for OnParameterChangeListener 83fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 84fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CURRENT_PRESET = 6; 85fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 86fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request number of presets. Parameter ID for OnParameterChangeListener 87fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 88fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_NUM_OF_PRESETS = 7; 89fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 90fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request preset name. Parameter ID for OnParameterChangeListener 91fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 92fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_PRESET_NAME = 8; 93ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // used by setProperties()/getProperties 94ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private static final int PARAM_PROPERTIES = 9; 95fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 9617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Maximum size for preset name 97fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 98fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_STRING_SIZE_MAX = 32; 99fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 100fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 101ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Number of bands implemented by Equalizer engine 102ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 103ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private short mNumBands = 0; 104ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 105ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 106fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Number of presets implemented by Equalizer engine 107fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 108fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private int mNumPresets; 109fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 110fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Names of presets implemented by Equalizer engine 111fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 112fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private String[] mPresetNames; 113fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 114fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 115fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registered listener for parameter changes. 116fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 117fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private OnParameterChangeListener mParamListener = null; 118fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 119fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 120fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to to receive raw parameter change event from AudioEffect super class 121fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 122fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener mBaseParamListener = null; 123fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 124fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 125fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Lock for access to mParamListener 126fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 127fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final Object mParamListenerLock = new Object(); 128fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 129fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 130fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Class constructor. 131fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param priority the priority level requested by the application for controlling the Equalizer 132fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * engine. As the same engine can be shared by several applications, this parameter indicates 133fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * how much the requesting application needs control of effect parameters. The normal priority 134fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is 0, above normal is a positive number, below normal a negative number. 13562f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * @param audioSession system wide unique audio session identifier. The Equalizer will be 13662f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * attached to the MediaPlayer or AudioTrack in the same audio session. 137fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 138fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalStateException 139fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalArgumentException 140fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.UnsupportedOperationException 141fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.RuntimeException 142fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 143fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public Equalizer(int priority, int audioSession) 144fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, 145fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent UnsupportedOperationException, RuntimeException { 146fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super(EFFECT_TYPE_EQUALIZER, EFFECT_TYPE_NULL, priority, audioSession); 147fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 14862f3617f2f4016ad2f59635d5156d64872989880Eric Laurent if (audioSession == 0) { 14962f3617f2f4016ad2f59635d5156d64872989880Eric Laurent Log.w(TAG, "WARNING: attaching an Equalizer to global output mix is deprecated!"); 15062f3617f2f4016ad2f59635d5156d64872989880Eric Laurent } 15162f3617f2f4016ad2f59635d5156d64872989880Eric Laurent 152ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent getNumberOfBands(); 153ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 154fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mNumPresets = (int)getNumberOfPresets(); 155fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 156fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mNumPresets != 0) { 157fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames = new String[mNumPresets]; 158fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] value = new byte[PARAM_STRING_SIZE_MAX]; 159fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 160fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_PRESET_NAME; 161fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent for (int i = 0; i < mNumPresets; i++) { 162fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = i; 163fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, value)); 164fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int length = 0; 165fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent while (value[length] != 0) length++; 166fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent try { 167fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames[i] = new String(value, 0, length, "ISO-8859-1"); 168fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } catch (java.io.UnsupportedEncodingException e) { 169fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent Log.e(TAG, "preset name decode error"); 170fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 171fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 172fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 173fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 174fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 175fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 176fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the number of frequency bands supported by the Equalizer engine. 177fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the number of bands 178fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 179fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 180fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 181fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 182fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfBands() 183fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 184ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (mNumBands != 0) { 185ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 186ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 187fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[1]; 188fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_NUM_BANDS; 18992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 19092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(param, result)); 19192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent mNumBands = result[0]; 192ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 193fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 194fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 195fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 19617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Gets the level range for use by {@link #setBandLevel(short,short)}. The level is expressed in 197fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * milliBel. 198fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the band level range in an array of short integers. The first element is the lower 199fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limit of the range, the second element the upper limit. 200fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 201fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 202fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 203fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 204fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short[] getBandLevelRange() 205fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 206fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent short[] result = new short[2]; 20792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_LEVEL_RANGE, result)); 208fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 209fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 210fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 211fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 212fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the given equalizer band to the given gain value. 21317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band that will have the new gain. The numbering of the bands starts 21417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * from 0 and ends at (number of bands - 1). 21517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param level new gain in millibels that will be set to the given band. getBandLevelRange() 216fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * will define the maximum and minimum values. 217fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 218fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 219fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 22017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfBands() 221fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 22292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public void setBandLevel(short band, short level) 223fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 224fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 22592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] value = new short[1]; 226fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 227fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 22892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 22992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent value[0] = level; 230fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(param, value)); 231fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 232fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 233fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 234fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the gain set for the given equalizer band. 23517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose gain is requested. The numbering of the bands starts 236fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * from 0 and ends at (number of bands - 1). 23717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the gain in millibels of the given band. 238fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 239fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 240fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 241fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 24292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBandLevel(short band) 243fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 244fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 24592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 246fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 247fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 24892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 249fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 250fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 25192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 252fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 253fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 254fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 255fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 256fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the center frequency of the given band. 25717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose center frequency is requested. The numbering of the bands 258fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 25917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the center frequency in milliHertz 260fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 261fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 262fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 263fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 26492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int getCenterFreq(short band) 265fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 266fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 267fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[1]; 268fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 269fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_CENTER_FREQ; 27092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 271fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 272fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 273fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 274fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 275fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 276fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 277fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the frequency range of the given frequency band. 27817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose frequency range is requested. The numbering of the bands 279fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 28017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency range in millHertz in an array of integers. The first element is the 281fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * lower limit of the range, the second element the upper limit. 282fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 283fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 284fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 285fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 28692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int[] getBandFreqRange(short band) 287fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 288fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 289fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[2]; 290fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_FREQ_RANGE; 29192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 292fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 293fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 294fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 295fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 296fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 297fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 298fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the band that has the most effect on the given frequency. 29917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param frequency frequency in milliHertz which is to be equalized via the returned band. 30017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency band that has most effect on the given frequency. 301fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 302fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 303fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 304fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 30592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBand(int frequency) 306fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 307fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 30892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 309fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 310fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_BAND; 311fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = frequency; 312fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 313fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 314fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 315fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 316fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 317fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 318fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets current preset. 31917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the preset that is set at the moment. 320fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 321fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 322fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 323fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 324fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getCurrentPreset() 325fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 32692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 32792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_CURRENT_PRESET, result)); 32892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 329fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 330fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 331fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 332fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the equalizer according to the given preset. 33317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset new preset that will be taken into use. The valid range is [0, 33417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * number of presets-1]. 335fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 336fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 337fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 33817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfPresets() 339fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 340fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void usePreset(short preset) 341fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 342fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_CURRENT_PRESET, preset)); 343fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 344fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 345fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 346fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the total number of presets the equalizer supports. The presets will have indices 347fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [0, number of presets-1]. 34817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the number of presets the equalizer supports. 349fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 350fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 351fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 352fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 353fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfPresets() 354fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 35592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 35692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_GET_NUM_OF_PRESETS, result)); 35792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 358fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 359fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 360fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 361fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the preset name based on the index. 36217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset index of the preset. The valid range is [0, number of presets-1]. 36317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return a string containing the name of the given preset. 364fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 365fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 366fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 367fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 368fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public String getPresetName(short preset) 369fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent { 370fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (preset >= 0 && preset < mNumPresets) { 371fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return mPresetNames[preset]; 372fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else { 373fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return ""; 374fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 375fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 376fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 377fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 378fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The OnParameterChangeListener interface defines a method called by the Equalizer when a 379fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter value has changed. 380fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 381fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public interface OnParameterChangeListener { 382fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 383fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Method called when a parameter value has changed. The method is called only if the 384fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter was changed by another application having the control of the same 385fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Equalizer engine. 386fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param effect the Equalizer on which the interface is registered. 387fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param status status of the set parameter operation. 388fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param1 ID of the modified parameter. See {@link #PARAM_BAND_LEVEL} ... 389fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param2 additional parameter qualifier (e.g the band for band level parameter). 390fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param value the new parameter value. 391fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 392fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent void onParameterChange(Equalizer effect, int status, int param1, int param2, int value); 393fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 394fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 395fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 396fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to receive unformatted parameter change events from AudioEffect 397fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * super class. 398fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 399fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 400fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener() { 401fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 402fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 403fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 404fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent OnParameterChangeListener l = null; 405fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 406fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 407fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener != null) { 408fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l = mParamListener; 409fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 410fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 411fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (l != null) { 412fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p1 = -1; 413fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p2 = -1; 414fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int v = -1; 415fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 416fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 4) { 417fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p1 = byteArrayToInt(param, 0); 418fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 8) { 419fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p2 = byteArrayToInt(param, 4); 420fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 421fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 422fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (value.length == 2) { 423fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = (int)byteArrayToShort(value, 0);; 424fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else if (value.length == 4) { 425fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = byteArrayToInt(value, 0); 426fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 427fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 428fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (p1 != -1 && v != -1) { 429fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l.onParameterChange(Equalizer.this, status, p1, p2, v); 430fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 431fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 432fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 433fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 434fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 435fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 436fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registers an OnParameterChangeListener interface. 437fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param listener OnParameterChangeListener interface registered 438fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 439fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setParameterListener(OnParameterChangeListener listener) { 440fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 441fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener == null) { 442fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mParamListener = listener; 443fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mBaseParamListener = new BaseParameterListener(); 444fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super.setParameterListener(mBaseParamListener); 445fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 446fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 447fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 448fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 449ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 450ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * The Settings class regroups all equalizer parameters. It is used in 451ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * conjuntion with getProperties() and setProperties() methods to backup and restore 452ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * all parameters in a single call. 453ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 454ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public static class Settings { 455ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short curPreset; 456ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short numBands = 0; 457ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short[] bandLevels = null; 458ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 459ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings() { 460ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 461ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 462ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 463ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Settings class constructor from a key=value; pairs formatted string. The string is 464ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * typically returned by Settings.toString() method. 465ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException if the string is not correctly formatted. 466ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 467ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings(String settings) { 468ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent StringTokenizer st = new StringTokenizer(settings, "=;"); 469ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent int tokens = st.countTokens(); 470ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() < 5) { 471ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 472ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 473ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String key = st.nextToken(); 474ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("Equalizer")) { 475ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException( 476ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "invalid settings for Equalizer: " + key); 477ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 478ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent try { 479ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 480ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("curPreset")) { 481ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 482ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 483ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent curPreset = Short.parseShort(st.nextToken()); 484ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 485ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("numBands")) { 486ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 487ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 488ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent numBands = Short.parseShort(st.nextToken()); 489ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() != numBands*2) { 490ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 491ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 492ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels = new short[numBands]; 493ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 494ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 495ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("band"+(i+1)+"Level")) { 496ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 497ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 498ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels[i] = Short.parseShort(st.nextToken()); 499ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 500ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } catch (NumberFormatException nfe) { 501ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid value for key: " + key); 502ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 503ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 504ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 505ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent @Override 506ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public String toString() { 507ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 508ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String str = new String ( 509ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "Equalizer"+ 510ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";curPreset="+Short.toString(curPreset)+ 511ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";numBands="+Short.toString(numBands) 512ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ); 513ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 514ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent str = str.concat(";band"+(i+1)+"Level="+Short.toString(bandLevels[i])); 515ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 516ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return str; 517ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 518ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent }; 519ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 520ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 521ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 522ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Gets the equalizer properties. This method is useful when a snapshot of current 523ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * equalizer settings must be saved by the application. 524ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @return an Equalizer.Settings object containing all current parameters values 525ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 526ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 527ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 528ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 529ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Equalizer.Settings getProperties() 530ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 531ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = new byte[4 + mNumBands * 2]; 532ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(getParameter(PARAM_PROPERTIES, param)); 533ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent Settings settings = new Settings(); 534ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.curPreset = byteArrayToShort(param, 0); 535ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands = byteArrayToShort(param, 2); 536ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels = new short[mNumBands]; 537ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 538ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels[i] = byteArrayToShort(param, 4 + 2*i); 539ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 540ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return settings; 541ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 542ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 543ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 544ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Sets the equalizer properties. This method is useful when equalizer settings have to 545ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * be applied from a previous backup. 54617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param settings an Equalizer.Settings object containing the properties to apply 547ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 548ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 549ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 550ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 551ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public void setProperties(Equalizer.Settings settings) 552ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 553ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (settings.numBands != settings.bandLevels.length || 554ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands != mNumBands) { 555ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings invalid band count: " +settings.numBands); 556ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 557ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 558ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = concatArrays(shortToByteArray(settings.curPreset), 559ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(mNumBands)); 560ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 561ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent param = concatArrays(param, 562ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.bandLevels[i])); 563ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 564ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(setParameter(PARAM_PROPERTIES, param)); 565ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 566fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent} 567