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.os.Bundle; 21 import android.os.Handler; 22 import android.os.Looper; 23 import android.os.Message; 24 import android.util.Log; 25 import android.view.KeyEvent; 26 import android.view.View; 27 import android.widget.CompoundButton; 28 import android.widget.CompoundButton.OnCheckedChangeListener; 29 import android.widget.EditText; 30 import android.widget.TextView; 31 import android.widget.ToggleButton; 32 33 import java.util.HashMap; 34 35 public class VisualizerTest extends Activity implements OnCheckedChangeListener { 36 37 private final static String TAG = "Visualizer Test"; 38 39 private VisualizerInstance mVisualizer; 40 ToggleButton mMultithreadedButton; 41 ToggleButton mOnOffButton; 42 ToggleButton mReleaseButton; 43 boolean mUseMTInstance; 44 boolean mEnabled; 45 EditText mSessionText; 46 static int sSession = 0; 47 ToggleButton mCallbackButton; 48 boolean mCallbackOn; 49 private static HashMap<Integer, VisualizerInstance> sInstances = 50 new HashMap<Integer, VisualizerInstance>(10); 51 private Handler mUiHandler; 52 VisualizerTest()53 public VisualizerTest() { 54 Log.d(TAG, "contructor"); 55 mUiHandler = new UiHandler(Looper.getMainLooper()); 56 } 57 58 @Override onCreate(Bundle icicle)59 public void onCreate(Bundle icicle) { 60 super.onCreate(icicle); 61 62 TextView textView; 63 64 setContentView(R.layout.visualizertest); 65 66 mSessionText = findViewById(R.id.sessionEdit); 67 mSessionText.setOnKeyListener(mSessionKeyListener); 68 mSessionText.setText(Integer.toString(sSession)); 69 70 mMultithreadedButton = (ToggleButton) findViewById(R.id.visuMultithreadedOnOff); 71 mReleaseButton = (ToggleButton) findViewById(R.id.visuReleaseButton); 72 mOnOffButton = (ToggleButton) findViewById(R.id.visualizerOnOff); 73 mCallbackButton = (ToggleButton) findViewById(R.id.visuCallbackOnOff); 74 mCallbackOn = false; 75 mCallbackButton.setChecked(mCallbackOn); 76 77 mMultithreadedButton.setOnCheckedChangeListener(this); 78 if (getEffect(sSession) != null) { 79 mReleaseButton.setOnCheckedChangeListener(this); 80 mOnOffButton.setOnCheckedChangeListener(this); 81 mCallbackButton.setOnCheckedChangeListener(this); 82 } 83 } 84 85 public static final int MSG_DISPLAY_WAVEFORM_VAL = 0; 86 public static final int MSG_DISPLAY_FFT_VAL = 1; 87 88 private class UiHandler extends Handler { UiHandler(Looper looper)89 UiHandler(Looper looper) { 90 super(looper); 91 } 92 93 @Override handleMessage(Message msg)94 public void handleMessage(Message msg) { 95 switch (msg.what) { 96 case MSG_DISPLAY_WAVEFORM_VAL: 97 case MSG_DISPLAY_FFT_VAL: 98 int[] minMaxCenter = (int[]) msg.obj; 99 boolean waveform = msg.what == MSG_DISPLAY_WAVEFORM_VAL; 100 displayVal(waveform ? R.id.waveformMin : R.id.fftMin, minMaxCenter[0]); 101 displayVal(waveform ? R.id.waveformMax : R.id.fftMax, minMaxCenter[1]); 102 displayVal(waveform ? R.id.waveformCenter : R.id.fftCenter, minMaxCenter[2]); 103 break; 104 } 105 } 106 } 107 108 private View.OnKeyListener mSessionKeyListener = new View.OnKeyListener() { 109 public boolean onKey(View v, int keyCode, KeyEvent event) { 110 if (event.getAction() == KeyEvent.ACTION_DOWN) { 111 switch (keyCode) { 112 case KeyEvent.KEYCODE_DPAD_CENTER: 113 case KeyEvent.KEYCODE_ENTER: 114 try { 115 sSession = Integer.parseInt(mSessionText.getText().toString()); 116 getEffect(sSession); 117 } catch (NumberFormatException e) { 118 Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString()); 119 } 120 121 return true; 122 } 123 } 124 return false; 125 } 126 }; 127 128 // OnCheckedChangeListener 129 @Override onCheckedChanged(CompoundButton buttonView, boolean isChecked)130 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 131 if (buttonView.getId() == R.id.visuMultithreadedOnOff) { 132 mUseMTInstance = isChecked; 133 Log.d(TAG, "Multi-threaded client: " + (isChecked ? "enabled" : "disabled")); 134 } 135 if (buttonView.getId() == R.id.visualizerOnOff) { 136 if (mVisualizer != null) { 137 mEnabled = isChecked; 138 mCallbackButton.setEnabled(!mEnabled); 139 if (mCallbackOn && mEnabled) { 140 mVisualizer.enableDataCaptureListener(true); 141 } 142 mVisualizer.setEnabled(mEnabled); 143 if (mCallbackOn) { 144 if (!mEnabled) { 145 mVisualizer.enableDataCaptureListener(false); 146 } 147 } else { 148 mVisualizer.startStopCapture(isChecked); 149 } 150 } 151 } 152 if (buttonView.getId() == R.id.visuReleaseButton) { 153 if (isChecked) { 154 if (mVisualizer == null) { 155 getEffect(sSession); 156 } 157 } else { 158 if (mVisualizer != null) { 159 putEffect(sSession); 160 } 161 } 162 } 163 if (buttonView.getId() == R.id.visuCallbackOnOff) { 164 mCallbackOn = isChecked; 165 } 166 } 167 displayVal(int viewId, int val)168 private void displayVal(int viewId, int val) { 169 TextView textView = (TextView)findViewById(viewId); 170 String text = Integer.toString(val); 171 textView.setText(text); 172 } 173 174 getEffect(int session)175 private VisualizerInstance getEffect(int session) { 176 synchronized (sInstances) { 177 if (sInstances.containsKey(session)) { 178 mVisualizer = sInstances.get(session); 179 } else { 180 try { 181 mVisualizer = mUseMTInstance 182 ? new VisualizerInstanceMT(session, mUiHandler, 0 /*extraThreadCount*/) 183 : new VisualizerInstanceSync(session, mUiHandler); 184 } catch (RuntimeException e) { 185 throw e; 186 } 187 sInstances.put(session, mVisualizer); 188 } 189 } 190 mReleaseButton.setEnabled(false); 191 mOnOffButton.setEnabled(false); 192 if (mVisualizer != null) { 193 mReleaseButton.setChecked(true); 194 mReleaseButton.setEnabled(true); 195 196 mEnabled = mVisualizer.getEnabled(); 197 mOnOffButton.setChecked(mEnabled); 198 mOnOffButton.setEnabled(true); 199 200 mCallbackButton.setEnabled(!mEnabled); 201 } 202 return mVisualizer; 203 } 204 putEffect(int session)205 private void putEffect(int session) { 206 mOnOffButton.setChecked(false); 207 mOnOffButton.setEnabled(false); 208 synchronized (sInstances) { 209 if (mVisualizer != null) { 210 mVisualizer.release(); 211 sInstances.remove(session); 212 mVisualizer = null; 213 } 214 } 215 } 216 217 } 218