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