blob: f30a26f39c644d491acca876db68bd1fdaaeb7d6 [file] [log] [blame]
/*
* 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);
}
}
}
}