• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.effectstest;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.os.Bundle;
23 import android.util.Log;
24 import android.view.KeyEvent;
25 import android.view.Menu;
26 import android.view.View.OnClickListener;
27 import android.view.View;
28 import android.view.ViewGroup;
29 import android.widget.Button;
30 import android.widget.TextView;
31 import android.widget.EditText;
32 import android.widget.SeekBar;
33 import android.widget.ToggleButton;
34 import android.widget.CompoundButton;
35 import android.widget.CompoundButton.OnCheckedChangeListener;
36 import java.nio.ByteOrder;
37 import java.nio.ByteBuffer;
38 import java.util.HashMap;
39 import java.util.Map;
40 
41 
42 import android.media.audiofx.Equalizer;
43 import android.media.audiofx.AudioEffect;
44 
45 public class EqualizerTest extends Activity implements OnCheckedChangeListener {
46 
47     private final static String TAG = "EqualizerTest";
48 
49     private static int NUM_BANDS = 5;
50     private static int NUM_PARAMS = NUM_BANDS + 1;
51 
52     private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS];
53     private Equalizer mEqualizer;
54     ToggleButton mOnOffButton;
55     ToggleButton mReleaseButton;
56     EditText mSessionText;
57     static int sSession = 0;
58     EffectListner mEffectListener = new EffectListner();
59     private static HashMap<Integer, Equalizer> sInstances = new HashMap<Integer, Equalizer>(10);
60     String mSettings = "";
61 
EqualizerTest()62     public EqualizerTest() {
63         Log.d(TAG, "contructor");
64     }
65 
66     @Override
onCreate(Bundle icicle)67     public void onCreate(Bundle icicle) {
68         super.onCreate(icicle);
69 
70         SeekBar seekBar;
71         TextView textView;
72 
73         setContentView(R.layout.equalizertest);
74 
75         mSessionText = findViewById(R.id.sessionEdit);
76         mSessionText.setOnKeyListener(mSessionKeyListener);
77 
78         mSessionText.setText(Integer.toString(sSession));
79 
80         mReleaseButton = (ToggleButton)findViewById(R.id.eqReleaseButton);
81         mOnOffButton = (ToggleButton)findViewById(R.id.equalizerOnOff);
82 
83         getEffect(sSession);
84 
85         if (mEqualizer != null) {
86             mReleaseButton.setOnCheckedChangeListener(this);
87             mOnOffButton.setOnCheckedChangeListener(this);
88 
89             short[] bandLevelRange = mEqualizer.getBandLevelRange();
90             int centerFreq;
91             int []freqRange;
92 
93             // Band 1 level
94             centerFreq = mEqualizer.getCenterFreq((short)0);
95             freqRange = mEqualizer.getBandFreqRange((short)0);
96             displayFreq(R.id.eqParam1Center, centerFreq);
97             displayFreq(R.id.eqParam1Min, freqRange[0]);
98             displayFreq(R.id.eqParam1Max, freqRange[1]);
99             seekBar = (SeekBar)findViewById(R.id.eqParam1SeekBar);
100             textView = (TextView)findViewById(R.id.eqParam1Value);
101             mParameters[0] = new BandLevelParam(mEqualizer, 0, bandLevelRange[0], bandLevelRange[1], seekBar, textView);
102             seekBar.setOnSeekBarChangeListener(mParameters[0]);
103 
104             // Band 2 level
105             centerFreq = mEqualizer.getCenterFreq((short)1);
106             freqRange = mEqualizer.getBandFreqRange((short)1);
107             displayFreq(R.id.eqParam2Center, centerFreq);
108             displayFreq(R.id.eqParam2Min, freqRange[0]);
109             displayFreq(R.id.eqParam2Max, freqRange[1]);
110             seekBar = (SeekBar)findViewById(R.id.eqParam2SeekBar);
111             textView = (TextView)findViewById(R.id.eqParam2Value);
112             mParameters[1] = new BandLevelParam(mEqualizer, 1, bandLevelRange[0], bandLevelRange[1], seekBar, textView);
113             seekBar.setOnSeekBarChangeListener(mParameters[1]);
114 
115             // Band 3 level
116             centerFreq = mEqualizer.getCenterFreq((short)2);
117             freqRange = mEqualizer.getBandFreqRange((short)2);
118             displayFreq(R.id.eqParam3Center, centerFreq);
119             displayFreq(R.id.eqParam3Min, freqRange[0]);
120             displayFreq(R.id.eqParam3Max, freqRange[1]);
121             seekBar = (SeekBar)findViewById(R.id.eqParam3SeekBar);
122             textView = (TextView)findViewById(R.id.eqParam3Value);
123             mParameters[2] = new BandLevelParam(mEqualizer, 2, bandLevelRange[0], bandLevelRange[1], seekBar, textView);
124             seekBar.setOnSeekBarChangeListener(mParameters[2]);
125 
126             // Band 4 level
127             centerFreq = mEqualizer.getCenterFreq((short)3);
128             freqRange = mEqualizer.getBandFreqRange((short)3);
129             displayFreq(R.id.eqParam4Center, centerFreq);
130             displayFreq(R.id.eqParam4Min, freqRange[0]);
131             displayFreq(R.id.eqParam4Max, freqRange[1]);
132             seekBar = (SeekBar)findViewById(R.id.eqParam4SeekBar);
133             textView = (TextView)findViewById(R.id.eqParam4Value);
134             mParameters[3] = new BandLevelParam(mEqualizer, 3, bandLevelRange[0], bandLevelRange[1], seekBar, textView);
135             seekBar.setOnSeekBarChangeListener(mParameters[3]);
136 
137             // Band 5 level
138             centerFreq = mEqualizer.getCenterFreq((short)4);
139             freqRange = mEqualizer.getBandFreqRange((short)4);
140             displayFreq(R.id.eqParam5Center, centerFreq);
141             displayFreq(R.id.eqParam5Min, freqRange[0]);
142             displayFreq(R.id.eqParam5Max, freqRange[1]);
143             seekBar = (SeekBar)findViewById(R.id.eqParam5SeekBar);
144             textView = (TextView)findViewById(R.id.eqParam5Value);
145             mParameters[4] = new BandLevelParam(mEqualizer, 4, bandLevelRange[0], bandLevelRange[1], seekBar, textView);
146             seekBar.setOnSeekBarChangeListener(mParameters[4]);
147 
148             // Presets
149             short numPresets = mEqualizer.getNumberOfPresets();
150             seekBar = (SeekBar)findViewById(R.id.eqParam6SeekBar);
151             textView = (TextView)findViewById(R.id.eqParam6Value);
152             mParameters[5] = new PresetParam(mEqualizer, (short)0, (short)(numPresets-1), seekBar, textView);
153             seekBar.setOnSeekBarChangeListener(mParameters[5]);
154         }
155     }
156 
157     @Override
onResume()158     public void onResume() {
159         super.onResume();
160     }
161 
162     @Override
onPause()163     public void onPause() {
164         super.onPause();
165     }
166 
167     private View.OnKeyListener mSessionKeyListener
168     = new View.OnKeyListener() {
169         public boolean onKey(View v, int keyCode, KeyEvent event) {
170             if (event.getAction() == KeyEvent.ACTION_DOWN) {
171                 switch (keyCode) {
172                     case KeyEvent.KEYCODE_DPAD_CENTER:
173                     case KeyEvent.KEYCODE_ENTER:
174                         try {
175                             sSession = Integer.parseInt(mSessionText.getText().toString());
176                             getEffect(sSession);
177                             if (mEqualizer != null) {
178                                 for (int i = 0 ; i < mParameters.length; i++) {
179                                     mParameters[i].setEffect(mEqualizer);
180                                     mParameters[i].setEnabled(true);
181                                 }
182                             }
183                         } catch (NumberFormatException e) {
184                             Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString());
185                         }
186 
187                         return true;
188                 }
189             }
190             return false;
191         }
192     };
193 
194     // OnCheckedChangeListener
onCheckedChanged(CompoundButton buttonView, boolean isChecked)195     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
196         if (buttonView.getId() == R.id.equalizerOnOff) {
197             if (mEqualizer != null) {
198                 mEqualizer.setEnabled(isChecked);
199                 updateBands();
200             }
201         }
202         if (buttonView.getId() == R.id.eqReleaseButton) {
203             if (isChecked) {
204                 if (mEqualizer == null) {
205                     getEffect(sSession);
206                     if (mEqualizer != null) {
207                         for (int i = 0 ; i < mParameters.length; i++) {
208                             mParameters[i].setEffect(mEqualizer);
209                             mParameters[i].setEnabled(true);
210                         }
211                     }
212                 }
213             } else {
214                 if (mEqualizer != null) {
215                     for (int i = 0 ; i < mParameters.length; i++) {
216                         mParameters[i].setEnabled(false);
217                     }
218                     putEffect(sSession);
219                 }
220             }
221         }
222     }
223 
updateBands()224     protected void updateBands() {
225         for (int i = 0 ; i < NUM_BANDS; i++) {
226             mParameters[i].updateDisplay();
227         }
228     }
229 
displayFreq(int viewId, int freq)230     private void displayFreq(int viewId, int freq) {
231         TextView textView = (TextView)findViewById(viewId);
232         String text = Integer.toString(freq/1000)+" Hz";
233         textView.setText(text);
234     }
235 
236     private class EqualizerParam extends EffectParameter {
237         private Equalizer mEqualizer;
238 
EqualizerParam(Equalizer equalizer, int min, int max, SeekBar seekBar, TextView textView, String unit)239         public EqualizerParam(Equalizer equalizer, int min, int max, SeekBar seekBar, TextView textView, String unit) {
240             super (min, max, seekBar, textView, unit);
241 
242             mEqualizer = equalizer;
243             updateDisplay();
244         }
245 
246         @Override
setParameter(Integer value)247         public void setParameter(Integer value) {
248         }
249 
250         @Override
getParameter()251         public Integer getParameter() {
252             return new Integer(0);
253         }
254 
255         @Override
setEffect(Object eq)256         public void setEffect(Object eq) {
257             mEqualizer = (Equalizer)eq;
258         }
259     }
260 
261     private class BandLevelParam extends EqualizerParam {
262         private int mBand;
263 
BandLevelParam(Equalizer equalizer, int band, short min, short max, SeekBar seekBar, TextView textView)264         public BandLevelParam(Equalizer equalizer, int band, short min, short max, SeekBar seekBar, TextView textView) {
265             super (equalizer, min, max, seekBar, textView, "mB");
266 
267             mBand = band;
268             mEqualizer = equalizer;
269             updateDisplay();
270         }
271 
272         @Override
setParameter(Integer value)273         public void setParameter(Integer value) {
274             if (mEqualizer != null) {
275                 mEqualizer.setBandLevel((short)mBand, value.shortValue());
276             }
277         }
278 
279         @Override
getParameter()280         public Integer getParameter() {
281             if (mEqualizer != null) {
282                 return new Integer(mEqualizer.getBandLevel((short)mBand));
283             }
284             return new Integer(0);
285         }
286     }
287 
288     private class PresetParam extends EqualizerParam {
289 
PresetParam(Equalizer equalizer, short min, short max, SeekBar seekBar, TextView textView)290         public PresetParam(Equalizer equalizer, short min, short max, SeekBar seekBar, TextView textView) {
291             super (equalizer, min, max, seekBar, textView, "");
292 
293             mEqualizer = equalizer;
294             updateDisplay();
295         }
296 
297         @Override
setParameter(Integer value)298         public void setParameter(Integer value) {
299             if (mEqualizer != null) {
300                 mEqualizer.usePreset(value.shortValue());
301             }
302         }
303 
304         @Override
getParameter()305         public Integer getParameter() {
306             if (mEqualizer != null) {
307                 return new Integer(mEqualizer.getCurrentPreset());
308             }
309             return new Integer(0);
310         }
311 
312         @Override
displayValue(int value, boolean fromTouch)313         public void displayValue(int value, boolean fromTouch) {
314             String text = mEqualizer.getPresetName((short)value);
315             mValueText.setText(text);
316             if (!fromTouch) {
317                 mSeekBar.setProgress(value - mMin);
318             } else {
319                 updateBands();
320             }
321         }
322     }
323 
324     public class EffectListner implements AudioEffect.OnEnableStatusChangeListener,
325     AudioEffect.OnControlStatusChangeListener,
326     Equalizer.OnParameterChangeListener
327    {
EffectListner()328         public EffectListner() {
329         }
onEnableStatusChange(AudioEffect effect, boolean enabled)330         public void onEnableStatusChange(AudioEffect effect, boolean enabled) {
331             Log.d(TAG,"onEnableStatusChange: "+ enabled);
332         }
onControlStatusChange(AudioEffect effect, boolean controlGranted)333         public void onControlStatusChange(AudioEffect effect, boolean controlGranted) {
334             Log.d(TAG,"onControlStatusChange: "+ controlGranted);
335         }
336 
onParameterChange(Equalizer effect, int status, int param1, int param2, int value)337         public void onParameterChange(Equalizer effect, int status, int param1, int param2, int value) {
338             Log.d(TAG,"onParameterChange EQ, status: "+status+" p1: "+param1+" p2: "+param2+" v: "+value);
339         }
340 
byteArrayToInt(byte[] valueBuf, int offset)341         private int byteArrayToInt(byte[] valueBuf, int offset) {
342             ByteBuffer converter = ByteBuffer.wrap(valueBuf);
343             converter.order(ByteOrder.nativeOrder());
344             return converter.getInt(offset);
345 
346         }
byteArrayToShort(byte[] valueBuf, int offset)347         private short byteArrayToShort(byte[] valueBuf, int offset) {
348             ByteBuffer converter = ByteBuffer.wrap(valueBuf);
349             converter.order(ByteOrder.nativeOrder());
350             return converter.getShort(offset);
351 
352         }
353     }
354 
getEffect(int session)355     private void getEffect(int session) {
356         synchronized (sInstances) {
357             if (sInstances.containsKey(session)) {
358                 mEqualizer = sInstances.get(session);
359             } else {
360                 try{
361                     mEqualizer = new Equalizer(0, session);
362                 } catch (IllegalArgumentException e) {
363                     Log.e(TAG,"Equalizer effect not supported");
364                 } catch (UnsupportedOperationException e) {
365                     Log.e(TAG,"Equalizer library not loaded");
366                 } catch (IllegalStateException e) {
367                     Log.e(TAG,"Equalizer cannot get presets");
368                 } catch (RuntimeException e) {
369                     Log.e(TAG,"Equalizer effect not found");
370                 }
371                 sInstances.put(session, mEqualizer);
372             }
373         }
374         mReleaseButton.setEnabled(false);
375         mOnOffButton.setEnabled(false);
376         if (mEqualizer != null) {
377             if (mSettings != "") {
378                 Log.d(TAG,"Equalizer settings: "+mSettings);
379                 mEqualizer.setProperties(new Equalizer.Settings(mSettings));
380             }
381 
382             mEqualizer.setEnableStatusListener(mEffectListener);
383             mEqualizer.setControlStatusListener(mEffectListener);
384             mEqualizer.setParameterListener(mEffectListener);
385 
386             mReleaseButton.setChecked(true);
387             mReleaseButton.setEnabled(true);
388 
389             mOnOffButton.setChecked(mEqualizer.getEnabled());
390             mOnOffButton.setEnabled(true);
391         }
392     }
393 
putEffect(int session)394     private void putEffect(int session) {
395 //        mOnOffButton.setChecked(false);
396         mOnOffButton.setEnabled(false);
397         synchronized (sInstances) {
398             if (mEqualizer != null) {
399                 mSettings = mEqualizer.getProperties().toString();
400                 mEqualizer.release();
401                 Log.d(TAG,"Equalizer released, settings: "+mSettings);
402                 mEqualizer = null;
403                 sInstances.remove(session);
404             }
405         }
406     }
407 }
408