12e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen/* 22e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Copyright (C) 2009 The Android Open Source Project 32e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * 42e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 52e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * you may not use this file except in compliance with the License. 62e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * You may obtain a copy of the License at 72e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * 82e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 92e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * 102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Unless required by applicable law or agreed to in writing, software 112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * See the License for the specific language governing permissions and 142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * limitations under the License. 152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen */ 162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpackage com.android.effectstest; 182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.app.Activity; 202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.Context; 212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.Intent; 222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.audiofx.Visualizer; 232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Bundle; 242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Handler; 252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Looper; 262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Message; 272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.util.Log; 282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.KeyEvent; 292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.Menu; 302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View; 312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View.OnClickListener; 322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.ViewGroup; 332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.Button; 342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton; 352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener; 362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.EditText; 372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.TextView; 382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ToggleButton; 392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.SeekBar; 402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteOrder; 422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteBuffer; 432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.HashMap; 442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.Map; 452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpublic class VisualizerTest extends Activity implements OnCheckedChangeListener { 472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private final static String TAG = "Visualizer Test"; 492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private Visualizer mVisualizer; 512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen ToggleButton mOnOffButton; 522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen ToggleButton mReleaseButton; 532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen boolean mEnabled; 542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen EditText mSessionText; 552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen static int sSession = 0; 562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen int mCaptureSize; 572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen ToggleButton mCallbackButton; 582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen boolean mCallbackOn; 592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen VisualizerListener mVisualizerListener; 602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private static HashMap<Integer, Visualizer> sInstances = new HashMap<Integer, Visualizer>(10); 612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private VisualizerTestHandler mVisualizerTestHandler = null; 622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public VisualizerTest() { 642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "contructor"); 652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen @Override 682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onCreate(Bundle icicle) { 692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen super.onCreate(icicle); 702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen TextView textView; 722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen setContentView(R.layout.visualizertest); 742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mSessionText = (EditText) findViewById(R.id.sessionEdit); 762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mSessionText.setOnKeyListener(mSessionKeyListener); 772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mSessionText.setText(Integer.toString(sSession)); 782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mReleaseButton = (ToggleButton)findViewById(R.id.visuReleaseButton); 802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton = (ToggleButton)findViewById(R.id.visualizerOnOff); 812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackButton = (ToggleButton)findViewById(R.id.visuCallbackOnOff); 822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackOn = false; 832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackButton.setChecked(mCallbackOn); 842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizerTestHandler = new VisualizerTestHandler(); 862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizerListener = new VisualizerListener(); 872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen getEffect(sSession); 892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer != null) { 912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mReleaseButton.setOnCheckedChangeListener(this); 922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setOnCheckedChangeListener(this); 932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackButton.setOnCheckedChangeListener(this); 942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private static final int MSG_START_CAPTURE = 0; 982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private static final int MSG_STOP_CAPTURE = 1; 992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private static final int MSG_NEW_CAPTURE = 2; 1002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private static final int CAPTURE_PERIOD_MS = 100; 1012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private class VisualizerTestHandler extends Handler { 1032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen boolean mActive = false; 1042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen @Override 1052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void handleMessage(Message msg) { 1062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen switch (msg.what) { 1072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen case MSG_START_CAPTURE: 1082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (!mActive) { 1092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "Start capture"); 1102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mActive = true; 1112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen sendMessageDelayed(obtainMessage(MSG_NEW_CAPTURE, 0, 0, null), CAPTURE_PERIOD_MS); 1122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen break; 1142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen case MSG_STOP_CAPTURE: 1152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mActive) { 1162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "Stop capture"); 1172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mActive = false; 1182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen break; 1202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen case MSG_NEW_CAPTURE: 1212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mActive && mVisualizer != null) { 1222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mCaptureSize > 0) { 1232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen byte[] data = new byte[mCaptureSize]; 1242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer.getWaveForm(data) == Visualizer.SUCCESS) { 1252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen int len = data.length < mCaptureSize ? data.length : mCaptureSize; 1262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformMin, data[0]); 1272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformMax, data[len-1]); 1282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformCenter, data[len/2]); 1292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen }; 1302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer.getFft(data) == Visualizer.SUCCESS) { 1312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen int len = data.length < mCaptureSize ? data.length : mCaptureSize; 1322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftMin, data[0]); 1332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftMax, data[len-1]); 1342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftCenter, data[len/2]); 1352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen }; 1362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen sendMessageDelayed(obtainMessage(MSG_NEW_CAPTURE, 0, 0, null), CAPTURE_PERIOD_MS); 1382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen break; 1402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private class VisualizerListener implements Visualizer.OnDataCaptureListener { 1452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public VisualizerListener() { 1472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) { 1492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (visualizer == mVisualizer) { 1502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (waveform.length > 0) { 1512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "onWaveFormDataCapture(): "+waveform[0]+" smp rate: "+samplingRate/1000); 1522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformMin, waveform[0]); 1532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformMax, waveform[waveform.length - 1]); 1542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.waveformCenter, waveform[waveform.length/2]); 1552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) { 1592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (visualizer == mVisualizer) { 1602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (fft.length > 0) { 1612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "onFftDataCapture(): "+fft[0]); 1622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftMin, fft[0]); 1632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftMax, fft[fft.length - 1]); 1642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen displayVal(R.id.fftCenter, fft[fft.length/2]); 1652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen @Override 1712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onResume() { 1722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen super.onResume(); 1732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen @Override 1762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onPause() { 1772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen super.onPause(); 1782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private View.OnKeyListener mSessionKeyListener 1812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen = new View.OnKeyListener() { 1822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public boolean onKey(View v, int keyCode, KeyEvent event) { 1832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (event.getAction() == KeyEvent.ACTION_DOWN) { 1842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen switch (keyCode) { 1852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen case KeyEvent.KEYCODE_DPAD_CENTER: 1862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen case KeyEvent.KEYCODE_ENTER: 1872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen try { 1882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen sSession = Integer.parseInt(mSessionText.getText().toString()); 1892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen getEffect(sSession); 1902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } catch (NumberFormatException e) { 1912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG, "Invalid session #: "+mSessionText.getText().toString()); 1922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 1942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen return true; 1952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen return false; 1982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 1992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen }; 2002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen // OnCheckedChangeListener 2022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 2032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (buttonView.getId() == R.id.visualizerOnOff) { 2042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer != null) { 2052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mEnabled = isChecked; 2062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackButton.setEnabled(!mEnabled); 2072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mCallbackOn && mEnabled) { 2082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer.setDataCaptureListener(mVisualizerListener, 2092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 10000, 2102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen true, 2112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen true); 2122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer.setEnabled(mEnabled); 2142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mCallbackOn) { 2152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (!mEnabled) { 2162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer.setDataCaptureListener(null, 2172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 10000, 2182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen false, 2192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen false); 2202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } else { 2222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen int msg = isChecked ? MSG_START_CAPTURE : MSG_STOP_CAPTURE; 2232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizerTestHandler.sendMessage( 2242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizerTestHandler.obtainMessage(msg, 0, 0, null)); 2252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (buttonView.getId() == R.id.visuReleaseButton) { 2292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (isChecked) { 2302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer == null) { 2312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen getEffect(sSession); 2322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } else { 2342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer != null) { 2352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen putEffect(sSession); 2362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (buttonView.getId() == R.id.visuCallbackOnOff) { 2402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackOn = isChecked; 2412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private void displayVal(int viewId, int val) { 2452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen TextView textView = (TextView)findViewById(viewId); 2462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen String text = Integer.toString(val); 2472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen textView.setText(text); 2482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private void getEffect(int session) { 2522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen synchronized (sInstances) { 2532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (sInstances.containsKey(session)) { 2542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer = sInstances.get(session); 2552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } else { 2562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen try{ 2572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer = new Visualizer(session); 2582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } catch (UnsupportedOperationException e) { 2592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.e(TAG,"Visualizer library not loaded"); 2602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen throw (new RuntimeException("Cannot initialize effect")); 2612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } catch (RuntimeException e) { 2622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen throw e; 2632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen sInstances.put(session, mVisualizer); 2652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mReleaseButton.setEnabled(false); 2682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setEnabled(false); 2692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer != null) { 2702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCaptureSize = mVisualizer.getCaptureSize(); 2712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mReleaseButton.setChecked(true); 2732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mReleaseButton.setEnabled(true); 2742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mEnabled = mVisualizer.getEnabled(); 2762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setChecked(mEnabled); 2772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setEnabled(true); 2782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mCallbackButton.setEnabled(!mEnabled); 2802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen private void putEffect(int session) { 2842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setChecked(false); 2852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mOnOffButton.setEnabled(false); 2862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen synchronized (sInstances) { 2872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen if (mVisualizer != null) { 2882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer.release(); 2892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen Log.d(TAG,"Visualizer released"); 2902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen mVisualizer = null; 2912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen sInstances.remove(session); 2922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen } 2952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen 2962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen} 297