/* * 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.SeekBar; import android.widget.ToggleButton; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageButton; import android.widget.ImageView; import java.util.HashMap; import java.util.Map; import android.media.audiofx.EnvironmentalReverb; import android.media.audiofx.AudioEffect; import android.media.AudioManager; public class EnvReverbTest extends Activity implements OnCheckedChangeListener, SeekBar.OnSeekBarChangeListener { private final static String TAG = "EnvReverbTest"; private static int NUM_PARAMS = 10; private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS]; private EnvironmentalReverb mReverb; ToggleButton mOnOffButton; ToggleButton mReleaseButton; ToggleButton mAttachButton; private static HashMap<Integer, EnvironmentalReverb> sInstances = new HashMap<Integer, EnvironmentalReverb>(10); static SimplePlayer sPlayerController = null; SeekBar mSendLevelSeekBar; TextView mSendLevelDisplay; static float sSendLevel = linToExp(50,100); static boolean sAttached = false; String mSettings = ""; public EnvReverbTest() { Log.d(TAG, "contructor"); } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Log.d(TAG, "onCreate"); SeekBar seekBar; TextView textView; ToggleButton button; setContentView(R.layout.envreverbtest); ImageView playPause = (ImageView) findViewById(R.id.playPause1); ImageView stop = (ImageView) findViewById(R.id.stop1); textView = (TextView) findViewById(R.id.sessionText); if (sPlayerController == null) { sPlayerController = new SimplePlayer(this, R.id.playPause1, playPause, R.id.stop1, stop, textView, R.raw.mp3_sample, AudioManager.STREAM_MUSIC, 0); } else { sPlayerController.set(this, R.id.playPause1, playPause, R.id.stop1, stop, textView, AudioManager.STREAM_MUSIC, 0); } // send level mSendLevelSeekBar = (SeekBar)findViewById(R.id.sendLevelSeekBar); mSendLevelDisplay = (TextView)findViewById(R.id.sendLevelValue); mSendLevelSeekBar.setMax(100); mSendLevelSeekBar.setOnSeekBarChangeListener(this); mSendLevelSeekBar.setProgress(expToLin(sSendLevel,100)); sPlayerController.setAuxEffectSendLevel(sSendLevel); mOnOffButton = (ToggleButton)findViewById(R.id.rvbOnOff); mReleaseButton = (ToggleButton)findViewById(R.id.rvbReleaseButton); mAttachButton = (ToggleButton)findViewById(R.id.attachButton); getEffect(0); if (mReverb != null) { mOnOffButton.setOnCheckedChangeListener(this); mReleaseButton.setOnCheckedChangeListener(this); mAttachButton.setOnCheckedChangeListener(this); // button = (ToggleButton)findViewById(R.id.rvbBypass); // button.setChecked(false); // button.setOnCheckedChangeListener(this); // Room level seekBar = (SeekBar)findViewById(R.id.rvbParam1SeekBar); textView = (TextView)findViewById(R.id.rvbParam1Value); mParameters[0] = new RoomLevelParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[0]); // Room HF level seekBar = (SeekBar)findViewById(R.id.rvbParam2SeekBar); textView = (TextView)findViewById(R.id.rvbParam2Value); mParameters[1] = new RoomHFLevelParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[1]); // Decay time seekBar = (SeekBar)findViewById(R.id.rvbParam3SeekBar); textView = (TextView)findViewById(R.id.rvbParam3Value); mParameters[2] = new DecayTimeParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[2]); // Decay HF ratio seekBar = (SeekBar)findViewById(R.id.rvbParam4SeekBar); textView = (TextView)findViewById(R.id.rvbParam4Value); mParameters[3] = new DecayHFRatioParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[3]); // Reflections level seekBar = (SeekBar)findViewById(R.id.rvbParam5SeekBar); textView = (TextView)findViewById(R.id.rvbParam5Value); mParameters[4] = new ReflectionsLevelParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[4]); // Reflections delay seekBar = (SeekBar)findViewById(R.id.rvbParam6SeekBar); textView = (TextView)findViewById(R.id.rvbParam6Value); mParameters[5] = new ReflectionsDelayParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[5]); // Reverb level seekBar = (SeekBar)findViewById(R.id.rvbParam7SeekBar); textView = (TextView)findViewById(R.id.rvbParam7Value); mParameters[6] = new ReverbLevelParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[6]); // Reverb delay seekBar = (SeekBar)findViewById(R.id.rvbParam8SeekBar); textView = (TextView)findViewById(R.id.rvbParam8Value); mParameters[7] = new ReverbDelayParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[7]); // Diffusion seekBar = (SeekBar)findViewById(R.id.rvbParam9SeekBar); textView = (TextView)findViewById(R.id.rvbParam9Value); mParameters[8] = new DiffusionParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[8]); // Density seekBar = (SeekBar)findViewById(R.id.rvbParam10SeekBar); textView = (TextView)findViewById(R.id.rvbParam10Value); mParameters[9] = new DensityParam(mReverb, seekBar, textView); seekBar.setOnSeekBarChangeListener(mParameters[9]); } } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override public void onPause() { super.onPause(); } // OnCheckedChangeListener public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.getId() == R.id.rvbOnOff) { if (mReverb != null) { mReverb.setEnabled(isChecked); Log.d(TAG,"onCheckedChanged: rvbOnOff"); for (int i = 0 ; i < mParameters.length; i++) { mParameters[i].updateDisplay(); } } } if (buttonView.getId() == R.id.rvbReleaseButton) { if (isChecked) { if (mReverb == null) { getEffect(0); for (int i = 0 ; i < mParameters.length; i++) { mParameters[i].setEffect(mReverb); mParameters[i].setEnabled(true); } } } else { if (mReverb != null) { for (int i = 0 ; i < mParameters.length; i++) { mParameters[i].setEnabled(false); } putEffect(0); } } } // if (buttonView.getId() == R.id.rvbBypass) { // // REVERB_PARAM_BYPASS parametervalue is 11 in EffectEnvironmentalReverApi.h // if (mReverb != null) { // if (isChecked) { // mReverb.setParameter((int)11, (int)1); // } else { // mReverb.setParameter((int)11, (int)0); // } // } // } if (buttonView.getId() == R.id.attachButton) { if (mReverb != null) { if (isChecked) { sPlayerController.attachAuxEffect(mReverb.getId()); sAttached = true; } else { sPlayerController.attachAuxEffect(0); sAttached = false; } } } } // SeekBar.OnSeekBarChangeListener public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { if (seekBar != mSendLevelSeekBar) { Log.e(TAG, "onProgressChanged called with wrong seekBar"); return; } sSendLevel = linToExp(progress,100); if (fromTouch) { sPlayerController.setAuxEffectSendLevel(sSendLevel); } String text = Float.toString(sSendLevel); mSendLevelDisplay.setText(text); if (!fromTouch) { seekBar.setProgress(progress); } } static float linToExp(int lin, int range) { if (lin == 0) return 0; return (float)Math.pow((double)10,(double)72*(lin-range)/(20*range)); } static int expToLin(float exp, int range) { if (exp == 0) return 0; return (int)(20*range*Math.log10((double)exp)/72 + range); } public void onStartTrackingTouch(SeekBar seekBar) { } public void onStopTrackingTouch(SeekBar seekBar) { } private class EnvReverbParam extends EffectParameter { private EnvironmentalReverb mReverb; public EnvReverbParam(EnvironmentalReverb reverb, int min, int max, SeekBar seekBar, TextView textView, String unit) { super (min, max, seekBar, textView, unit); mReverb = reverb; updateDisplay(); } @Override public void setParameter(Integer value) { } @Override public Integer getParameter() { return new Integer(0); } @Override public void setEffect(Object reverb) { mReverb = (EnvironmentalReverb)reverb; } } private class RoomLevelParam extends EnvReverbParam { public RoomLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, -9600, 0, seekBar, textView, "mB"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setRoomLevel(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getRoomLevel()); } return new Integer(0); } } private class RoomHFLevelParam extends EnvReverbParam { public RoomHFLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, -4000, 0, seekBar, textView, "mB"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setRoomHFLevel(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getRoomHFLevel()); } return new Integer(0); } } private class DecayTimeParam extends EnvReverbParam { public DecayTimeParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 200, 4000, seekBar, textView, "ms"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setDecayTime(value.intValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return mReverb.getDecayTime(); } return new Integer(0); } } private class DecayHFRatioParam extends EnvReverbParam { public DecayHFRatioParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 100, 1000, seekBar, textView, "permilles"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setDecayHFRatio(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getDecayHFRatio()); } return new Integer(0); } } private class ReflectionsLevelParam extends EnvReverbParam { public ReflectionsLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, -9600, 0, seekBar, textView, "mB"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setReflectionsLevel(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getReflectionsLevel()); } return new Integer(0); } } private class ReflectionsDelayParam extends EnvReverbParam { public ReflectionsDelayParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 0, 65, seekBar, textView, "ms"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setReflectionsDelay(value.intValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return mReverb.getReflectionsDelay(); } return new Integer(0); } } private class ReverbLevelParam extends EnvReverbParam { public ReverbLevelParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, -9600, 2000, seekBar, textView, "mB"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setReverbLevel(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getReverbLevel()); } return new Integer(0); } } private class ReverbDelayParam extends EnvReverbParam { public ReverbDelayParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 0, 65, seekBar, textView, "ms"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setReverbDelay(value.intValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return mReverb.getReverbDelay(); } return new Integer(0); } } private class DiffusionParam extends EnvReverbParam { public DiffusionParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 0, 1000, seekBar, textView, "permilles"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setDiffusion(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getDiffusion()); } return new Integer(0); } } private class DensityParam extends EnvReverbParam { public DensityParam(EnvironmentalReverb reverb, SeekBar seekBar, TextView textView) { super (reverb, 0, 1000, seekBar, textView, "permilles"); } @Override public void setParameter(Integer value) { if (mReverb != null) { mReverb.setDensity(value.shortValue()); } } @Override public Integer getParameter() { if (mReverb != null) { return new Integer(mReverb.getDensity()); } return new Integer(0); } } private void getEffect(int session) { synchronized (sInstances) { if (sInstances.containsKey(session)) { mReverb = sInstances.get(session); } else { try{ mReverb = new EnvironmentalReverb(0, session); } catch (IllegalArgumentException e) { Log.e(TAG,"Reverb effect not supported"); } catch (UnsupportedOperationException e) { Log.e(TAG,"Reverb library not loaded"); } catch (RuntimeException e) { Log.e(TAG,"Reverb effect not found"); } Log.d(TAG, "new reverb: "+mReverb); sInstances.put(session, mReverb); } } mReleaseButton.setEnabled(false); mOnOffButton.setEnabled(false); mAttachButton.setEnabled(false); if (mReverb != null) { if (mSettings != "") { mReverb.setProperties(new EnvironmentalReverb.Settings(mSettings)); } mReleaseButton.setChecked(true); mReleaseButton.setEnabled(true); mOnOffButton.setChecked(mReverb.getEnabled()); mOnOffButton.setEnabled(true); mAttachButton.setChecked(false); mAttachButton.setEnabled(true); if (sAttached) { mAttachButton.setChecked(true); sPlayerController.attachAuxEffect(mReverb.getId()); } } } private void putEffect(int session) { mOnOffButton.setChecked(false); mOnOffButton.setEnabled(false); mAttachButton.setChecked(false); mAttachButton.setEnabled(false); synchronized (sInstances) { if (mReverb != null) { mSettings = mReverb.getProperties().toString(); mReverb.release(); Log.d(TAG,"Reverb released, settings: "+mSettings); mReverb = null; sInstances.remove(session); } } } }