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