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 import android.media.audiofx.PresetReverb; 42 import android.media.audiofx.AudioEffect; 43 44 public class PresetReverbTest extends Activity implements OnCheckedChangeListener { 45 46 private final static String TAG = "PresetReverbTest"; 47 48 private static int NUM_PARAMS = 1; 49 50 private EffectParameter[] mParameters = new EffectParameter[NUM_PARAMS]; 51 private PresetReverb mPresetReverb; 52 ToggleButton mOnOffButton; 53 ToggleButton mReleaseButton; 54 EditText mSessionText; 55 static int sSession = 0; 56 EffectListner mEffectListener = new EffectListner(); 57 private static HashMap<Integer, PresetReverb> sInstances = new HashMap<Integer, PresetReverb>(10); 58 String mSettings = ""; 59 PresetReverbTest()60 public PresetReverbTest() { 61 Log.d(TAG, "contructor"); 62 } 63 64 private static String[] sPresetNames = { 65 "NONE", //PresetReverb.PRESET_NONE 66 "SMALLROOM", //PresetReverb.PRESET_SMALLROOM 67 "MEDIUMROOM", //PresetReverb.PRESET_MEDIUMROOM 68 "LARGEROOM", //PresetReverb.PRESET_LARGEROOM 69 "MEDIUMHALL", //PresetReverb.PRESET_MEDIUMHALL 70 "LARGEHALL", //PresetReverb.PRESET_LARGEHALL 71 "PLATE", //PresetReverb.PRESET_PLATE 72 }; 73 74 @Override onCreate(Bundle icicle)75 public void onCreate(Bundle icicle) { 76 super.onCreate(icicle); 77 78 setContentView(R.layout.presetreverbtest); 79 80 mSessionText = (EditText) findViewById(R.id.sessionEdit); 81 mSessionText.setOnKeyListener(mSessionKeyListener); 82 83 mSessionText.setText(Integer.toString(sSession)); 84 85 mReleaseButton = (ToggleButton)findViewById(R.id.presetrvbReleaseButton); 86 mOnOffButton = (ToggleButton)findViewById(R.id.presetrvbOnOff); 87 88 getEffect(sSession); 89 90 if (mPresetReverb != null) { 91 mReleaseButton.setOnCheckedChangeListener(this); 92 mOnOffButton.setOnCheckedChangeListener(this); 93 // Presets 94 SeekBar seekBar = (SeekBar)findViewById(R.id.presetrvbParam1SeekBar); 95 TextView textView = (TextView)findViewById(R.id.presetrvbParam1Value); 96 mParameters[0] = new PresetParam(mPresetReverb, (short)0, (short)(sPresetNames.length - 1), seekBar, textView); 97 seekBar.setOnSeekBarChangeListener(mParameters[0]); 98 } 99 } 100 101 @Override onResume()102 public void onResume() { 103 super.onResume(); 104 } 105 106 @Override onPause()107 public void onPause() { 108 super.onPause(); 109 } 110 111 private View.OnKeyListener mSessionKeyListener 112 = new View.OnKeyListener() { 113 public boolean onKey(View v, int keyCode, KeyEvent event) { 114 if (event.getAction() == KeyEvent.ACTION_DOWN) { 115 switch (keyCode) { 116 case KeyEvent.KEYCODE_DPAD_CENTER: 117 case KeyEvent.KEYCODE_ENTER: 118 try { 119 sSession = Integer.parseInt(mSessionText.getText().toString()); 120 getEffect(sSession); 121 if (mPresetReverb != null) { 122 for (int i = 0 ; i < mParameters.length; i++) { 123 mParameters[i].setEffect(mPresetReverb); 124 mParameters[i].setEnabled(true); 125 mParameters[i].updateDisplay(); 126 } 127 } 128 } catch (NumberFormatException e) { 129 Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString()); 130 } 131 132 return true; 133 } 134 } 135 return false; 136 } 137 }; 138 139 // OnCheckedChangeListener onCheckedChanged(CompoundButton buttonView, boolean isChecked)140 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 141 if (buttonView.getId() == R.id.presetrvbOnOff) { 142 if (mPresetReverb != null) { 143 mPresetReverb.setEnabled(isChecked); 144 updateParams(); 145 } 146 } 147 if (buttonView.getId() == R.id.presetrvbReleaseButton) { 148 if (isChecked) { 149 if (mPresetReverb == null) { 150 getEffect(sSession); 151 if (mPresetReverb != null) { 152 for (int i = 0 ; i < mParameters.length; i++) { 153 mParameters[i].setEffect(mPresetReverb); 154 mParameters[i].setEnabled(true); 155 mParameters[i].updateDisplay(); 156 } 157 } 158 } 159 } else { 160 if (mPresetReverb != null) { 161 for (int i = 0 ; i < mParameters.length; i++) { 162 mParameters[i].setEnabled(false); 163 } 164 putEffect(sSession); 165 } 166 } 167 } 168 } 169 170 private class PresetParam extends EffectParameter { 171 private PresetReverb mPresetReverb; 172 PresetParam(PresetReverb presetrvb, short min, short max, SeekBar seekBar, TextView textView)173 public PresetParam(PresetReverb presetrvb, short min, short max, SeekBar seekBar, TextView textView) { 174 super (min, max, seekBar, textView, ""); 175 176 mPresetReverb = presetrvb; 177 updateDisplay(); 178 } 179 180 @Override setParameter(Integer value)181 public void setParameter(Integer value) { 182 if (mPresetReverb != null) { 183 mPresetReverb.setPreset(value.shortValue()); 184 } 185 } 186 187 @Override getParameter()188 public Integer getParameter() { 189 if (mPresetReverb != null) { 190 return new Integer(mPresetReverb.getPreset()); 191 } 192 return new Integer(0); 193 } 194 195 @Override displayValue(int value, boolean fromTouch)196 public void displayValue(int value, boolean fromTouch) { 197 mValueText.setText(sPresetNames[value]); 198 if (!fromTouch) { 199 mSeekBar.setProgress(value - mMin); 200 } else { 201 updateParams(); 202 } 203 } 204 205 @Override setEffect(Object presetrvb)206 public void setEffect(Object presetrvb) { 207 mPresetReverb = (PresetReverb)presetrvb; 208 } 209 210 } 211 updateParams()212 protected void updateParams() { 213 for (int i = 0 ; i < mParameters.length; i++) { 214 mParameters[i].updateDisplay(); 215 } 216 } 217 218 public class EffectListner implements AudioEffect.OnEnableStatusChangeListener, 219 AudioEffect.OnControlStatusChangeListener, 220 PresetReverb.OnParameterChangeListener 221 { EffectListner()222 public EffectListner() { 223 } onEnableStatusChange(AudioEffect effect, boolean enabled)224 public void onEnableStatusChange(AudioEffect effect, boolean enabled) { 225 Log.d(TAG,"onEnableStatusChange: "+ enabled); 226 } onControlStatusChange(AudioEffect effect, boolean controlGranted)227 public void onControlStatusChange(AudioEffect effect, boolean controlGranted) { 228 Log.d(TAG,"onControlStatusChange: "+ controlGranted); 229 } 230 onParameterChange(PresetReverb effect, int status, int param, short value)231 public void onParameterChange(PresetReverb effect, int status, int param, short value) { 232 Log.d(TAG,"onParameterChange, status: "+status+" p: "+param+" v: "+value); 233 } 234 byteArrayToInt(byte[] valueBuf, int offset)235 private int byteArrayToInt(byte[] valueBuf, int offset) { 236 ByteBuffer converter = ByteBuffer.wrap(valueBuf); 237 converter.order(ByteOrder.nativeOrder()); 238 return converter.getInt(offset); 239 240 } byteArrayToShort(byte[] valueBuf, int offset)241 private short byteArrayToShort(byte[] valueBuf, int offset) { 242 ByteBuffer converter = ByteBuffer.wrap(valueBuf); 243 converter.order(ByteOrder.nativeOrder()); 244 return converter.getShort(offset); 245 246 } 247 } 248 getEffect(int session)249 private void getEffect(int session) { 250 synchronized (sInstances) { 251 if (sInstances.containsKey(session)) { 252 mPresetReverb = sInstances.get(session); 253 } else { 254 try{ 255 mPresetReverb = new PresetReverb(0, session); 256 } catch (IllegalArgumentException e) { 257 Log.e(TAG,"PresetReverb effect not supported"); 258 } catch (UnsupportedOperationException e) { 259 Log.e(TAG,"PresetReverb library not loaded"); 260 } catch (RuntimeException e) { 261 Log.e(TAG,"PresetReverb effect not found"); 262 } 263 sInstances.put(session, mPresetReverb); 264 } 265 } 266 mReleaseButton.setEnabled(false); 267 mOnOffButton.setEnabled(false); 268 269 if (mPresetReverb != null) { 270 if (mSettings != "") { 271 mPresetReverb.setProperties(new PresetReverb.Settings(mSettings)); 272 } 273 mPresetReverb.setEnableStatusListener(mEffectListener); 274 mPresetReverb.setControlStatusListener(mEffectListener); 275 mPresetReverb.setParameterListener(mEffectListener); 276 277 mReleaseButton.setChecked(true); 278 mReleaseButton.setEnabled(true); 279 280 mOnOffButton.setChecked(mPresetReverb.getEnabled()); 281 mOnOffButton.setEnabled(true); 282 } 283 } 284 putEffect(int session)285 private void putEffect(int session) { 286 mOnOffButton.setChecked(false); 287 mOnOffButton.setEnabled(false); 288 synchronized (sInstances) { 289 if (mPresetReverb != null) { 290 mSettings = mPresetReverb.getProperties().toString(); 291 mPresetReverb.release(); 292 Log.d(TAG,"PresetReverb released"); 293 mPresetReverb = null; 294 sInstances.remove(session); 295 } 296 } 297 } 298 } 299