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