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