diff options
| author | Marco Nelissen <marcone@google.com> | 2012-09-06 12:37:30 -0700 |
|---|---|---|
| committer | Marco Nelissen <marcone@google.com> | 2012-09-06 12:37:30 -0700 |
| commit | 2e2beaaee2a427598ced5067fc59f3ae9a98cf35 (patch) | |
| tree | ca907fbc12851a3660d271936b5279b7370a7c38 /media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java | |
| parent | 40e86a56da7a39bc899ca78a69258199c2640420 (diff) | |
| download | frameworks_base-2e2beaaee2a427598ced5067fc59f3ae9a98cf35.zip frameworks_base-2e2beaaee2a427598ced5067fc59f3ae9a98cf35.tar.gz frameworks_base-2e2beaaee2a427598ced5067fc59f3ae9a98cf35.tar.bz2 | |
Audio Effects test app
Change-Id: I93fff0e195af3205207ade32ab31f2a760574c7f
Diffstat (limited to 'media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java')
| -rwxr-xr-x | media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java b/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java new file mode 100755 index 0000000..f30a26f --- /dev/null +++ b/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java @@ -0,0 +1,407 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.effectstest; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.View.OnClickListener; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import android.widget.EditText; +import android.widget.SeekBar; +import android.widget.ToggleButton; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import java.nio.ByteOrder; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + + +import android.media.audiofx.Equalizer; +import android.media.audiofx.AudioEffect; + +public class EqualizerTest extends Activity implements OnCheckedChangeListener { + + private final static String TAG = "EqualizerTest"; + + private static int NUM_BANDS = 5; + private static int NUM_PARAMS = NUM_BANDS + 1; + + private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS]; + private Equalizer mEqualizer; + ToggleButton mOnOffButton; + ToggleButton mReleaseButton; + EditText mSessionText; + static int sSession = 0; + EffectListner mEffectListener = new EffectListner(); + private static HashMap<Integer, Equalizer> sInstances = new HashMap<Integer, Equalizer>(10); + String mSettings = ""; + + public EqualizerTest() { + Log.d(TAG, "contructor"); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + SeekBar seekBar; + TextView textView; + + setContentView(R.layout.equalizertest); + + mSessionText = (EditText) findViewById(R.id.sessionEdit); + mSessionText.setOnKeyListener(mSessionKeyListener); + + mSessionText.setText(Integer.toString(sSession)); + + mReleaseButton = (ToggleButton)findViewById(R.id.eqReleaseButton); + mOnOffButton = (ToggleButton)findViewById(R.id.equalizerOnOff); + + getEffect(sSession); + + if (mEqualizer != null) { + mReleaseButton.setOnCheckedChangeListener(this); + mOnOffButton.setOnCheckedChangeListener(this); + + short[] bandLevelRange = mEqualizer.getBandLevelRange(); + int centerFreq; + int []freqRange; + + // Band 1 level + centerFreq = mEqualizer.getCenterFreq((short)0); + freqRange = mEqualizer.getBandFreqRange((short)0); + displayFreq(R.id.eqParam1Center, centerFreq); + displayFreq(R.id.eqParam1Min, freqRange[0]); + displayFreq(R.id.eqParam1Max, freqRange[1]); + seekBar = (SeekBar)findViewById(R.id.eqParam1SeekBar); + textView = (TextView)findViewById(R.id.eqParam1Value); + mParameters[0] = new BandLevelParam(mEqualizer, 0, bandLevelRange[0], bandLevelRange[1], seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[0]); + + // Band 2 level + centerFreq = mEqualizer.getCenterFreq((short)1); + freqRange = mEqualizer.getBandFreqRange((short)1); + displayFreq(R.id.eqParam2Center, centerFreq); + displayFreq(R.id.eqParam2Min, freqRange[0]); + displayFreq(R.id.eqParam2Max, freqRange[1]); + seekBar = (SeekBar)findViewById(R.id.eqParam2SeekBar); + textView = (TextView)findViewById(R.id.eqParam2Value); + mParameters[1] = new BandLevelParam(mEqualizer, 1, bandLevelRange[0], bandLevelRange[1], seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[1]); + + // Band 3 level + centerFreq = mEqualizer.getCenterFreq((short)2); + freqRange = mEqualizer.getBandFreqRange((short)2); + displayFreq(R.id.eqParam3Center, centerFreq); + displayFreq(R.id.eqParam3Min, freqRange[0]); + displayFreq(R.id.eqParam3Max, freqRange[1]); + seekBar = (SeekBar)findViewById(R.id.eqParam3SeekBar); + textView = (TextView)findViewById(R.id.eqParam3Value); + mParameters[2] = new BandLevelParam(mEqualizer, 2, bandLevelRange[0], bandLevelRange[1], seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[2]); + + // Band 4 level + centerFreq = mEqualizer.getCenterFreq((short)3); + freqRange = mEqualizer.getBandFreqRange((short)3); + displayFreq(R.id.eqParam4Center, centerFreq); + displayFreq(R.id.eqParam4Min, freqRange[0]); + displayFreq(R.id.eqParam4Max, freqRange[1]); + seekBar = (SeekBar)findViewById(R.id.eqParam4SeekBar); + textView = (TextView)findViewById(R.id.eqParam4Value); + mParameters[3] = new BandLevelParam(mEqualizer, 3, bandLevelRange[0], bandLevelRange[1], seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[3]); + + // Band 5 level + centerFreq = mEqualizer.getCenterFreq((short)4); + freqRange = mEqualizer.getBandFreqRange((short)4); + displayFreq(R.id.eqParam5Center, centerFreq); + displayFreq(R.id.eqParam5Min, freqRange[0]); + displayFreq(R.id.eqParam5Max, freqRange[1]); + seekBar = (SeekBar)findViewById(R.id.eqParam5SeekBar); + textView = (TextView)findViewById(R.id.eqParam5Value); + mParameters[4] = new BandLevelParam(mEqualizer, 4, bandLevelRange[0], bandLevelRange[1], seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[4]); + + // Presets + short numPresets = mEqualizer.getNumberOfPresets(); + seekBar = (SeekBar)findViewById(R.id.eqParam6SeekBar); + textView = (TextView)findViewById(R.id.eqParam6Value); + mParameters[5] = new PresetParam(mEqualizer, (short)0, (short)(numPresets-1), seekBar, textView); + seekBar.setOnSeekBarChangeListener(mParameters[5]); + } + } + + @Override + public void onResume() { + super.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + } + + private View.OnKeyListener mSessionKeyListener + = new View.OnKeyListener() { + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + try { + sSession = Integer.parseInt(mSessionText.getText().toString()); + getEffect(sSession); + if (mEqualizer != null) { + for (int i = 0 ; i < mParameters.length; i++) { + mParameters[i].setEffect(mEqualizer); + mParameters[i].setEnabled(true); + } + } + } catch (NumberFormatException e) { + Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString()); + } + + return true; + } + } + return false; + } + }; + + // OnCheckedChangeListener + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (buttonView.getId() == R.id.equalizerOnOff) { + if (mEqualizer != null) { + mEqualizer.setEnabled(isChecked); + updateBands(); + } + } + if (buttonView.getId() == R.id.eqReleaseButton) { + if (isChecked) { + if (mEqualizer == null) { + getEffect(sSession); + if (mEqualizer != null) { + for (int i = 0 ; i < mParameters.length; i++) { + mParameters[i].setEffect(mEqualizer); + mParameters[i].setEnabled(true); + } + } + } + } else { + if (mEqualizer != null) { + for (int i = 0 ; i < mParameters.length; i++) { + mParameters[i].setEnabled(false); + } + putEffect(sSession); + } + } + } + } + + protected void updateBands() { + for (int i = 0 ; i < NUM_BANDS; i++) { + mParameters[i].updateDisplay(); + } + } + + private void displayFreq(int viewId, int freq) { + TextView textView = (TextView)findViewById(viewId); + String text = Integer.toString(freq/1000)+" Hz"; + textView.setText(text); + } + + private class EqualizerParam extends EffectParameter { + private Equalizer mEqualizer; + + public EqualizerParam(Equalizer equalizer, int min, int max, SeekBar seekBar, TextView textView, String unit) { + super (min, max, seekBar, textView, unit); + + mEqualizer = equalizer; + updateDisplay(); + } + + @Override + public void setParameter(Integer value) { + } + + @Override + public Integer getParameter() { + return new Integer(0); + } + + @Override + public void setEffect(Object eq) { + mEqualizer = (Equalizer)eq; + } + } + + private class BandLevelParam extends EqualizerParam { + private int mBand; + + public BandLevelParam(Equalizer equalizer, int band, short min, short max, SeekBar seekBar, TextView textView) { + super (equalizer, min, max, seekBar, textView, "mB"); + + mBand = band; + mEqualizer = equalizer; + updateDisplay(); + } + + @Override + public void setParameter(Integer value) { + if (mEqualizer != null) { + mEqualizer.setBandLevel((short)mBand, value.shortValue()); + } + } + + @Override + public Integer getParameter() { + if (mEqualizer != null) { + return new Integer(mEqualizer.getBandLevel((short)mBand)); + } + return new Integer(0); + } + } + + private class PresetParam extends EqualizerParam { + + public PresetParam(Equalizer equalizer, short min, short max, SeekBar seekBar, TextView textView) { + super (equalizer, min, max, seekBar, textView, ""); + + mEqualizer = equalizer; + updateDisplay(); + } + + @Override + public void setParameter(Integer value) { + if (mEqualizer != null) { + mEqualizer.usePreset(value.shortValue()); + } + } + + @Override + public Integer getParameter() { + if (mEqualizer != null) { + return new Integer(mEqualizer.getCurrentPreset()); + } + return new Integer(0); + } + + @Override + public void displayValue(int value, boolean fromTouch) { + String text = mEqualizer.getPresetName((short)value); + mValueText.setText(text); + if (!fromTouch) { + mSeekBar.setProgress(value - mMin); + } else { + updateBands(); + } + } + } + + public class EffectListner implements AudioEffect.OnEnableStatusChangeListener, + AudioEffect.OnControlStatusChangeListener, + Equalizer.OnParameterChangeListener + { + public EffectListner() { + } + public void onEnableStatusChange(AudioEffect effect, boolean enabled) { + Log.d(TAG,"onEnableStatusChange: "+ enabled); + } + public void onControlStatusChange(AudioEffect effect, boolean controlGranted) { + Log.d(TAG,"onControlStatusChange: "+ controlGranted); + } + + public void onParameterChange(Equalizer effect, int status, int param1, int param2, int value) { + Log.d(TAG,"onParameterChange EQ, status: "+status+" p1: "+param1+" p2: "+param2+" v: "+value); + } + + private int byteArrayToInt(byte[] valueBuf, int offset) { + ByteBuffer converter = ByteBuffer.wrap(valueBuf); + converter.order(ByteOrder.nativeOrder()); + return converter.getInt(offset); + + } + private short byteArrayToShort(byte[] valueBuf, int offset) { + ByteBuffer converter = ByteBuffer.wrap(valueBuf); + converter.order(ByteOrder.nativeOrder()); + return converter.getShort(offset); + + } + } + + private void getEffect(int session) { + synchronized (sInstances) { + if (sInstances.containsKey(session)) { + mEqualizer = sInstances.get(session); + } else { + try{ + mEqualizer = new Equalizer(0, session); + } catch (IllegalArgumentException e) { + Log.e(TAG,"Equalizer effect not supported"); + } catch (UnsupportedOperationException e) { + Log.e(TAG,"Equalizer library not loaded"); + } catch (IllegalStateException e) { + Log.e(TAG,"Equalizer cannot get presets"); + } catch (RuntimeException e) { + Log.e(TAG,"Equalizer effect not found"); + } + sInstances.put(session, mEqualizer); + } + } + mReleaseButton.setEnabled(false); + mOnOffButton.setEnabled(false); + if (mEqualizer != null) { + if (mSettings != "") { + Log.d(TAG,"Equalizer settings: "+mSettings); + mEqualizer.setProperties(new Equalizer.Settings(mSettings)); + } + + mEqualizer.setEnableStatusListener(mEffectListener); + mEqualizer.setControlStatusListener(mEffectListener); + mEqualizer.setParameterListener(mEffectListener); + + mReleaseButton.setChecked(true); + mReleaseButton.setEnabled(true); + + mOnOffButton.setChecked(mEqualizer.getEnabled()); + mOnOffButton.setEnabled(true); + } + } + + private void putEffect(int session) { +// mOnOffButton.setChecked(false); + mOnOffButton.setEnabled(false); + synchronized (sInstances) { + if (mEqualizer != null) { + mSettings = mEqualizer.getProperties().toString(); + mEqualizer.release(); + Log.d(TAG,"Equalizer released, settings: "+mSettings); + mEqualizer = null; + sInstances.remove(session); + } + } + } +} |
