1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license that can be found
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the LICENSE file in the root of the source tree. An additional
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * intellectual property rights grant can be found in the file PATENTS. All
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * contributing project authors may be found in the AUTHORS file in the root of
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * VoiceEngine Android test application. It starts either auto test or acts like
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * a GUI test.
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpackage org.webrtc.voiceengine.test;
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.File;
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.FileInputStream;
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.FileNotFoundException;
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.FileOutputStream;
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.FileReader;
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.io.IOException;
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.app.Activity;
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.content.Context;
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.media.AudioFormat;
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.media.AudioManager;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.media.AudioRecord;
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.media.AudioTrack;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.media.MediaRecorder;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.os.Bundle;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.util.Log;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.view.View;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.AdapterView;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.ArrayAdapter;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.Button;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.EditText;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.Spinner;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport android.widget.TextView;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic class AndroidTest extends Activity {
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private byte[] _playBuffer = null;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private short[] _circBuffer = new short[8000]; // can hold 50 frames
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _recIndex = 0;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _playIndex = 0;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // private int _streamVolume = 4;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _maxVolume = 0; // Android max level (commonly 5)
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // VoE level (0-255), corresponds to level 4 out of 5
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _volumeLevel = 204;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Thread _playThread;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Thread _recThread;
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Thread _autotestThread;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private static AudioTrack _at;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private static AudioRecord _ar;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private File _fr = null;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private FileInputStream _in = null;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private boolean _isRunningPlay = false;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private boolean _isRunningRec = false;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private boolean _settingSet = true;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private boolean _isCallActive = false;
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private boolean _runAutotest = false; // ENABLE AUTOTEST HERE!
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _channel = -1;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _codecIndex = 0;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _ecIndex = 0;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _nsIndex = 0;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _agcIndex = 0;
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _vadIndex = 0;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _audioIndex = 3;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _settingMenu = 0;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _receivePort = 1234;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private int _destinationPort = 1234;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private String _destinationIP = "127.0.0.1";
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // "Build" settings
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private final boolean _playFromFile = false;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Set to true to send data to native code and back
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private final boolean _runThroughNativeLayer = true;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private final boolean enableSend = true;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private final boolean enableReceive = true;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private final boolean useNativeThread = false;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /** Called when the activity is first created. */
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    public void onCreate(Bundle savedInstanceState) {
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        super.onCreate(savedInstanceState);
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        setContentView(R.layout.main);
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TextView tv = (TextView) findViewById(R.id.TextView01);
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tv.setText("");
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final EditText ed = (EditText) findViewById(R.id.EditText01);
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ed.setWidth(200);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ed.setText(_destinationIP);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final Button buttonStart = (Button) findViewById(R.id.Button01);
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        buttonStart.setWidth(200);
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_runAutotest) {
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            buttonStart.setText("Run test");
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            buttonStart.setText("Start Call");
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // button.layout(50, 50, 100, 40);
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        buttonStart.setOnClickListener(new View.OnClickListener() {
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onClick(View v) {
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_runAutotest) {
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    startAutoTest();
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                } else {
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (_isCallActive) {
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (stopCall() != -1) {
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _isCallActive = false;
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            buttonStart.setText("Start Call");
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        }
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } else {
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _destinationIP = ed.getText().toString();
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        if (startCall() != -1) {
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _isCallActive = true;
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            buttonStart.setText("Stop Call");
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        }
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // displayTextFromFile();
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // recordAudioToFile();
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // if(!_playFromFile)
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // {
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // recAudioInThread();
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // }
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // playAudioInThread();
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        });
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final Button buttonStop = (Button) findViewById(R.id.Button02);
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        buttonStop.setWidth(200);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        buttonStop.setText("Close app");
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        buttonStop.setOnClickListener(new View.OnClickListener() {
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onClick(View v) {
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (!_runAutotest) {
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    ShutdownVoE();
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // This call terminates and should close the activity
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                finish();
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // playAudioFromFile();
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // if(!_playFromFile)
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // {
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // stopRecAudio();
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // }
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // stopPlayAudio();
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        });
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String ap1[] = {"EC off", "AECM"};
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final ArrayAdapter<String> adapterAp1 = new ArrayAdapter<String>(
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        ap1);
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String ap2[] =
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {"NS off", "NS low", "NS moderate", "NS high",
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        "NS very high"};
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final ArrayAdapter<String> adapterAp2 = new ArrayAdapter<String>(
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        ap2);
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String ap3[] = {"AGC off", "AGC adaptive", "AGC fixed"};
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final ArrayAdapter<String> adapterAp3 = new ArrayAdapter<String>(
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        ap3);
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String ap4[] =
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {"VAD off", "VAD conventional", "VAD high rate",
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        "VAD mid rate", "VAD low rate"};
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final ArrayAdapter<String> adapterAp4 = new ArrayAdapter<String>(
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        ap4);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String codecs[] = {"iSAC", "PCMU", "PCMA", "iLBC"};
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final ArrayAdapter<String> adapterCodecs = new ArrayAdapter<String>(
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        codecs);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final Spinner spinnerSettings1 = (Spinner) findViewById(R.id.Spinner01);
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final Spinner spinnerSettings2 = (Spinner) findViewById(R.id.Spinner02);
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings1.setMinimumWidth(200);
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String settings[] =
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        {"Codec", "Echo Control", "Noise Suppression",
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         "Automatic Gain Control",
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         "Voice Activity Detection"};
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ArrayAdapter<String> adapterSettings1 = new ArrayAdapter<String>(
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        settings);
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings1.setAdapter(adapterSettings1);
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings1.setOnItemSelectedListener(
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        new AdapterView.OnItemSelectedListener() {
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onItemSelected(AdapterView adapterView, View view,
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            int position, long id) {
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _settingMenu = position;
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _settingSet = false;
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (position == 0) {
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setAdapter(adapterCodecs);
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_codecIndex);
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (position == 1) {
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setAdapter(adapterAp1);
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_ecIndex);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (position == 2) {
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setAdapter(adapterAp2);
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_nsIndex);
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (position == 3) {
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setAdapter(adapterAp3);
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_agcIndex);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (position == 4) {
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setAdapter(adapterAp4);
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_vadIndex);
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onNothingSelected(AdapterView adapterView) {
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("No setting1 selected");
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        });
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings2.setMinimumWidth(200);
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ArrayAdapter<String> adapterSettings2 = new ArrayAdapter<String>(
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        this,
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        android.R.layout.simple_spinner_dropdown_item,
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        codecs);
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings2.setAdapter(adapterSettings2);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spinnerSettings2.setOnItemSelectedListener(
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        new AdapterView.OnItemSelectedListener() {
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onItemSelected(AdapterView adapterView, View view,
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            int position, long id) {
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // avoid unintentional setting
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingSet == false) {
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _settingSet = true;
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    return;
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change volume
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 0) {
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected audio " + position);
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    setAudioProperties(position);
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    spinnerSettings2.setSelection(_audioIndex);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change codec
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 1) {
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _codecIndex = position;
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected codec " + position);
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (0 != SetSendCodec(_channel, _codecIndex)) {
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        WebrtcLog("VoE set send codec failed");
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change EC
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 2) {
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean enable = true;
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    int ECmode = 5; // AECM
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    int AESmode = 0;
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _ecIndex = position;
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected EC " + position);
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (position == 0) {
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        enable = false;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (position > 1) {
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        ECmode = 4; // AES
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AESmode = position - 1;
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (0 != SetECStatus(enable, ECmode)) {
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        WebrtcLog("VoE set EC status failed");
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change NS
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 3) {
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean enable = true;
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _nsIndex = position;
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected NS " + position);
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (position == 0) {
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        enable = false;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (0 != SetNSStatus(enable, position + 2)) {
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        WebrtcLog("VoE set NS status failed");
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change AGC
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 4) {
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean enable = true;
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _agcIndex = position;
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected AGC " + position);
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (position == 0) {
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        enable = false;
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        position = 1; // default
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (0 != SetAGCStatus(enable, position + 2)) {
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        WebrtcLog("VoE set AGC status failed");
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // Change VAD
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_settingMenu == 5) {
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean enable = true;
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    _vadIndex = position;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("Selected VAD " + position);
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (position == 0) {
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        enable = false;
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        position++;
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (0 != SetVADStatus(_channel, enable, position - 1)) {
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        WebrtcLog("VoE set VAD status failed");
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onNothingSelected(AdapterView adapterView) {
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        });
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Setup VoiceEngine
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!_runAutotest && !useNativeThread) SetupVoE();
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Suggest to use the voice call audio stream for hardware volume
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // controls
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Get max Android volume and adjust default volume to map exactly to an
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Android level
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioManager am =
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        (AudioManager) getSystemService(Context.AUDIO_SERVICE);
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_maxVolume <= 0) {
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("Could not get max volume!");
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255;
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _volumeLevel = (androidVolumeLevel * 255) / _maxVolume;
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Started Webrtc Android Test");
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Will be called when activity is shutdown.
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // NOTE: Activity may be killed without this function being called,
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // but then we should not need to clean up.
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    protected void onDestroy() {
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        super.onDestroy();
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ShutdownVoE();
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private void SetupVoE() {
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Create VoiceEngine
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Create(); // Error logging is done in native API wrapper
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Initialize
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (0 != Init(false, false)) {
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("VoE init failed");
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Create channel
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _channel = CreateChannel();
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (0 != _channel) {
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("VoE create channel failed");
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private void ShutdownVoE() {
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Delete channel
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (0 != DeleteChannel(_channel)) {
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("VoE delete channel failed");
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Terminate
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (0 != Terminate()) {
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("VoE terminate failed");
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Delete VoiceEngine
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Delete(); // Error logging is done in native API wrapper
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int startCall() {
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (useNativeThread == true) {
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Create();
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enableReceive == true) {
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Set local receiver
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetLocalReceiver(_channel, _receivePort)) {
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set local receiver failed");
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StartListen(_channel)) {
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE start listen failed");
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Route audio to earpiece
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetLoudspeakerStatus(false)) {
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set louspeaker status failed");
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            /*
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * WebrtcLog("VoE start record now"); if (0 !=
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * StartRecordingPlayout(_channel, "/sdcard/singleUserDemoOut.pcm",
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * false)) { WebrtcLog("VoE Recording Playout failed"); }
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * WebrtcLog("VoE start Recording Playout end");
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             */
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Start playout
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StartPlayout(_channel)) {
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE start playout failed");
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Start playout file
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // if (0 != StartPlayingFileLocally(_channel,
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // "/sdcard/singleUserDemo.pcm", true)) {
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("VoE start playout file failed");
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // return -1;
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enableSend == true) {
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetSendDestination(_channel, _destinationPort,
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            _destinationIP)) {
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set send  destination failed");
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetSendCodec(_channel, _codecIndex)) {
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set send codec failed");
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            /*
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * if (0 != StartPlayingFileAsMicrophone(_channel,
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * "/sdcard/singleUserDemo.pcm", true)) {
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * WebrtcLog("VoE start playing file as microphone failed"); }
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             */
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StartSend(_channel)) {
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE start send failed");
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // if (0 != StartPlayingFileAsMicrophone(_channel,
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // "/sdcard/singleUserDemo.pcm", true)) {
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("VoE start playing file as microphone failed");
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // return -1;
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int stopCall() {
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (useNativeThread == true) {
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Delete();
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enableSend == true) {
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Stop playing file as microphone
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            /*
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * if (0 != StopPlayingFileAsMicrophone(_channel)) {
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * WebrtcLog("VoE stop playing file as microphone failed"); return
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             * -1; }
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             */
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Stop send
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StopSend(_channel)) {
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE stop send failed");
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (enableReceive == true) {
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // if (0 != StopRecordingPlayout(_channel)) {
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("VoE stop Recording Playout failed");
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("VoE stop Recording Playout ended");
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Stop listen
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StopListen(_channel)) {
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE stop listen failed");
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Stop playout file
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // if (0 != StopPlayingFileLocally(_channel)) {
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("VoE stop playout file failed");
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // return -1;
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Stop playout
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != StopPlayout(_channel)) {
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE stop playout failed");
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Route audio to loudspeaker
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetLoudspeakerStatus(true)) {
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set louspeaker status failed");
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                return -1;
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int startAutoTest() {
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _autotestThread = new Thread(_autotestProc);
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _autotestThread.start();
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Runnable _autotestProc = new Runnable() {
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        public void run() {
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // TODO(xians): choose test from GUI
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // 1 = standard, not used
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // 2 = extended, 2 = base
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            RunAutoTest(1, 2);
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int setAudioProperties(int val) {
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // AudioManager am = (AudioManager)
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // getSystemService(Context.AUDIO_SERVICE);
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (val == 0) {
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // _streamVolume =
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // am.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // (_streamVolume+1), 0);
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255;
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (androidVolumeLevel < _maxVolume) {
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _volumeLevel = ((androidVolumeLevel + 1) * 255) / _maxVolume;
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (0 != SetSpeakerVolume(_volumeLevel)) {
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("VoE set speaker volume failed");
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (val == 1) {
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // _streamVolume =
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // am.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // (_streamVolume-1), 0);
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255;
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (androidVolumeLevel > 0) {
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _volumeLevel = ((androidVolumeLevel - 1) * 255) / _maxVolume;
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (0 != SetSpeakerVolume(_volumeLevel)) {
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    WebrtcLog("VoE set speaker volume failed");
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (val == 2) {
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // route audio to back speaker
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetLoudspeakerStatus(true)) {
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set loudspeaker status failed");
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioIndex = 2;
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else if (val == 3) {
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // route audio to earpiece
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (0 != SetLoudspeakerStatus(false)) {
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebrtcLog("VoE set loudspeaker status failed");
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _audioIndex = 3;
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int displayTextFromFile() {
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        TextView tv = (TextView) findViewById(R.id.TextView01);
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileReader fr = null;
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        char[] fileBuffer = new char[64];
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fr = new FileReader("/sdcard/test.txt");
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (FileNotFoundException e) {
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            tv.setText("File not found!");
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fr.read(fileBuffer);
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (IOException e) {
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        String readString = new String(fileBuffer);
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tv.setText(readString);
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // setContentView(tv);
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int recordAudioToFile() {
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        File fr = null;
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final to be reachable within onPeriodicNotification
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        byte[] recBuffer = new byte[320];
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int recBufSize =
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AudioRecord.getMinBufferSize(16000,
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.ENCODING_PCM_16BIT);
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AudioRecord rec =
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        new AudioRecord(MediaRecorder.AudioSource.MIC, 16000,
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.ENCODING_PCM_16BIT,
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        recBufSize);
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fr = new File("/sdcard/record.pcm");
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileOutputStream out = null;
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            out = new FileOutputStream(fr);
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (FileNotFoundException e1) {
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e1.printStackTrace();
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // start recording
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            rec.startRecording();
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (IllegalStateException e) {
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (int i = 0; i < 550; i++) {
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // note, there is a short version of write as well!
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int wrBytes = rec.read(recBuffer, 0, 320);
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                out.write(recBuffer);
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IOException e) {
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // stop playout
675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            rec.stop();
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (IllegalStateException e) {
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int playAudioFromFile() {
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        File fr = null;
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final to be reachable within onPeriodicNotification
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final byte[] playBuffer = new byte [320000];
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final to be reachable within onPeriodicNotification
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final byte[] playBuffer = new byte[320];
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final int playBufSize =
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AudioTrack.getMinBufferSize(16000,
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.ENCODING_PCM_16BIT);
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final int playBufSize = 1920; // 100 ms buffer
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // byte[] playBuffer = new byte [playBufSize];
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final AudioTrack play =
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        new AudioTrack(AudioManager.STREAM_VOICE_CALL, 16000,
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.ENCODING_PCM_16BIT,
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        playBufSize, AudioTrack.MODE_STREAM);
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // implementation of the playpos callback functions
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        play.setPlaybackPositionUpdateListener(
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        new AudioTrack.OnPlaybackPositionUpdateListener() {
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int count = 0;
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onPeriodicNotification(AudioTrack track) {
711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // int wrBytes = play.write(playBuffer, count, 320);
712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                count += 320;
713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            public void onMarkerReached(AudioTrack track) {
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        });
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // set the notification period = 160 samples
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // int ret = play.setPositionNotificationPeriod(160);
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fr = new File("/sdcard/record.pcm");
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileInputStream in = null;
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            in = new FileInputStream(fr);
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (FileNotFoundException e1) {
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e1.printStackTrace();
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // try {
732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // in.read(playBuffer);
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // } catch (IOException e) {
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // e.printStackTrace();
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // }
736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // play all at once
738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // int wrBytes = play.write(playBuffer, 0, 320000);
739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // start playout
742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            play.play();
744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (IllegalStateException e) {
745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // returns the number of samples that has been written
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // int headPos = play.getPlaybackHeadPosition();
750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // play with multiple writes
752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (int i = 0; i < 500; i++) {
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                in.read(playBuffer);
755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IOException e) {
756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // note, there is a short version of write as well!
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int wrBytes = play.write(playBuffer, 0, 320);
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Log.d("testWrite", "wrote");
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // stop playout
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            play.stop();
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (IllegalStateException e) {
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            e.printStackTrace();
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int playAudioInThread() {
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_isRunningPlay) {
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // File fr = null;
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // final byte[] playBuffer = new byte[320];
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_playFromFile) {
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _playBuffer = new byte[320];
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // reset index
788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _playIndex = 0;
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // within
791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // onPeriodicNotification
792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Log some info (static)
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Creating AudioTrack object");
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final int minPlayBufSize =
796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AudioTrack.getMinBufferSize(16000,
797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioFormat.ENCODING_PCM_16BIT);
799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Min play buf size = " + minPlayBufSize);
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Min volume = " + AudioTrack.getMinVolume());
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Max volume = " + AudioTrack.getMaxVolume());
802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Native sample rate = "
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        + AudioTrack.getNativeOutputSampleRate(
804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        AudioManager.STREAM_VOICE_CALL));
805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final int playBufSize = minPlayBufSize; // 3200; // 100 ms buffer
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // byte[] playBuffer = new byte [playBufSize];
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _at = new AudioTrack(
810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            AudioManager.STREAM_VOICE_CALL,
811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            16000,
812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            AudioFormat.CHANNEL_CONFIGURATION_MONO,
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            AudioFormat.ENCODING_PCM_16BIT,
814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            playBufSize, AudioTrack.MODE_STREAM);
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (Exception e) {
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog(e.getMessage());
817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Log some info (non-static)
820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Notification marker pos = "
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        + _at.getNotificationMarkerPosition());
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Play head pos = " + _at.getPlaybackHeadPosition());
823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Pos notification dt = "
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        + _at.getPositionNotificationPeriod());
825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Playback rate = " + _at.getPlaybackRate());
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Sample rate = " + _at.getSampleRate());
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // implementation of the playpos callback functions
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // _at.setPlaybackPositionUpdateListener(
830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // new AudioTrack.OnPlaybackPositionUpdateListener() {
831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        //
832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // int count = 3200;
833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        //
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // public void onPeriodicNotification(AudioTrack track) {
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // // int wrBytes = play.write(playBuffer, count, 320);
836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // count += 320;
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // }
838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        //
839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // public void onMarkerReached(AudioTrack track) {
840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // }
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // });
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // set the notification period = 160 samples
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // int ret = _at.setPositionNotificationPeriod(160);
845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_playFromFile) {
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _fr = new File("/sdcard/singleUserDemo.pcm");
848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _in = new FileInputStream(_fr);
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (FileNotFoundException e1) {
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e1.printStackTrace();
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // try {
856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // in.read(playBuffer);
857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // } catch (IOException e) {
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // e.printStackTrace();
859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // }
860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _isRunningPlay = true;
862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // buffer = new byte[3200];
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _playThread = new Thread(_playProc);
865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // ar.startRecording();
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // bytesRead = 3200;
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // recording = true;
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _playThread.start();
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int stopPlayAudio() {
874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!_isRunningPlay) {
875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _isRunningPlay = false;
879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Runnable _playProc = new Runnable() {
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        public void run() {
885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // set high thread priority
887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            android.os.Process.setThreadPriority(
888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // play all at once
891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // int wrBytes = play.write(playBuffer, 0, 320000);
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // fill the buffer
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // play.write(playBuffer, 0, 3200);
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // play.flush();
897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // start playout
899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _at.play();
901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IllegalStateException e) {
902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // play with multiple writes
906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int i = 0;
907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            for (; i < 3000 && _isRunningPlay; i++) {
908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_playFromFile) {
910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    try {
911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _in.read(_playBuffer);
912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } catch (IOException e) {
913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        e.printStackTrace();
914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    int wrBytes = _at.write(_playBuffer, 0 /* i * 320 */, 320);
917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                } else {
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    int wrSamples =
919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    _at.write(_circBuffer, _playIndex * 160,
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                    160);
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // WebrtcLog("Played 10 ms from buffer, _playIndex = " +
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // _playIndex);
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // WebrtcLog("Diff = " + (_recIndex - _playIndex));
925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (_playIndex == 49) {
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _playIndex = 0;
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } else {
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _playIndex += 1;
930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // WebrtcLog("Wrote 10 ms to buffer, head = "
934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                // + _at.getPlaybackHeadPosition());
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // stop playout
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _at.stop();
940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IllegalStateException e) {
941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // returns the number of samples that has been written
945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog("Test stopped, i = " + i + ", head = "
946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            + _at.getPlaybackHeadPosition());
947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int headPos = _at.getPlaybackHeadPosition();
948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // flush the buffers
950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _at.flush();
951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // release the object
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _at.release();
954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _at = null;
955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // try {
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Thread.sleep() must be within a try - catch block
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Thread.sleep(3000);
959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }catch (Exception e){
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // System.out.println(e.getMessage());
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _isRunningPlay = false;
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int recAudioInThread() {
969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_isRunningRec) {
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // within
975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // onPeriodicNotification
976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // reset index
978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _recIndex = 20;
979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Log some info (static)
981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Creating AudioRecord object");
982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final int minRecBufSize = AudioRecord.getMinBufferSize(16000,
983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        AudioFormat.ENCODING_PCM_16BIT);
985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Min rec buf size = " + minRecBufSize);
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Min volume = " + AudioTrack.getMinVolume());
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Max volume = " + AudioTrack.getMaxVolume());
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Native sample rate = "
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // + AudioRecord
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // .getNativeInputSampleRate(AudioManager.STREAM_VOICE_CALL));
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        final int recBufSize = minRecBufSize; // 3200; // 100 ms buffer
993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        try {
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _ar = new AudioRecord(
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            MediaRecorder.AudioSource.MIC,
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            16000,
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            AudioFormat.CHANNEL_CONFIGURATION_MONO,
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            AudioFormat.ENCODING_PCM_16BIT,
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            recBufSize);
1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } catch (Exception e) {
1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            WebrtcLog(e.getMessage());
1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Log some info (non-static)
1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Notification marker pos = "
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        + _ar.getNotificationMarkerPosition());
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Play head pos = " + _ar.getRecordHeadPosition());
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Pos notification dt rec= "
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        + _ar.getPositionNotificationPeriod());
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Playback rate = " + _ar.getRecordRate());
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Playback rate = " + _ar.getPlaybackRate());
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebrtcLog("Sample rate = " + _ar.getSampleRate());
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Playback rate = " + _ar.getPlaybackRate());
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // WebrtcLog("Playback rate = " + _ar.getPlaybackRate());
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _isRunningRec = true;
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _recThread = new Thread(_recProc);
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _recThread.start();
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int stopRecAudio() {
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!_isRunningRec) {
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 0;
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _isRunningRec = false;
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private Runnable _recProc = new Runnable() {
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        public void run() {
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // set high thread priority
1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            android.os.Process.setThreadPriority(
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // start recording
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _ar.startRecording();
1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IllegalStateException e) {
1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
1048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // keep recording to circular buffer
1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // for a while
1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int i = 0;
1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int rdSamples = 0;
1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            short[] tempBuffer = new short[160]; // Only used for native case
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            for (; i < 3000 && _isRunningRec; i++) {
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                if (_runThroughNativeLayer) {
1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    rdSamples = _ar.read(tempBuffer, 0, 160);
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // audioLoop(tempBuffer, 160); // Insert into native layer
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                } else {
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    rdSamples = _ar.read(_circBuffer, _recIndex * 160, 160);
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // WebrtcLog("Recorded 10 ms to buffer, _recIndex = " +
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // _recIndex);
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // WebrtcLog("rdSamples = " + rdSamples);
1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    if (_recIndex == 49) {
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _recIndex = 0;
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    } else {
1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        _recIndex += 1;
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    }
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                }
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // stop recording
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            try {
1076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                _ar.stop();
1077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            } catch (IllegalStateException e) {
1078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                e.printStackTrace();
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // release the object
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _ar.release();
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _ar = null;
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // try {
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Thread.sleep() must be within a try - catch block
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Thread.sleep(3000);
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }catch (Exception e){
1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // System.out.println(e.getMessage());
1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // }
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _isRunningRec = false;
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // returns the number of samples that has been written
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // WebrtcLog("Test stopped, i = " + i + ", head = "
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // + _at.getPlaybackHeadPosition());
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // int headPos = _at.getPlaybackHeadPosition();
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
1100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private void WebrtcLog(String msg) {
1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Log.d("*Webrtc*", msg);
1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // //////////////// Native function prototypes ////////////////////
1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native static boolean NativeInit();
1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int RunAutoTest(int testType, int extendedSel);
1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native boolean Create();
1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native boolean Delete();
1114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int Init(boolean enableTrace, boolean useExtTrans);
1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int Terminate();
1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int CreateChannel();
1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int DeleteChannel(int channel);
1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetLocalReceiver(int channel, int port);
1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetSendDestination(int channel, int port,
1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    String ipaddr);
1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartListen(int channel);
1129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartPlayout(int channel);
1131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartSend(int channel);
1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopListen(int channel);
1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopPlayout(int channel);
1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopSend(int channel);
1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartPlayingFileLocally(int channel, String fileName,
1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean loop);
1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopPlayingFileLocally(int channel);
1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartRecordingPlayout(int channel, String fileName,
1146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    boolean loop);
1147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopRecordingPlayout(int channel);
1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StartPlayingFileAsMicrophone(int channel,
1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    String fileName, boolean loop);
1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int StopPlayingFileAsMicrophone(int channel);
1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int NumOfCodecs();
1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetSendCodec(int channel, int index);
1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetVADStatus(int channel, boolean enable, int mode);
1160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetNSStatus(boolean enable, int mode);
1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetAGCStatus(boolean enable, int mode);
1164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetECStatus(boolean enable, int mode);
1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetSpeakerVolume(int volume);
1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private native int SetLoudspeakerStatus(boolean enable);
1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /*
1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     * this is used to load the 'webrtc-voice-demo-jni'
1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     * library on application startup.
1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     * The library has already been unpacked into
1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     * /data/data/webrtc.android.AndroidTest/lib/libwebrtc-voice-demo-jni.so
1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     * at installation time by the package manager.
1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     */
1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static {
1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Log.d("*Webrtc*", "Loading webrtc-voice-demo-jni...");
1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        System.loadLibrary("webrtc-voice-demo-jni");
1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Log.d("*Webrtc*", "Calling native init...");
1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!NativeInit()) {
1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Log.e("*Webrtc*", "Native init failed");
1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            throw new RuntimeException("Native init failed");
1186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Log.d("*Webrtc*", "Native init successful");
1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1191