Equalizer.java revision 17cb280e7f1ac3556eac90ab08263712e0348cb9
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 17fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpackage android.media; 18fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 19fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentimport android.app.Activity; 20fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentimport android.content.Context; 21fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentimport android.content.Intent; 22ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurentimport android.media.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. 4417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * <p> See {@link android.media.AudioEffect} class for more details on controlling audio effects. 45fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 46fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 47fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpublic class Equalizer extends AudioEffect { 48fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 49fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final static String TAG = "Equalizer"; 50fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 51fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // These constants must be synchronized with those in 52fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // frameworks/base/include/media/EffectEqualizerApi.h 53fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 5417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Number of bands. Parameter ID for OnParameterChangeListener 55fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 56fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_NUM_BANDS = 0; 57fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 58fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level range. Parameter ID for OnParameterChangeListener 59fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 60fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_LEVEL_RANGE = 1; 61fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 62fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level. Parameter ID for OnParameterChangeListener 63fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 64fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_LEVEL = 2; 65fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 66fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band center frequency. Parameter ID for OnParameterChangeListener 67fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 68fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CENTER_FREQ = 3; 69fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 7017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Band frequency range. Parameter ID for 7117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * {@link android.media.Equalizer.OnParameterChangeListener} 72fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 73fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_FREQ_RANGE = 4; 74fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 75fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band for a given frequency. Parameter ID for OnParameterChangeListener 7617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * 77fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 78fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_BAND = 5; 79fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 80fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Current preset. Parameter ID for OnParameterChangeListener 81fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 82fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CURRENT_PRESET = 6; 83fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 84fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request number of presets. Parameter ID for OnParameterChangeListener 85fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 86fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_NUM_OF_PRESETS = 7; 87fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 88fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request preset name. Parameter ID for OnParameterChangeListener 89fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 90fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_PRESET_NAME = 8; 91ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // used by setProperties()/getProperties 92ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private static final int PARAM_PROPERTIES = 9; 93fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 9417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Maximum size for preset name 95fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 96fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_STRING_SIZE_MAX = 32; 97fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 98fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 99ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Number of bands implemented by Equalizer engine 100ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 101ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private short mNumBands = 0; 102ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 103ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 104fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Number of presets implemented by Equalizer engine 105fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 106fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private int mNumPresets; 107fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 108fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Names of presets implemented by Equalizer engine 109fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 110fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private String[] mPresetNames; 111fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 112fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 113fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registered listener for parameter changes. 114fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 115fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private OnParameterChangeListener mParamListener = null; 116fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 117fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 118fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to to receive raw parameter change event from AudioEffect super class 119fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 120fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener mBaseParamListener = null; 121fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 122fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 123fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Lock for access to mParamListener 124fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 125fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final Object mParamListenerLock = new Object(); 126fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 127fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 128fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Class constructor. 129fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param priority the priority level requested by the application for controlling the Equalizer 130fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * engine. As the same engine can be shared by several applications, this parameter indicates 131fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * how much the requesting application needs control of effect parameters. The normal priority 132fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is 0, above normal is a positive number, below normal a negative number. 13317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param audioSession system wide unique audio session identifier. If audioSession 134fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is not 0, the Equalizer will be attached to the MediaPlayer or AudioTrack in the 135fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * same audio session. Otherwise, the Equalizer will apply to the output mix. 136fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 137fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalStateException 138fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalArgumentException 139fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.UnsupportedOperationException 140fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.RuntimeException 141fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 142fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public Equalizer(int priority, int audioSession) 143fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, 144fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent UnsupportedOperationException, RuntimeException { 145fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super(EFFECT_TYPE_EQUALIZER, EFFECT_TYPE_NULL, priority, audioSession); 146fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 147ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent getNumberOfBands(); 148ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 149fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mNumPresets = (int)getNumberOfPresets(); 150fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 151fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mNumPresets != 0) { 152fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames = new String[mNumPresets]; 153fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] value = new byte[PARAM_STRING_SIZE_MAX]; 154fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 155fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_PRESET_NAME; 156fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent for (int i = 0; i < mNumPresets; i++) { 157fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = i; 158fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, value)); 159fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int length = 0; 160fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent while (value[length] != 0) length++; 161fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent try { 162fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames[i] = new String(value, 0, length, "ISO-8859-1"); 163fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } catch (java.io.UnsupportedEncodingException e) { 164fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent Log.e(TAG, "preset name decode error"); 165fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 166fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 167fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 168fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 169fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 170fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 171fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the number of frequency bands supported by the Equalizer engine. 172fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the number of bands 173fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 174fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 175fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 176fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 177fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfBands() 178fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 179ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (mNumBands != 0) { 180ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 181ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 182fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[1]; 183fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_NUM_BANDS; 18492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 18592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(param, result)); 18692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent mNumBands = result[0]; 187ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 188fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 189fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 190fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 19117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Gets the level range for use by {@link #setBandLevel(short,short)}. The level is expressed in 192fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * milliBel. 193fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the band level range in an array of short integers. The first element is the lower 194fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limit of the range, the second element the upper limit. 195fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 196fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 197fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 198fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 199fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short[] getBandLevelRange() 200fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 201fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent short[] result = new short[2]; 20292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_LEVEL_RANGE, result)); 203fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 204fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 205fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 206fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 207fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the given equalizer band to the given gain value. 20817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band that will have the new gain. The numbering of the bands starts 20917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * from 0 and ends at (number of bands - 1). 21017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param level new gain in millibels that will be set to the given band. getBandLevelRange() 211fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * will define the maximum and minimum values. 212fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 213fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 214fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 21517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfBands() 216fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 21792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public void setBandLevel(short band, short level) 218fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 219fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 22092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] value = new short[1]; 221fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 222fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 22392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 22492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent value[0] = level; 225fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(param, value)); 226fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 227fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 228fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 229fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the gain set for the given equalizer band. 23017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose gain is requested. The numbering of the bands starts 231fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * from 0 and ends at (number of bands - 1). 23217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the gain in millibels of the given band. 233fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 234fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 235fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 236fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 23792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBandLevel(short band) 238fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 239fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 24092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 241fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 242fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 24392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 244fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 245fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 24692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 247fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 248fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 249fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 250fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 251fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the center frequency of the given band. 25217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose center frequency is requested. The numbering of the bands 253fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 25417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the center frequency in milliHertz 255fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 256fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 257fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 258fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 25992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int getCenterFreq(short band) 260fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 261fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 262fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[1]; 263fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 264fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_CENTER_FREQ; 26592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 266fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 267fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 268fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 269fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 270fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 271fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 272fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the frequency range of the given frequency band. 27317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose frequency range is requested. The numbering of the bands 274fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 27517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency range in millHertz in an array of integers. The first element is the 276fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * lower limit of the range, the second element the upper limit. 277fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 278fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 279fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 280fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 28192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int[] getBandFreqRange(short band) 282fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 283fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 284fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[2]; 285fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_FREQ_RANGE; 28692e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 287fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 288fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 289fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 290fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 291fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 292fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 293fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the band that has the most effect on the given frequency. 29417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param frequency frequency in milliHertz which is to be equalized via the returned band. 29517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency band that has most effect on the given frequency. 296fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 297fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 298fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 299fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 30092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBand(int frequency) 301fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 302fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 30392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 304fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 305fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_BAND; 306fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = frequency; 307fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 308fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 309fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 310fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 311fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 312fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 313fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets current preset. 31417cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the preset that is set at the moment. 315fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 316fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 317fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 318fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 319fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getCurrentPreset() 320fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 32192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 32292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_CURRENT_PRESET, result)); 32392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 324fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 325fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 326fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 327fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the equalizer according to the given preset. 32817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset new preset that will be taken into use. The valid range is [0, 32917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * number of presets-1]. 330fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 331fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 332fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 33317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfPresets() 334fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 335fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void usePreset(short preset) 336fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 337fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_CURRENT_PRESET, preset)); 338fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 339fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 340fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 341fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the total number of presets the equalizer supports. The presets will have indices 342fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [0, number of presets-1]. 34317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the number of presets the equalizer supports. 344fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 345fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 346fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 347fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 348fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfPresets() 349fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 35092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 35192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_GET_NUM_OF_PRESETS, result)); 35292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 353fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 354fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 355fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 356fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the preset name based on the index. 35717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset index of the preset. The valid range is [0, number of presets-1]. 35817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return a string containing the name of the given preset. 359fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 360fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 361fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 362fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 363fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public String getPresetName(short preset) 364fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent { 365fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (preset >= 0 && preset < mNumPresets) { 366fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return mPresetNames[preset]; 367fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else { 368fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return ""; 369fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 370fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 371fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 372fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 373fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The OnParameterChangeListener interface defines a method called by the Equalizer when a 374fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter value has changed. 375fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 376fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public interface OnParameterChangeListener { 377fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 378fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Method called when a parameter value has changed. The method is called only if the 379fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter was changed by another application having the control of the same 380fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Equalizer engine. 381fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param effect the Equalizer on which the interface is registered. 382fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param status status of the set parameter operation. 38317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * See {@link android.media.AudioEffect#setParameter(byte[], byte[])}. 384fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param1 ID of the modified parameter. See {@link #PARAM_BAND_LEVEL} ... 385fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param2 additional parameter qualifier (e.g the band for band level parameter). 386fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param value the new parameter value. 387fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 388fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent void onParameterChange(Equalizer effect, int status, int param1, int param2, int value); 389fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 390fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 391fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 392fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to receive unformatted parameter change events from AudioEffect 393fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * super class. 394fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 395fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 396fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener() { 397fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 398fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 399fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 400fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent OnParameterChangeListener l = null; 401fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 402fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 403fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener != null) { 404fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l = mParamListener; 405fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 406fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 407fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (l != null) { 408fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p1 = -1; 409fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p2 = -1; 410fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int v = -1; 411fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 412fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 4) { 413fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p1 = byteArrayToInt(param, 0); 414fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 8) { 415fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p2 = byteArrayToInt(param, 4); 416fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 417fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 418fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (value.length == 2) { 419fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = (int)byteArrayToShort(value, 0);; 420fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else if (value.length == 4) { 421fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = byteArrayToInt(value, 0); 422fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 423fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 424fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (p1 != -1 && v != -1) { 425fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l.onParameterChange(Equalizer.this, status, p1, p2, v); 426fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 427fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 428fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 429fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 430fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 431fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 432fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registers an OnParameterChangeListener interface. 433fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param listener OnParameterChangeListener interface registered 434fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 435fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setParameterListener(OnParameterChangeListener listener) { 436fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 437fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener == null) { 438fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mParamListener = listener; 439fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mBaseParamListener = new BaseParameterListener(); 440fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super.setParameterListener(mBaseParamListener); 441fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 442fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 443fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 444fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 445ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 446ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * The Settings class regroups all equalizer parameters. It is used in 447ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * conjuntion with getProperties() and setProperties() methods to backup and restore 448ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * all parameters in a single call. 449ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 450ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public static class Settings { 451ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short curPreset; 452ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short numBands = 0; 453ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short[] bandLevels = null; 454ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 455ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings() { 456ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 457ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 458ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 459ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Settings class constructor from a key=value; pairs formatted string. The string is 460ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * typically returned by Settings.toString() method. 461ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException if the string is not correctly formatted. 462ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 463ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings(String settings) { 464ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent StringTokenizer st = new StringTokenizer(settings, "=;"); 465ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent int tokens = st.countTokens(); 466ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() < 5) { 467ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 468ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 469ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String key = st.nextToken(); 470ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("Equalizer")) { 471ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException( 472ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "invalid settings for Equalizer: " + key); 473ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 474ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent try { 475ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 476ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("curPreset")) { 477ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 478ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 479ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent curPreset = Short.parseShort(st.nextToken()); 480ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 481ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("numBands")) { 482ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 483ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 484ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent numBands = Short.parseShort(st.nextToken()); 485ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() != numBands*2) { 486ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 487ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 488ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels = new short[numBands]; 489ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 490ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 491ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("band"+(i+1)+"Level")) { 492ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 493ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 494ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels[i] = Short.parseShort(st.nextToken()); 495ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 496ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } catch (NumberFormatException nfe) { 497ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid value for key: " + key); 498ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 499ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 500ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 501ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent @Override 502ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public String toString() { 503ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 504ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String str = new String ( 505ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "Equalizer"+ 506ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";curPreset="+Short.toString(curPreset)+ 507ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";numBands="+Short.toString(numBands) 508ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ); 509ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 510ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent str = str.concat(";band"+(i+1)+"Level="+Short.toString(bandLevels[i])); 511ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 512ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return str; 513ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 514ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent }; 515ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 516ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 517ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 518ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Gets the equalizer properties. This method is useful when a snapshot of current 519ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * equalizer settings must be saved by the application. 520ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @return an Equalizer.Settings object containing all current parameters values 521ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 522ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 523ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 524ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 525ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Equalizer.Settings getProperties() 526ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 527ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = new byte[4 + mNumBands * 2]; 528ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(getParameter(PARAM_PROPERTIES, param)); 529ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent Settings settings = new Settings(); 530ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.curPreset = byteArrayToShort(param, 0); 531ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands = byteArrayToShort(param, 2); 532ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels = new short[mNumBands]; 533ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 534ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels[i] = byteArrayToShort(param, 4 + 2*i); 535ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 536ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return settings; 537ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 538ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 539ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 540ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Sets the equalizer properties. This method is useful when equalizer settings have to 541ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * be applied from a previous backup. 54217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param settings an Equalizer.Settings object containing the properties to apply 543ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 544ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 545ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 546ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 547ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public void setProperties(Equalizer.Settings settings) 548ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 549ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (settings.numBands != settings.bandLevels.length || 550ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands != mNumBands) { 551ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings invalid band count: " +settings.numBands); 552ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 553ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 554ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = concatArrays(shortToByteArray(settings.curPreset), 555ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(mNumBands)); 556ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 557ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent param = concatArrays(param, 558ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.bandLevels[i])); 559ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 560ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(setParameter(PARAM_PROPERTIES, param)); 561ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 562fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent} 563