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