From 5641fbb5ec6d1d2bcb5fa988dd7a2b457f999928 Mon Sep 17 00:00:00 2001 From: henrika Date: Wed, 21 Feb 2018 14:12:53 +0100 Subject: [PATCH] Add support for saving local audio input to file in AppRTCMobile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uses new WebRtcAudioRecordSamplesReadyCallback which was added recently in https://webrtc-review.googlesource.com/c/src/+/49981. This CL: - Serves as a test of new WebRtcAudioRecordSamplesReadyCallback. - Useful for debugging purposes since it records the most native raw audio. Bug: None Change-Id: I57375cbf237c171e045b0bdb05f7ae1401930fbc Reviewed-on: https://webrtc-review.googlesource.com/53120 Commit-Queue: Henrik Andreassson Reviewed-by: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#22128} --- examples/BUILD.gn | 1 + examples/androidapp/res/values/strings.xml | 5 + examples/androidapp/res/xml/preferences.xml | 6 + .../src/org/appspot/apprtc/CallActivity.java | 3 + .../org/appspot/apprtc/ConnectActivity.java | 7 +- .../appspot/apprtc/PeerConnectionClient.java | 52 +++++-- .../apprtc/RecordedAudioToFileController.java | 138 ++++++++++++++++++ .../org/appspot/apprtc/SettingsActivity.java | 5 + .../apprtc/test/PeerConnectionClientTest.java | 6 +- 9 files changed, 204 insertions(+), 19 deletions(-) create mode 100644 examples/androidapp/src/org/appspot/apprtc/RecordedAudioToFileController.java diff --git a/examples/BUILD.gn b/examples/BUILD.gn index c37bcce941..c6940e8d9b 100644 --- a/examples/BUILD.gn +++ b/examples/BUILD.gn @@ -84,6 +84,7 @@ if (is_android) { "androidapp/src/org/appspot/apprtc/PeerConnectionClient.java", "androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java", "androidapp/src/org/appspot/apprtc/RtcEventLog.java", + "androidapp/src/org/appspot/apprtc/RecordedAudioToFileController.java", "androidapp/src/org/appspot/apprtc/SettingsActivity.java", "androidapp/src/org/appspot/apprtc/SettingsFragment.java", "androidapp/src/org/appspot/apprtc/TCPChannelClient.java", diff --git a/examples/androidapp/res/values/strings.xml b/examples/androidapp/res/values/strings.xml index 4aec2c1850..ea525ebee9 100644 --- a/examples/androidapp/res/values/strings.xml +++ b/examples/androidapp/res/values/strings.xml @@ -125,6 +125,11 @@ Enable diagnostic audio recordings. false + enable_key + Save input audio to file. + Save input audio to file. + false + opensles_preference Use OpenSL ES for audio playback. Use OpenSL ES for audio playback. diff --git a/examples/androidapp/res/xml/preferences.xml b/examples/androidapp/res/xml/preferences.xml index e8b9547b6f..6372a6eada 100644 --- a/examples/androidapp/res/xml/preferences.xml +++ b/examples/androidapp/res/xml/preferences.xml @@ -123,6 +123,12 @@ android:dialogTitle="@string/pref_aecdump_dlg" android:defaultValue="@string/pref_aecdump_default" /> + + { + if (rawAudioFileOutputStream != null) { + try { + // Set a limit on max file size. 58348800 bytes corresponds to + // approximately 10 minutes of recording in mono at 48kHz. + if (fileSizeInBytes < MAX_FILE_SIZE_IN_BYTES) { + // Writes samples.getData().length bytes to output stream. + rawAudioFileOutputStream.write(samples.getData()); + fileSizeInBytes += samples.getData().length; + } + } catch (IOException e) { + Log.e(TAG, "Failed to write audio to file: " + e.getMessage()); + } + } + }); + } +} diff --git a/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java b/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java index 152bb7d968..eea596114d 100644 --- a/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java +++ b/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java @@ -42,6 +42,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan private String keyPrefAudioCodec; private String keyprefNoAudioProcessing; private String keyprefAecDump; + private String keyprefEnableSaveInputAudioToFile; private String keyprefOpenSLES; private String keyprefDisableBuiltInAEC; private String keyprefDisableBuiltInAGC; @@ -84,6 +85,8 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan keyPrefAudioCodec = getString(R.string.pref_audiocodec_key); keyprefNoAudioProcessing = getString(R.string.pref_noaudioprocessing_key); keyprefAecDump = getString(R.string.pref_aecdump_key); + keyprefEnableSaveInputAudioToFile = + getString(R.string.pref_enable_save_input_audio_to_file_key); keyprefOpenSLES = getString(R.string.pref_opensles_key); keyprefDisableBuiltInAEC = getString(R.string.pref_disable_built_in_aec_key); keyprefDisableBuiltInAGC = getString(R.string.pref_disable_built_in_agc_key); @@ -140,6 +143,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan updateSummary(sharedPreferences, keyPrefAudioCodec); updateSummaryB(sharedPreferences, keyprefNoAudioProcessing); updateSummaryB(sharedPreferences, keyprefAecDump); + updateSummaryB(sharedPreferences, keyprefEnableSaveInputAudioToFile); updateSummaryB(sharedPreferences, keyprefOpenSLES); updateSummaryB(sharedPreferences, keyprefDisableBuiltInAEC); updateSummaryB(sharedPreferences, keyprefDisableBuiltInAGC); @@ -235,6 +239,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan || key.equals(keyprefFlexfec) || key.equals(keyprefNoAudioProcessing) || key.equals(keyprefAecDump) + || key.equals(keyprefEnableSaveInputAudioToFile) || key.equals(keyprefOpenSLES) || key.equals(keyprefDisableBuiltInAEC) || key.equals(keyprefDisableBuiltInAGC) diff --git a/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java b/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java index c9c74b7990..b1a3907d83 100644 --- a/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java +++ b/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java @@ -344,9 +344,10 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { "OPUS", /* audioCodec */ false, /* noAudioProcessing */ false, /* aecDump */ + false, /* saveInputAudioToFile */ false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* disableBuiltInAGC */, false /* disableBuiltInNS */, false /* enableLevelControl */, false /* disableWebRtcAGC */, - false /* enableRtcEventLog */); + false /* enableRtcEventLog */, null /*dataChannelParameters */); } private VideoCapturer createCameraCapturer(boolean captureToTexture) { @@ -380,9 +381,10 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { "OPUS", /* audioCodec */ false, /* noAudioProcessing */ false, /* aecDump */ + false, /* saveInputAudioToFile */ false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* disableBuiltInAGC */, false /* disableBuiltInNS */, false /* enableLevelControl */, false /* disableWebRtcAGC */, - false /* enableRtcEventLog */); + false /* enableRtcEventLog */, null /*dataChannelParameters */); } @Before