/* * 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 sInstances = new HashMap(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); } } } }