Index: webrtc/voice_engine/test/android/android_test/src/org/webrtc/voiceengine/test/AndroidTest.java |
diff --git a/webrtc/voice_engine/test/android/android_test/src/org/webrtc/voiceengine/test/AndroidTest.java b/webrtc/voice_engine/test/android/android_test/src/org/webrtc/voiceengine/test/AndroidTest.java |
deleted file mode 100644 |
index 71b22b0d6d18b7e488b159087b8d34f764ac6c13..0000000000000000000000000000000000000000 |
--- a/webrtc/voice_engine/test/android/android_test/src/org/webrtc/voiceengine/test/AndroidTest.java |
+++ /dev/null |
@@ -1,1190 +0,0 @@ |
-/* |
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license that can be found |
- * in the LICENSE file in the root of the source tree. An additional |
- * intellectual property rights grant can be found in the file PATENTS. All |
- * contributing project authors may be found in the AUTHORS file in the root of |
- * the source tree. |
- */ |
- |
-/* |
- * VoiceEngine Android test application. It starts either auto test or acts like |
- * a GUI test. |
- */ |
- |
-package org.webrtc.voiceengine.test; |
- |
-import java.io.File; |
-import java.io.FileInputStream; |
-import java.io.FileNotFoundException; |
-import java.io.FileOutputStream; |
-import java.io.FileReader; |
-import java.io.IOException; |
- |
-import android.app.Activity; |
-import android.content.Context; |
-import android.media.AudioFormat; |
-import android.media.AudioManager; |
-import android.media.AudioRecord; |
-import android.media.AudioTrack; |
-import android.media.MediaRecorder; |
-import android.os.Bundle; |
-import android.util.Log; |
-import android.view.View; |
-import android.widget.AdapterView; |
-import android.widget.ArrayAdapter; |
-import android.widget.Button; |
-import android.widget.EditText; |
-import android.widget.Spinner; |
-import android.widget.TextView; |
- |
-public class AndroidTest extends Activity { |
- private byte[] _playBuffer = null; |
- private short[] _circBuffer = new short[8000]; // can hold 50 frames |
- |
- private int _recIndex = 0; |
- private int _playIndex = 0; |
- // private int _streamVolume = 4; |
- private int _maxVolume = 0; // Android max level (commonly 5) |
- // VoE level (0-255), corresponds to level 4 out of 5 |
- private int _volumeLevel = 204; |
- |
- private Thread _playThread; |
- private Thread _recThread; |
- private Thread _autotestThread; |
- |
- private static AudioTrack _at; |
- private static AudioRecord _ar; |
- |
- private File _fr = null; |
- private FileInputStream _in = null; |
- |
- private boolean _isRunningPlay = false; |
- private boolean _isRunningRec = false; |
- private boolean _settingSet = true; |
- private boolean _isCallActive = false; |
- private boolean _runAutotest = false; // ENABLE AUTOTEST HERE! |
- |
- private int _channel = -1; |
- private int _codecIndex = 0; |
- private int _ecIndex = 0; |
- private int _nsIndex = 0; |
- private int _agcIndex = 0; |
- private int _vadIndex = 0; |
- private int _audioIndex = 3; |
- private int _settingMenu = 0; |
- private int _receivePort = 1234; |
- private int _destinationPort = 1234; |
- private String _destinationIP = "127.0.0.1"; |
- |
- // "Build" settings |
- private final boolean _playFromFile = false; |
- // Set to true to send data to native code and back |
- private final boolean _runThroughNativeLayer = true; |
- private final boolean enableSend = true; |
- private final boolean enableReceive = true; |
- private final boolean useNativeThread = false; |
- |
- /** Called when the activity is first created. */ |
- public void onCreate(Bundle savedInstanceState) { |
- super.onCreate(savedInstanceState); |
- setContentView(R.layout.main); |
- |
- TextView tv = (TextView) findViewById(R.id.TextView01); |
- tv.setText(""); |
- |
- final EditText ed = (EditText) findViewById(R.id.EditText01); |
- ed.setWidth(200); |
- ed.setText(_destinationIP); |
- |
- final Button buttonStart = (Button) findViewById(R.id.Button01); |
- buttonStart.setWidth(200); |
- if (_runAutotest) { |
- buttonStart.setText("Run test"); |
- } else { |
- buttonStart.setText("Start Call"); |
- } |
- // button.layout(50, 50, 100, 40); |
- buttonStart.setOnClickListener(new View.OnClickListener() { |
- public void onClick(View v) { |
- |
- if (_runAutotest) { |
- startAutoTest(); |
- } else { |
- if (_isCallActive) { |
- |
- if (stopCall() != -1) { |
- _isCallActive = false; |
- buttonStart.setText("Start Call"); |
- } |
- } else { |
- |
- _destinationIP = ed.getText().toString(); |
- if (startCall() != -1) { |
- _isCallActive = true; |
- buttonStart.setText("Stop Call"); |
- } |
- } |
- } |
- |
- // displayTextFromFile(); |
- // recordAudioToFile(); |
- // if(!_playFromFile) |
- // { |
- // recAudioInThread(); |
- // } |
- // playAudioInThread(); |
- } |
- }); |
- |
- final Button buttonStop = (Button) findViewById(R.id.Button02); |
- buttonStop.setWidth(200); |
- buttonStop.setText("Close app"); |
- buttonStop.setOnClickListener(new View.OnClickListener() { |
- public void onClick(View v) { |
- |
- if (!_runAutotest) { |
- ShutdownVoE(); |
- } |
- |
- // This call terminates and should close the activity |
- finish(); |
- |
- // playAudioFromFile(); |
- // if(!_playFromFile) |
- // { |
- // stopRecAudio(); |
- // } |
- // stopPlayAudio(); |
- } |
- }); |
- |
- |
- String ap1[] = {"EC off", "AECM"}; |
- final ArrayAdapter<String> adapterAp1 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- ap1); |
- String ap2[] = |
- {"NS off", "NS low", "NS moderate", "NS high", |
- "NS very high"}; |
- final ArrayAdapter<String> adapterAp2 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- ap2); |
- String ap3[] = {"AGC off", "AGC adaptive", "AGC fixed"}; |
- final ArrayAdapter<String> adapterAp3 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- ap3); |
- String ap4[] = |
- {"VAD off", "VAD conventional", "VAD high rate", |
- "VAD mid rate", "VAD low rate"}; |
- final ArrayAdapter<String> adapterAp4 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- ap4); |
- String codecs[] = {"iSAC", "PCMU", "PCMA", "iLBC"}; |
- final ArrayAdapter<String> adapterCodecs = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- codecs); |
- |
- final Spinner spinnerSettings1 = (Spinner) findViewById(R.id.Spinner01); |
- final Spinner spinnerSettings2 = (Spinner) findViewById(R.id.Spinner02); |
- spinnerSettings1.setMinimumWidth(200); |
- String settings[] = |
- {"Codec", "Echo Control", "Noise Suppression", |
- "Automatic Gain Control", |
- "Voice Activity Detection"}; |
- ArrayAdapter<String> adapterSettings1 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- settings); |
- spinnerSettings1.setAdapter(adapterSettings1); |
- spinnerSettings1.setOnItemSelectedListener( |
- new AdapterView.OnItemSelectedListener() { |
- public void onItemSelected(AdapterView adapterView, View view, |
- int position, long id) { |
- |
- _settingMenu = position; |
- _settingSet = false; |
- if (position == 0) { |
- spinnerSettings2.setAdapter(adapterCodecs); |
- spinnerSettings2.setSelection(_codecIndex); |
- } |
- if (position == 1) { |
- spinnerSettings2.setAdapter(adapterAp1); |
- spinnerSettings2.setSelection(_ecIndex); |
- } |
- if (position == 2) { |
- spinnerSettings2.setAdapter(adapterAp2); |
- spinnerSettings2.setSelection(_nsIndex); |
- } |
- if (position == 3) { |
- spinnerSettings2.setAdapter(adapterAp3); |
- spinnerSettings2.setSelection(_agcIndex); |
- } |
- if (position == 4) { |
- spinnerSettings2.setAdapter(adapterAp4); |
- spinnerSettings2.setSelection(_vadIndex); |
- } |
- } |
- |
- public void onNothingSelected(AdapterView adapterView) { |
- WebrtcLog("No setting1 selected"); |
- } |
- }); |
- |
- spinnerSettings2.setMinimumWidth(200); |
- ArrayAdapter<String> adapterSettings2 = new ArrayAdapter<String>( |
- this, |
- android.R.layout.simple_spinner_dropdown_item, |
- codecs); |
- spinnerSettings2.setAdapter(adapterSettings2); |
- spinnerSettings2.setOnItemSelectedListener( |
- new AdapterView.OnItemSelectedListener() { |
- public void onItemSelected(AdapterView adapterView, View view, |
- int position, long id) { |
- |
- // avoid unintentional setting |
- if (_settingSet == false) { |
- _settingSet = true; |
- return; |
- } |
- |
- // Change volume |
- if (_settingMenu == 0) { |
- WebrtcLog("Selected audio " + position); |
- setAudioProperties(position); |
- spinnerSettings2.setSelection(_audioIndex); |
- } |
- |
- // Change codec |
- if (_settingMenu == 1) { |
- _codecIndex = position; |
- WebrtcLog("Selected codec " + position); |
- if (0 != SetSendCodec(_channel, _codecIndex)) { |
- WebrtcLog("VoE set send codec failed"); |
- } |
- } |
- |
- // Change EC |
- if (_settingMenu == 2) { |
- boolean enable = true; |
- int ECmode = 5; // AECM |
- int AESmode = 0; |
- |
- _ecIndex = position; |
- WebrtcLog("Selected EC " + position); |
- |
- if (position == 0) { |
- enable = false; |
- } |
- if (position > 1) { |
- ECmode = 4; // AES |
- AESmode = position - 1; |
- } |
- |
- if (0 != SetECStatus(enable, ECmode)) { |
- WebrtcLog("VoE set EC status failed"); |
- } |
- } |
- |
- // Change NS |
- if (_settingMenu == 3) { |
- boolean enable = true; |
- |
- _nsIndex = position; |
- WebrtcLog("Selected NS " + position); |
- |
- if (position == 0) { |
- enable = false; |
- } |
- if (0 != SetNSStatus(enable, position + 2)) { |
- WebrtcLog("VoE set NS status failed"); |
- } |
- } |
- |
- // Change AGC |
- if (_settingMenu == 4) { |
- boolean enable = true; |
- |
- _agcIndex = position; |
- WebrtcLog("Selected AGC " + position); |
- |
- if (position == 0) { |
- enable = false; |
- position = 1; // default |
- } |
- if (0 != SetAGCStatus(enable, position + 2)) { |
- WebrtcLog("VoE set AGC status failed"); |
- } |
- } |
- |
- // Change VAD |
- if (_settingMenu == 5) { |
- boolean enable = true; |
- |
- _vadIndex = position; |
- WebrtcLog("Selected VAD " + position); |
- |
- if (position == 0) { |
- enable = false; |
- position++; |
- } |
- if (0 != SetVADStatus(_channel, enable, position - 1)) { |
- WebrtcLog("VoE set VAD status failed"); |
- } |
- } |
- } |
- |
- public void onNothingSelected(AdapterView adapterView) { |
- } |
- }); |
- |
- // Setup VoiceEngine |
- if (!_runAutotest && !useNativeThread) SetupVoE(); |
- |
- // Suggest to use the voice call audio stream for hardware volume |
- // controls |
- setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); |
- |
- // Get max Android volume and adjust default volume to map exactly to an |
- // Android level |
- AudioManager am = |
- (AudioManager) getSystemService(Context.AUDIO_SERVICE); |
- _maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); |
- if (_maxVolume <= 0) { |
- WebrtcLog("Could not get max volume!"); |
- } else { |
- int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255; |
- _volumeLevel = (androidVolumeLevel * 255) / _maxVolume; |
- } |
- |
- WebrtcLog("Started Webrtc Android Test"); |
- } |
- |
- // Will be called when activity is shutdown. |
- // NOTE: Activity may be killed without this function being called, |
- // but then we should not need to clean up. |
- protected void onDestroy() { |
- super.onDestroy(); |
- // ShutdownVoE(); |
- } |
- |
- private void SetupVoE() { |
- // Create VoiceEngine |
- Create(); // Error logging is done in native API wrapper |
- |
- // Initialize |
- if (0 != Init(false, false)) { |
- WebrtcLog("VoE init failed"); |
- } |
- |
- // Create channel |
- _channel = CreateChannel(); |
- if (0 != _channel) { |
- WebrtcLog("VoE create channel failed"); |
- } |
- |
- } |
- |
- private void ShutdownVoE() { |
- // Delete channel |
- if (0 != DeleteChannel(_channel)) { |
- WebrtcLog("VoE delete channel failed"); |
- } |
- |
- // Terminate |
- if (0 != Terminate()) { |
- WebrtcLog("VoE terminate failed"); |
- } |
- |
- // Delete VoiceEngine |
- Delete(); // Error logging is done in native API wrapper |
- } |
- |
- int startCall() { |
- |
- if (useNativeThread == true) { |
- |
- Create(); |
- return 0; |
- } |
- |
- if (enableReceive == true) { |
- // Set local receiver |
- if (0 != SetLocalReceiver(_channel, _receivePort)) { |
- WebrtcLog("VoE set local receiver failed"); |
- } |
- |
- if (0 != StartListen(_channel)) { |
- WebrtcLog("VoE start listen failed"); |
- return -1; |
- } |
- |
- // Route audio to earpiece |
- if (0 != SetLoudspeakerStatus(false)) { |
- WebrtcLog("VoE set louspeaker status failed"); |
- return -1; |
- } |
- |
- /* |
- * WebrtcLog("VoE start record now"); if (0 != |
- * StartRecordingPlayout(_channel, "/sdcard/singleUserDemoOut.pcm", |
- * false)) { WebrtcLog("VoE Recording Playout failed"); } |
- * WebrtcLog("VoE start Recording Playout end"); |
- */ |
- // Start playout |
- if (0 != StartPlayout(_channel)) { |
- WebrtcLog("VoE start playout failed"); |
- return -1; |
- } |
- |
- // Start playout file |
- // if (0 != StartPlayingFileLocally(_channel, |
- // "/sdcard/singleUserDemo.pcm", true)) { |
- // WebrtcLog("VoE start playout file failed"); |
- // return -1; |
- // } |
- } |
- |
- if (enableSend == true) { |
- if (0 != SetSendDestination(_channel, _destinationPort, |
- _destinationIP)) { |
- WebrtcLog("VoE set send destination failed"); |
- return -1; |
- } |
- |
- if (0 != SetSendCodec(_channel, _codecIndex)) { |
- WebrtcLog("VoE set send codec failed"); |
- return -1; |
- } |
- |
- /* |
- * if (0 != StartPlayingFileAsMicrophone(_channel, |
- * "/sdcard/singleUserDemo.pcm", true)) { |
- * WebrtcLog("VoE start playing file as microphone failed"); } |
- */ |
- if (0 != StartSend(_channel)) { |
- WebrtcLog("VoE start send failed"); |
- return -1; |
- } |
- |
- // if (0 != StartPlayingFileAsMicrophone(_channel, |
- // "/sdcard/singleUserDemo.pcm", true)) { |
- // WebrtcLog("VoE start playing file as microphone failed"); |
- // return -1; |
- // } |
- } |
- |
- return 0; |
- } |
- |
- int stopCall() { |
- |
- if (useNativeThread == true) { |
- |
- Delete(); |
- return 0; |
- } |
- |
- if (enableSend == true) { |
- // Stop playing file as microphone |
- /* |
- * if (0 != StopPlayingFileAsMicrophone(_channel)) { |
- * WebrtcLog("VoE stop playing file as microphone failed"); return |
- * -1; } |
- */ |
- // Stop send |
- if (0 != StopSend(_channel)) { |
- WebrtcLog("VoE stop send failed"); |
- return -1; |
- } |
- } |
- |
- if (enableReceive == true) { |
- // if (0 != StopRecordingPlayout(_channel)) { |
- // WebrtcLog("VoE stop Recording Playout failed"); |
- // } |
- // WebrtcLog("VoE stop Recording Playout ended"); |
- |
- // Stop listen |
- if (0 != StopListen(_channel)) { |
- WebrtcLog("VoE stop listen failed"); |
- return -1; |
- } |
- |
- // Stop playout file |
- // if (0 != StopPlayingFileLocally(_channel)) { |
- // WebrtcLog("VoE stop playout file failed"); |
- // return -1; |
- // } |
- |
- // Stop playout |
- if (0 != StopPlayout(_channel)) { |
- WebrtcLog("VoE stop playout failed"); |
- return -1; |
- } |
- |
- // Route audio to loudspeaker |
- if (0 != SetLoudspeakerStatus(true)) { |
- WebrtcLog("VoE set louspeaker status failed"); |
- return -1; |
- } |
- } |
- |
- return 0; |
- } |
- |
- int startAutoTest() { |
- |
- _autotestThread = new Thread(_autotestProc); |
- _autotestThread.start(); |
- |
- return 0; |
- } |
- |
- private Runnable _autotestProc = new Runnable() { |
- public void run() { |
- // TODO(xians): choose test from GUI |
- // 1 = standard, not used |
- // 2 = extended, 2 = base |
- RunAutoTest(1, 2); |
- } |
- }; |
- |
- int setAudioProperties(int val) { |
- |
- // AudioManager am = (AudioManager) |
- // getSystemService(Context.AUDIO_SERVICE); |
- |
- if (val == 0) { |
- // _streamVolume = |
- // am.getStreamVolume(AudioManager.STREAM_VOICE_CALL); |
- // am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, |
- // (_streamVolume+1), 0); |
- |
- int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255; |
- if (androidVolumeLevel < _maxVolume) { |
- _volumeLevel = ((androidVolumeLevel + 1) * 255) / _maxVolume; |
- if (0 != SetSpeakerVolume(_volumeLevel)) { |
- WebrtcLog("VoE set speaker volume failed"); |
- } |
- } |
- } else if (val == 1) { |
- // _streamVolume = |
- // am.getStreamVolume(AudioManager.STREAM_VOICE_CALL); |
- // am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, |
- // (_streamVolume-1), 0); |
- |
- int androidVolumeLevel = (_volumeLevel * _maxVolume) / 255; |
- if (androidVolumeLevel > 0) { |
- _volumeLevel = ((androidVolumeLevel - 1) * 255) / _maxVolume; |
- if (0 != SetSpeakerVolume(_volumeLevel)) { |
- WebrtcLog("VoE set speaker volume failed"); |
- } |
- } |
- } else if (val == 2) { |
- // route audio to back speaker |
- if (0 != SetLoudspeakerStatus(true)) { |
- WebrtcLog("VoE set loudspeaker status failed"); |
- } |
- _audioIndex = 2; |
- } else if (val == 3) { |
- // route audio to earpiece |
- if (0 != SetLoudspeakerStatus(false)) { |
- WebrtcLog("VoE set loudspeaker status failed"); |
- } |
- _audioIndex = 3; |
- } |
- |
- return 0; |
- } |
- |
- int displayTextFromFile() { |
- |
- TextView tv = (TextView) findViewById(R.id.TextView01); |
- FileReader fr = null; |
- char[] fileBuffer = new char[64]; |
- |
- try { |
- fr = new FileReader("/sdcard/test.txt"); |
- } catch (FileNotFoundException e) { |
- e.printStackTrace(); |
- tv.setText("File not found!"); |
- } |
- |
- try { |
- fr.read(fileBuffer); |
- } catch (IOException e) { |
- e.printStackTrace(); |
- } |
- |
- String readString = new String(fileBuffer); |
- tv.setText(readString); |
- // setContentView(tv); |
- |
- return 0; |
- } |
- |
- int recordAudioToFile() { |
- File fr = null; |
- // final to be reachable within onPeriodicNotification |
- byte[] recBuffer = new byte[320]; |
- |
- int recBufSize = |
- AudioRecord.getMinBufferSize(16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT); |
- AudioRecord rec = |
- new AudioRecord(MediaRecorder.AudioSource.MIC, 16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT, |
- recBufSize); |
- |
- fr = new File("/sdcard/record.pcm"); |
- FileOutputStream out = null; |
- try { |
- out = new FileOutputStream(fr); |
- } catch (FileNotFoundException e1) { |
- e1.printStackTrace(); |
- } |
- |
- // start recording |
- try { |
- rec.startRecording(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- for (int i = 0; i < 550; i++) { |
- // note, there is a short version of write as well! |
- int wrBytes = rec.read(recBuffer, 0, 320); |
- |
- try { |
- out.write(recBuffer); |
- } catch (IOException e) { |
- e.printStackTrace(); |
- } |
- } |
- |
- // stop playout |
- try { |
- rec.stop(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- return 0; |
- } |
- |
- int playAudioFromFile() { |
- |
- File fr = null; |
- // final to be reachable within onPeriodicNotification |
- // final byte[] playBuffer = new byte [320000]; |
- // final to be reachable within onPeriodicNotification |
- final byte[] playBuffer = new byte[320]; |
- |
- final int playBufSize = |
- AudioTrack.getMinBufferSize(16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT); |
- // final int playBufSize = 1920; // 100 ms buffer |
- // byte[] playBuffer = new byte [playBufSize]; |
- final AudioTrack play = |
- new AudioTrack(AudioManager.STREAM_VOICE_CALL, 16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT, |
- playBufSize, AudioTrack.MODE_STREAM); |
- |
- // implementation of the playpos callback functions |
- play.setPlaybackPositionUpdateListener( |
- new AudioTrack.OnPlaybackPositionUpdateListener() { |
- |
- int count = 0; |
- |
- public void onPeriodicNotification(AudioTrack track) { |
- // int wrBytes = play.write(playBuffer, count, 320); |
- count += 320; |
- } |
- |
- public void onMarkerReached(AudioTrack track) { |
- |
- } |
- }); |
- |
- // set the notification period = 160 samples |
- // int ret = play.setPositionNotificationPeriod(160); |
- |
- fr = new File("/sdcard/record.pcm"); |
- FileInputStream in = null; |
- try { |
- in = new FileInputStream(fr); |
- } catch (FileNotFoundException e1) { |
- e1.printStackTrace(); |
- } |
- |
- // try { |
- // in.read(playBuffer); |
- // } catch (IOException e) { |
- // e.printStackTrace(); |
- // } |
- |
- // play all at once |
- // int wrBytes = play.write(playBuffer, 0, 320000); |
- |
- |
- // start playout |
- try { |
- play.play(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- // returns the number of samples that has been written |
- // int headPos = play.getPlaybackHeadPosition(); |
- |
- // play with multiple writes |
- for (int i = 0; i < 500; i++) { |
- try { |
- in.read(playBuffer); |
- } catch (IOException e) { |
- e.printStackTrace(); |
- } |
- |
- |
- // note, there is a short version of write as well! |
- int wrBytes = play.write(playBuffer, 0, 320); |
- |
- Log.d("testWrite", "wrote"); |
- } |
- |
- // stop playout |
- try { |
- play.stop(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- return 0; |
- } |
- |
- int playAudioInThread() { |
- |
- if (_isRunningPlay) { |
- return 0; |
- } |
- |
- // File fr = null; |
- // final byte[] playBuffer = new byte[320]; |
- if (_playFromFile) { |
- _playBuffer = new byte[320]; |
- } else { |
- // reset index |
- _playIndex = 0; |
- } |
- // within |
- // onPeriodicNotification |
- |
- // Log some info (static) |
- WebrtcLog("Creating AudioTrack object"); |
- final int minPlayBufSize = |
- AudioTrack.getMinBufferSize(16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT); |
- WebrtcLog("Min play buf size = " + minPlayBufSize); |
- WebrtcLog("Min volume = " + AudioTrack.getMinVolume()); |
- WebrtcLog("Max volume = " + AudioTrack.getMaxVolume()); |
- WebrtcLog("Native sample rate = " |
- + AudioTrack.getNativeOutputSampleRate( |
- AudioManager.STREAM_VOICE_CALL)); |
- |
- final int playBufSize = minPlayBufSize; // 3200; // 100 ms buffer |
- // byte[] playBuffer = new byte [playBufSize]; |
- try { |
- _at = new AudioTrack( |
- AudioManager.STREAM_VOICE_CALL, |
- 16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT, |
- playBufSize, AudioTrack.MODE_STREAM); |
- } catch (Exception e) { |
- WebrtcLog(e.getMessage()); |
- } |
- |
- // Log some info (non-static) |
- WebrtcLog("Notification marker pos = " |
- + _at.getNotificationMarkerPosition()); |
- WebrtcLog("Play head pos = " + _at.getPlaybackHeadPosition()); |
- WebrtcLog("Pos notification dt = " |
- + _at.getPositionNotificationPeriod()); |
- WebrtcLog("Playback rate = " + _at.getPlaybackRate()); |
- WebrtcLog("Sample rate = " + _at.getSampleRate()); |
- |
- // implementation of the playpos callback functions |
- // _at.setPlaybackPositionUpdateListener( |
- // new AudioTrack.OnPlaybackPositionUpdateListener() { |
- // |
- // int count = 3200; |
- // |
- // public void onPeriodicNotification(AudioTrack track) { |
- // // int wrBytes = play.write(playBuffer, count, 320); |
- // count += 320; |
- // } |
- // |
- // public void onMarkerReached(AudioTrack track) { |
- // } |
- // }); |
- |
- // set the notification period = 160 samples |
- // int ret = _at.setPositionNotificationPeriod(160); |
- |
- if (_playFromFile) { |
- _fr = new File("/sdcard/singleUserDemo.pcm"); |
- try { |
- _in = new FileInputStream(_fr); |
- } catch (FileNotFoundException e1) { |
- e1.printStackTrace(); |
- } |
- } |
- |
- // try { |
- // in.read(playBuffer); |
- // } catch (IOException e) { |
- // e.printStackTrace(); |
- // } |
- |
- _isRunningPlay = true; |
- |
- // buffer = new byte[3200]; |
- _playThread = new Thread(_playProc); |
- // ar.startRecording(); |
- // bytesRead = 3200; |
- // recording = true; |
- _playThread.start(); |
- |
- return 0; |
- } |
- |
- int stopPlayAudio() { |
- if (!_isRunningPlay) { |
- return 0; |
- } |
- |
- _isRunningPlay = false; |
- |
- return 0; |
- } |
- |
- private Runnable _playProc = new Runnable() { |
- public void run() { |
- |
- // set high thread priority |
- android.os.Process.setThreadPriority( |
- android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); |
- |
- // play all at once |
- // int wrBytes = play.write(playBuffer, 0, 320000); |
- |
- // fill the buffer |
- // play.write(playBuffer, 0, 3200); |
- |
- // play.flush(); |
- |
- // start playout |
- try { |
- _at.play(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- // play with multiple writes |
- int i = 0; |
- for (; i < 3000 && _isRunningPlay; i++) { |
- |
- if (_playFromFile) { |
- try { |
- _in.read(_playBuffer); |
- } catch (IOException e) { |
- e.printStackTrace(); |
- } |
- |
- int wrBytes = _at.write(_playBuffer, 0 /* i * 320 */, 320); |
- } else { |
- int wrSamples = |
- _at.write(_circBuffer, _playIndex * 160, |
- 160); |
- |
- // WebrtcLog("Played 10 ms from buffer, _playIndex = " + |
- // _playIndex); |
- // WebrtcLog("Diff = " + (_recIndex - _playIndex)); |
- |
- if (_playIndex == 49) { |
- _playIndex = 0; |
- } else { |
- _playIndex += 1; |
- } |
- } |
- |
- // WebrtcLog("Wrote 10 ms to buffer, head = " |
- // + _at.getPlaybackHeadPosition()); |
- } |
- |
- // stop playout |
- try { |
- _at.stop(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- // returns the number of samples that has been written |
- WebrtcLog("Test stopped, i = " + i + ", head = " |
- + _at.getPlaybackHeadPosition()); |
- int headPos = _at.getPlaybackHeadPosition(); |
- |
- // flush the buffers |
- _at.flush(); |
- |
- // release the object |
- _at.release(); |
- _at = null; |
- |
- // try { |
- // Thread.sleep() must be within a try - catch block |
- // Thread.sleep(3000); |
- // }catch (Exception e){ |
- // System.out.println(e.getMessage()); |
- // } |
- |
- _isRunningPlay = false; |
- |
- } |
- }; |
- |
- int recAudioInThread() { |
- |
- if (_isRunningRec) { |
- return 0; |
- } |
- |
- // within |
- // onPeriodicNotification |
- |
- // reset index |
- _recIndex = 20; |
- |
- // Log some info (static) |
- WebrtcLog("Creating AudioRecord object"); |
- final int minRecBufSize = AudioRecord.getMinBufferSize(16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT); |
- WebrtcLog("Min rec buf size = " + minRecBufSize); |
- // WebrtcLog("Min volume = " + AudioTrack.getMinVolume()); |
- // WebrtcLog("Max volume = " + AudioTrack.getMaxVolume()); |
- // WebrtcLog("Native sample rate = " |
- // + AudioRecord |
- // .getNativeInputSampleRate(AudioManager.STREAM_VOICE_CALL)); |
- |
- final int recBufSize = minRecBufSize; // 3200; // 100 ms buffer |
- try { |
- _ar = new AudioRecord( |
- MediaRecorder.AudioSource.MIC, |
- 16000, |
- AudioFormat.CHANNEL_CONFIGURATION_MONO, |
- AudioFormat.ENCODING_PCM_16BIT, |
- recBufSize); |
- } catch (Exception e) { |
- WebrtcLog(e.getMessage()); |
- } |
- |
- // Log some info (non-static) |
- WebrtcLog("Notification marker pos = " |
- + _ar.getNotificationMarkerPosition()); |
- // WebrtcLog("Play head pos = " + _ar.getRecordHeadPosition()); |
- WebrtcLog("Pos notification dt rec= " |
- + _ar.getPositionNotificationPeriod()); |
- // WebrtcLog("Playback rate = " + _ar.getRecordRate()); |
- // WebrtcLog("Playback rate = " + _ar.getPlaybackRate()); |
- WebrtcLog("Sample rate = " + _ar.getSampleRate()); |
- // WebrtcLog("Playback rate = " + _ar.getPlaybackRate()); |
- // WebrtcLog("Playback rate = " + _ar.getPlaybackRate()); |
- |
- _isRunningRec = true; |
- |
- _recThread = new Thread(_recProc); |
- |
- _recThread.start(); |
- |
- return 0; |
- } |
- |
- int stopRecAudio() { |
- if (!_isRunningRec) { |
- return 0; |
- } |
- |
- _isRunningRec = false; |
- |
- return 0; |
- } |
- |
- private Runnable _recProc = new Runnable() { |
- public void run() { |
- |
- // set high thread priority |
- android.os.Process.setThreadPriority( |
- android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); |
- |
- // start recording |
- try { |
- _ar.startRecording(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- // keep recording to circular buffer |
- // for a while |
- int i = 0; |
- int rdSamples = 0; |
- short[] tempBuffer = new short[160]; // Only used for native case |
- |
- for (; i < 3000 && _isRunningRec; i++) { |
- if (_runThroughNativeLayer) { |
- rdSamples = _ar.read(tempBuffer, 0, 160); |
- // audioLoop(tempBuffer, 160); // Insert into native layer |
- } else { |
- rdSamples = _ar.read(_circBuffer, _recIndex * 160, 160); |
- |
- // WebrtcLog("Recorded 10 ms to buffer, _recIndex = " + |
- // _recIndex); |
- // WebrtcLog("rdSamples = " + rdSamples); |
- |
- if (_recIndex == 49) { |
- _recIndex = 0; |
- } else { |
- _recIndex += 1; |
- } |
- } |
- } |
- |
- // stop recording |
- try { |
- _ar.stop(); |
- } catch (IllegalStateException e) { |
- e.printStackTrace(); |
- } |
- |
- // release the object |
- _ar.release(); |
- _ar = null; |
- |
- // try { |
- // Thread.sleep() must be within a try - catch block |
- // Thread.sleep(3000); |
- // }catch (Exception e){ |
- // System.out.println(e.getMessage()); |
- // } |
- |
- _isRunningRec = false; |
- |
- // returns the number of samples that has been written |
- // WebrtcLog("Test stopped, i = " + i + ", head = " |
- // + _at.getPlaybackHeadPosition()); |
- // int headPos = _at.getPlaybackHeadPosition(); |
- } |
- }; |
- |
- private void WebrtcLog(String msg) { |
- Log.d("*Webrtc*", msg); |
- } |
- |
- // //////////////// Native function prototypes //////////////////// |
- |
- private native static boolean NativeInit(); |
- |
- private native int RunAutoTest(int testType, int extendedSel); |
- |
- private native boolean Create(); |
- |
- private native boolean Delete(); |
- |
- private native int Init(boolean enableTrace, boolean useExtTrans); |
- |
- private native int Terminate(); |
- |
- private native int CreateChannel(); |
- |
- private native int DeleteChannel(int channel); |
- |
- private native int SetLocalReceiver(int channel, int port); |
- |
- private native int SetSendDestination(int channel, int port, |
- String ipaddr); |
- |
- private native int StartListen(int channel); |
- |
- private native int StartPlayout(int channel); |
- |
- private native int StartSend(int channel); |
- |
- private native int StopListen(int channel); |
- |
- private native int StopPlayout(int channel); |
- |
- private native int StopSend(int channel); |
- |
- private native int StartPlayingFileLocally(int channel, String fileName, |
- boolean loop); |
- |
- private native int StopPlayingFileLocally(int channel); |
- |
- private native int StartRecordingPlayout(int channel, String fileName, |
- boolean loop); |
- |
- private native int StopRecordingPlayout(int channel); |
- |
- private native int StartPlayingFileAsMicrophone(int channel, |
- String fileName, boolean loop); |
- |
- private native int StopPlayingFileAsMicrophone(int channel); |
- |
- private native int NumOfCodecs(); |
- |
- private native int SetSendCodec(int channel, int index); |
- |
- private native int SetVADStatus(int channel, boolean enable, int mode); |
- |
- private native int SetNSStatus(boolean enable, int mode); |
- |
- private native int SetAGCStatus(boolean enable, int mode); |
- |
- private native int SetECStatus(boolean enable, int mode); |
- |
- private native int SetSpeakerVolume(int volume); |
- |
- private native int SetLoudspeakerStatus(boolean enable); |
- |
- /* |
- * this is used to load the 'webrtc-voice-demo-jni' |
- * library on application startup. |
- * The library has already been unpacked into |
- * /data/data/webrtc.android.AndroidTest/lib/libwebrtc-voice-demo-jni.so |
- * at installation time by the package manager. |
- */ |
- static { |
- Log.d("*Webrtc*", "Loading webrtc-voice-demo-jni..."); |
- System.loadLibrary("webrtc-voice-demo-jni"); |
- |
- Log.d("*Webrtc*", "Calling native init..."); |
- if (!NativeInit()) { |
- Log.e("*Webrtc*", "Native init failed"); |
- throw new RuntimeException("Native init failed"); |
- } else { |
- Log.d("*Webrtc*", "Native init successful"); |
- } |
- } |
-} |