1fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent/* 217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Copyright (C) 2010 The Android Open Source Project 3fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 4fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * you may not use this file except in compliance with the License. 6fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * You may obtain a copy of the License at 7fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 8fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 10fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Unless required by applicable law or agreed to in writing, software 11fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * See the License for the specific language governing permissions and 14fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limitations under the License. 15fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 16fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 171a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentpackage android.media.audiofx; 18fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 191a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.AudioEffect; 20fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentimport android.util.Log; 21ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 22ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurentimport java.util.StringTokenizer; 23fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 24fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 25fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent/** 26fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * An Equalizer is used to alter the frequency response of a particular music source or of the main 27fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * output mix. 28fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>An application creates an Equalizer object to instantiate and control an Equalizer engine 29fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * in the audio framework. The application can either simply use predefined presets or have a more 30fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * precise control of the gain in each frequency band controlled by the equalizer. 31fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>The methods, parameter types and units exposed by the Equalizer implementation are directly 32fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * mapping those defined by the OpenSL ES 1.0.1 Specification (http://www.khronos.org/opensles/) 33fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * for the SLEqualizerItf interface. Please refer to this specification for more details. 34fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * <p>To attach the Equalizer to a particular AudioTrack or MediaPlayer, specify the audio session 3562f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * ID of this AudioTrack or MediaPlayer when constructing the Equalizer. 3662f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * <p>NOTE: attaching an Equalizer to the global audio output mix by use of session 0 is deprecated. 371a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.MediaPlayer#getAudioSessionId()} for details on audio sessions. 381a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * <p>See {@link android.media.audiofx.AudioEffect} class for more details on controlling audio 391a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * effects. 40fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 41fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 42fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurentpublic class Equalizer extends AudioEffect { 43fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 44fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final static String TAG = "Equalizer"; 45fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 46fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // These constants must be synchronized with those in 47fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent // frameworks/base/include/media/EffectEqualizerApi.h 48fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 4917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Number of bands. Parameter ID for OnParameterChangeListener 50fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 51fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_NUM_BANDS = 0; 52fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 53fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level range. Parameter ID for OnParameterChangeListener 54fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 55fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_LEVEL_RANGE = 1; 56fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 57fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band level. Parameter ID for OnParameterChangeListener 58fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 59fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_LEVEL = 2; 60fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 61fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band center frequency. Parameter ID for OnParameterChangeListener 62fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 63fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CENTER_FREQ = 3; 64fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 6517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Band frequency range. Parameter ID for 661a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurent * {@link android.media.audiofx.Equalizer.OnParameterChangeListener} 67fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 68fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_BAND_FREQ_RANGE = 4; 69fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 70fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Band for a given frequency. Parameter ID for OnParameterChangeListener 7117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * 72fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 73fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_BAND = 5; 74fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 75fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Current preset. Parameter ID for OnParameterChangeListener 76fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 77fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_CURRENT_PRESET = 6; 78fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 79fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request number of presets. Parameter ID for OnParameterChangeListener 80fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 81fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_NUM_OF_PRESETS = 7; 82fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 83fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Request preset name. Parameter ID for OnParameterChangeListener 84fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 85fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_GET_PRESET_NAME = 8; 86ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent // used by setProperties()/getProperties 87ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private static final int PARAM_PROPERTIES = 9; 88fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 8917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Maximum size for preset name 90fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 91fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public static final int PARAM_STRING_SIZE_MAX = 32; 92fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 93fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 94ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Number of bands implemented by Equalizer engine 95ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 96ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent private short mNumBands = 0; 97ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 98ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 99fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Number of presets implemented by Equalizer engine 100fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 101fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private int mNumPresets; 102fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 103fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Names of presets implemented by Equalizer engine 104fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 105fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private String[] mPresetNames; 106fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 107fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 108fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registered listener for parameter changes. 109fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 110fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private OnParameterChangeListener mParamListener = null; 111fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 112fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 113fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to to receive raw parameter change event from AudioEffect super class 114fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 115fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener mBaseParamListener = null; 116fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 117fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 118fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Lock for access to mParamListener 119fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 120fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private final Object mParamListenerLock = new Object(); 121fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 122fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 123fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Class constructor. 124fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param priority the priority level requested by the application for controlling the Equalizer 125fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * engine. As the same engine can be shared by several applications, this parameter indicates 126fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * how much the requesting application needs control of effect parameters. The normal priority 127fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * is 0, above normal is a positive number, below normal a negative number. 12862f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * @param audioSession system wide unique audio session identifier. The Equalizer will be 12962f3617f2f4016ad2f59635d5156d64872989880Eric Laurent * attached to the MediaPlayer or AudioTrack in the same audio session. 130fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * 131fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalStateException 132fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.IllegalArgumentException 133fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.UnsupportedOperationException 134fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws java.lang.RuntimeException 135fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 136fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public Equalizer(int priority, int audioSession) 137fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, 138fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent UnsupportedOperationException, RuntimeException { 139fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super(EFFECT_TYPE_EQUALIZER, EFFECT_TYPE_NULL, priority, audioSession); 140fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 14162f3617f2f4016ad2f59635d5156d64872989880Eric Laurent if (audioSession == 0) { 14262f3617f2f4016ad2f59635d5156d64872989880Eric Laurent Log.w(TAG, "WARNING: attaching an Equalizer to global output mix is deprecated!"); 14362f3617f2f4016ad2f59635d5156d64872989880Eric Laurent } 14462f3617f2f4016ad2f59635d5156d64872989880Eric Laurent 145ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent getNumberOfBands(); 146ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 147fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mNumPresets = (int)getNumberOfPresets(); 148fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 149fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mNumPresets != 0) { 150fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames = new String[mNumPresets]; 151fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent byte[] value = new byte[PARAM_STRING_SIZE_MAX]; 152fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 153fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_PRESET_NAME; 154fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent for (int i = 0; i < mNumPresets; i++) { 155fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = i; 156fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, value)); 157fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int length = 0; 158fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent while (value[length] != 0) length++; 159fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent try { 160fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mPresetNames[i] = new String(value, 0, length, "ISO-8859-1"); 161fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } catch (java.io.UnsupportedEncodingException e) { 162fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent Log.e(TAG, "preset name decode error"); 163fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 164fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 165fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 166fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 167fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 168fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 169fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the number of frequency bands supported by the Equalizer engine. 170fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the number of bands 171fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 172fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 173fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 174fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 175fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfBands() 176fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 177ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (mNumBands != 0) { 178ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 179ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 180fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[1]; 181fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_NUM_BANDS; 18292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 18392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(param, result)); 18492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent mNumBands = result[0]; 185ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return mNumBands; 186fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 187fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 188fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 18917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * Gets the level range for use by {@link #setBandLevel(short,short)}. The level is expressed in 190fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * milliBel. 191fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @return the band level range in an array of short integers. The first element is the lower 192fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * limit of the range, the second element the upper limit. 193fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 194fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 195fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 196fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 197fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short[] getBandLevelRange() 198fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 199fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent short[] result = new short[2]; 20092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_LEVEL_RANGE, result)); 201fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 202fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 203fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 204fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 205fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the given equalizer band to the given gain value. 20617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band that will have the new gain. The numbering of the bands starts 20717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * from 0 and ends at (number of bands - 1). 20817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param level new gain in millibels that will be set to the given band. getBandLevelRange() 209fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * will define the maximum and minimum values. 210fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 211fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 212fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 21317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfBands() 214fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 21592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public void setBandLevel(short band, short level) 216fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 217fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 21892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] value = new short[1]; 219fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 220fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 22192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 22292e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent value[0] = level; 223fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(param, value)); 224fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 225fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 226fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 227fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the gain set for the given equalizer band. 22817cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose gain is requested. The numbering of the bands starts 229fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * from 0 and ends at (number of bands - 1). 23017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the gain in millibels of the given band. 231fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 232fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 233fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 234fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 23592e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBandLevel(short band) 236fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 237fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 23892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 239fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 240fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_LEVEL; 24192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 242fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 243fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 24492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 245fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 246fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 247fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 248fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 249fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the center frequency of the given band. 25017cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose center frequency is requested. The numbering of the bands 251fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 25217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the center frequency in milliHertz 253fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 254fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 255fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 256fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 25792e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int getCenterFreq(short band) 258fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 259fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 260fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[1]; 261fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 262fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_CENTER_FREQ; 26392e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 264fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 265fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 266fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 267fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 268fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 269fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 270fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the frequency range of the given frequency band. 27117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param band frequency band whose frequency range is requested. The numbering of the bands 272fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * starts from 0 and ends at (number of bands - 1). 27317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency range in millHertz in an array of integers. The first element is the 274fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * lower limit of the range, the second element the upper limit. 275fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 276fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 277fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 278fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 27992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public int[] getBandFreqRange(short band) 280fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 281fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 282fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] result = new int[2]; 283fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_BAND_FREQ_RANGE; 28492e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent param[1] = (int)band; 285fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 286fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 287fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result; 288fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 289fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 290fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 291fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the band that has the most effect on the given frequency. 29217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param frequency frequency in milliHertz which is to be equalized via the returned band. 29317cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the frequency band that has most effect on the given frequency. 294fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 295fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 296fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 297fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 29892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent public short getBand(int frequency) 299fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 300fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int[] param = new int[2]; 30192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 302fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 303fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[0] = PARAM_GET_BAND; 304fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent param[1] = frequency; 305fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(getParameter(param, result)); 306fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 307fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return result[0]; 308fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 309fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 310fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 311fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets current preset. 31217cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the preset that is set at the moment. 313fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 314fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 315fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 316fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 317fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getCurrentPreset() 318fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 31992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 32092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_CURRENT_PRESET, result)); 32192e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 322fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 323fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 324fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 325fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Sets the equalizer according to the given preset. 32617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset new preset that will be taken into use. The valid range is [0, 32717cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * number of presets-1]. 328fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 329fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 330fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 33117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @see #getNumberOfPresets() 332fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 333fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void usePreset(short preset) 334fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 335fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent checkStatus(setParameter(PARAM_CURRENT_PRESET, preset)); 336fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 337fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 338fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 339fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the total number of presets the equalizer supports. The presets will have indices 340fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * [0, number of presets-1]. 34117cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return the number of presets the equalizer supports. 342fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 343fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 344fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 345fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 346fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public short getNumberOfPresets() 347fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 34892e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent short[] result = new short[1]; 34992e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent checkStatus(getParameter(PARAM_GET_NUM_OF_PRESETS, result)); 35092e847ed8e455dca3b2d33d92999e3960404d9afEric Laurent return result[0]; 351fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 352fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 353fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 354fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Gets the preset name based on the index. 35517cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param preset index of the preset. The valid range is [0, number of presets-1]. 35617cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @return a string containing the name of the given preset. 357fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalStateException 358fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws IllegalArgumentException 359fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @throws UnsupportedOperationException 360fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 361fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public String getPresetName(short preset) 362fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent { 363fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (preset >= 0 && preset < mNumPresets) { 364fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return mPresetNames[preset]; 365fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else { 366fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent return ""; 367fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 368fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 369fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 370fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 371fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * The OnParameterChangeListener interface defines a method called by the Equalizer when a 372fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter value has changed. 373fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 374fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public interface OnParameterChangeListener { 375fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 376fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Method called when a parameter value has changed. The method is called only if the 377fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * parameter was changed by another application having the control of the same 378fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Equalizer engine. 379fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param effect the Equalizer on which the interface is registered. 380fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param status status of the set parameter operation. 381fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param1 ID of the modified parameter. See {@link #PARAM_BAND_LEVEL} ... 382fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param param2 additional parameter qualifier (e.g the band for band level parameter). 383fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param value the new parameter value. 384fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 385fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent void onParameterChange(Equalizer effect, int status, int param1, int param2, int value); 386fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 387fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 388fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 389fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Listener used internally to receive unformatted parameter change events from AudioEffect 390fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * super class. 391fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 392fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private class BaseParameterListener implements AudioEffect.OnParameterChangeListener { 393fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent private BaseParameterListener() { 394fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 395fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 396fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void onParameterChange(AudioEffect effect, int status, byte[] param, byte[] value) { 397fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent OnParameterChangeListener l = null; 398fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 399fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 400fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener != null) { 401fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l = mParamListener; 402fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 403fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 404fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (l != null) { 405fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p1 = -1; 406fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int p2 = -1; 407fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent int v = -1; 408fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 409fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 4) { 410fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p1 = byteArrayToInt(param, 0); 411fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (param.length >= 8) { 412fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent p2 = byteArrayToInt(param, 4); 413fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 414fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 415fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (value.length == 2) { 416fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = (int)byteArrayToShort(value, 0);; 417fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } else if (value.length == 4) { 418fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent v = byteArrayToInt(value, 0); 419fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 420fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 421fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (p1 != -1 && v != -1) { 422fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent l.onParameterChange(Equalizer.this, status, p1, p2, v); 423fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 424fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 425fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 426fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 427fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 428fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent /** 429fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * Registers an OnParameterChangeListener interface. 430fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent * @param listener OnParameterChangeListener interface registered 431fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent */ 432fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent public void setParameterListener(OnParameterChangeListener listener) { 433fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent synchronized (mParamListenerLock) { 434fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent if (mParamListener == null) { 435fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mParamListener = listener; 436fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent mBaseParamListener = new BaseParameterListener(); 437fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent super.setParameterListener(mBaseParamListener); 438fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 439fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 440fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent } 441fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent 442ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 443ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * The Settings class regroups all equalizer parameters. It is used in 444ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * conjuntion with getProperties() and setProperties() methods to backup and restore 445ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * all parameters in a single call. 446ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 447ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public static class Settings { 448ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short curPreset; 449ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short numBands = 0; 450ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public short[] bandLevels = null; 451ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 452ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings() { 453ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 454ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 455ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 456ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Settings class constructor from a key=value; pairs formatted string. The string is 457ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * typically returned by Settings.toString() method. 458ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException if the string is not correctly formatted. 459ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 460ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Settings(String settings) { 461ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent StringTokenizer st = new StringTokenizer(settings, "=;"); 462ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent int tokens = st.countTokens(); 463ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() < 5) { 464ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 465ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 466ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String key = st.nextToken(); 467ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("Equalizer")) { 468ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException( 469ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "invalid settings for Equalizer: " + key); 470ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 471ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent try { 472ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 473ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("curPreset")) { 474ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 475ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 476ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent curPreset = Short.parseShort(st.nextToken()); 477ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 478ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("numBands")) { 479ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 480ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 481ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent numBands = Short.parseShort(st.nextToken()); 482ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (st.countTokens() != numBands*2) { 483ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings: " + settings); 484ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 485ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels = new short[numBands]; 486ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 487ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent key = st.nextToken(); 488ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (!key.equals("band"+(i+1)+"Level")) { 489ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid key name: " + key); 490ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 491ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent bandLevels[i] = Short.parseShort(st.nextToken()); 492ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 493ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } catch (NumberFormatException nfe) { 494ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("invalid value for key: " + key); 495ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 496ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 497ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 498ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent @Override 499ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public String toString() { 500ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 501ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent String str = new String ( 502ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent "Equalizer"+ 503ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";curPreset="+Short.toString(curPreset)+ 504ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ";numBands="+Short.toString(numBands) 505ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent ); 506ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < numBands; i++) { 507ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent str = str.concat(";band"+(i+1)+"Level="+Short.toString(bandLevels[i])); 508ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 509ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return str; 510ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 511ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent }; 512ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 513ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 514ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 515ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Gets the equalizer properties. This method is useful when a snapshot of current 516ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * equalizer settings must be saved by the application. 517ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @return an Equalizer.Settings object containing all current parameters values 518ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 519ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 520ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 521ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 522ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public Equalizer.Settings getProperties() 523ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 524ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = new byte[4 + mNumBands * 2]; 525ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(getParameter(PARAM_PROPERTIES, param)); 526ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent Settings settings = new Settings(); 527ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.curPreset = byteArrayToShort(param, 0); 528ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands = byteArrayToShort(param, 2); 529ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels = new short[mNumBands]; 530ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 531ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.bandLevels[i] = byteArrayToShort(param, 4 + 2*i); 532ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 533ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent return settings; 534ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 535ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 536ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent /** 537ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * Sets the equalizer properties. This method is useful when equalizer settings have to 538ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * be applied from a previous backup. 53917cb280e7f1ac3556eac90ab08263712e0348cb9Eric Laurent * @param settings an Equalizer.Settings object containing the properties to apply 540ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalStateException 541ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws IllegalArgumentException 542ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent * @throws UnsupportedOperationException 543ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent */ 544ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent public void setProperties(Equalizer.Settings settings) 545ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { 546ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent if (settings.numBands != settings.bandLevels.length || 547ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent settings.numBands != mNumBands) { 548ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent throw new IllegalArgumentException("settings invalid band count: " +settings.numBands); 549ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 550ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent 551ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent byte[] param = concatArrays(shortToByteArray(settings.curPreset), 552ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(mNumBands)); 553ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent for (int i = 0; i < mNumBands; i++) { 554ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent param = concatArrays(param, 555ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent shortToByteArray(settings.bandLevels[i])); 556ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 557ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent checkStatus(setParameter(PARAM_PROPERTIES, param)); 558ca57d1cc89d65dfbd59c749c5736574cd08c7bd3Eric Laurent } 559fd84f97af4b44d54bba53bb85b31a6dbce07f6e2Eric Laurent} 560