Decouple input and output sample rate overrides.

We may sometimes want to override only input or only output, or
override them with different values. This change allows setting the
overrides separately.


Change-Id: Ib0c44cb7a3cfa834f997fb6cd54f7cad68705f41
Bug: webrtc:10441
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128763
Commit-Queue: Paulina Hensman <phensman@webrtc.org>
Reviewed-by: Henrik Andreassson <henrika@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27236}
diff --git a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java
index 4b4c63b..3adc6b6 100644
--- a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java
+++ b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java
@@ -29,7 +29,8 @@
   public static class Builder {
     private final Context context;
     private final AudioManager audioManager;
-    private int sampleRate;
+    private int inputSampleRate;
+    private int outputSampleRate;
     private int audioSource = WebRtcAudioRecord.DEFAULT_AUDIO_SOURCE;
     private int audioFormat = WebRtcAudioRecord.DEFAULT_AUDIO_FORMAT;
     private AudioTrackErrorCallback audioTrackErrorCallback;
@@ -43,7 +44,8 @@
     private Builder(Context context) {
       this.context = context;
       this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-      this.sampleRate = WebRtcAudioManager.getSampleRate(audioManager);
+      this.inputSampleRate = WebRtcAudioManager.getSampleRate(audioManager);
+      this.outputSampleRate = WebRtcAudioManager.getSampleRate(audioManager);
     }
 
     /**
@@ -52,8 +54,27 @@
      * return invalid results.
      */
     public Builder setSampleRate(int sampleRate) {
-      Logging.d(TAG, "Sample rate overridden to: " + sampleRate);
-      this.sampleRate = sampleRate;
+      Logging.d(TAG, "Input/Output sample rate overridden to: " + sampleRate);
+      this.inputSampleRate = sampleRate;
+      this.outputSampleRate = sampleRate;
+      return this;
+    }
+
+    /**
+     * Call this method to specifically override input sample rate.
+     */
+    public Builder setInputSampleRate(int inputSampleRate) {
+      Logging.d(TAG, "Input sample rate overridden to: " + inputSampleRate);
+      this.inputSampleRate = inputSampleRate;
+      return this;
+    }
+
+    /**
+     * Call this method to specifically override output sample rate.
+     */
+    public Builder setOutputSampleRate(int outputSampleRate) {
+      Logging.d(TAG, "Output sample rate overridden to: " + outputSampleRate);
+      this.outputSampleRate = outputSampleRate;
       return this;
     }
 
@@ -171,8 +192,8 @@
           useHardwareAcousticEchoCanceler, useHardwareNoiseSuppressor);
       final WebRtcAudioTrack audioOutput =
           new WebRtcAudioTrack(context, audioManager, audioTrackErrorCallback);
-      return new JavaAudioDeviceModule(context, audioManager, audioInput, audioOutput, sampleRate,
-          useStereoInput, useStereoOutput);
+      return new JavaAudioDeviceModule(context, audioManager, audioInput, audioOutput,
+          inputSampleRate, outputSampleRate, useStereoInput, useStereoOutput);
     }
   }
 
@@ -264,7 +285,8 @@
   private final AudioManager audioManager;
   private final WebRtcAudioRecord audioInput;
   private final WebRtcAudioTrack audioOutput;
-  private final int sampleRate;
+  private final int inputSampleRate;
+  private final int outputSampleRate;
   private final boolean useStereoInput;
   private final boolean useStereoOutput;
 
@@ -272,13 +294,14 @@
   private long nativeAudioDeviceModule;
 
   private JavaAudioDeviceModule(Context context, AudioManager audioManager,
-      WebRtcAudioRecord audioInput, WebRtcAudioTrack audioOutput, int sampleRate,
-      boolean useStereoInput, boolean useStereoOutput) {
+      WebRtcAudioRecord audioInput, WebRtcAudioTrack audioOutput, int inputSampleRate,
+      int outputSampleRate, boolean useStereoInput, boolean useStereoOutput) {
     this.context = context;
     this.audioManager = audioManager;
     this.audioInput = audioInput;
     this.audioOutput = audioOutput;
-    this.sampleRate = sampleRate;
+    this.inputSampleRate = inputSampleRate;
+    this.outputSampleRate = outputSampleRate;
     this.useStereoInput = useStereoInput;
     this.useStereoOutput = useStereoOutput;
   }
@@ -288,7 +311,7 @@
     synchronized (nativeLock) {
       if (nativeAudioDeviceModule == 0) {
         nativeAudioDeviceModule = nativeCreateAudioDeviceModule(context, audioManager, audioInput,
-            audioOutput, sampleRate, useStereoInput, useStereoOutput);
+            audioOutput, inputSampleRate, outputSampleRate, useStereoInput, useStereoOutput);
       }
       return nativeAudioDeviceModule;
     }
@@ -318,5 +341,5 @@
 
   private static native long nativeCreateAudioDeviceModule(Context context,
       AudioManager audioManager, WebRtcAudioRecord audioInput, WebRtcAudioTrack audioOutput,
-      int sampleRate, boolean useStereoInput, boolean useStereoOutput);
+      int inputSampleRate, int outputSampleRate, boolean useStereoInput, boolean useStereoOutput);
 }
diff --git a/sdk/android/native_api/audio_device_module/audio_device_android.cc b/sdk/android/native_api/audio_device_module/audio_device_android.cc
index fb7ce91..dd1b367 100644
--- a/sdk/android/native_api/audio_device_module/audio_device_android.cc
+++ b/sdk/android/native_api/audio_device_module/audio_device_android.cc
@@ -40,9 +40,11 @@
   const JavaParamRef<jobject> j_context(application_context);
   const ScopedJavaLocalRef<jobject> j_audio_manager =
       jni::GetAudioManager(env, j_context);
-  const int sample_rate = jni::GetDefaultSampleRate(env, j_audio_manager);
-  jni::GetAudioParameters(env, j_context, j_audio_manager, sample_rate,
-                          false /* use_stereo_input */,
+  const int input_sample_rate = jni::GetDefaultSampleRate(env, j_audio_manager);
+  const int output_sample_rate =
+      jni::GetDefaultSampleRate(env, j_audio_manager);
+  jni::GetAudioParameters(env, j_context, j_audio_manager, input_sample_rate,
+                          output_sample_rate, false /* use_stereo_input */,
                           false /* use_stereo_output */, input_parameters,
                           output_parameters);
 }
diff --git a/sdk/android/native_unittests/audio_device/audio_device_unittest.cc b/sdk/android/native_unittests/audio_device/audio_device_unittest.cc
index 97f3c59..e7c9e7f 100644
--- a/sdk/android/native_unittests/audio_device/audio_device_unittest.cc
+++ b/sdk/android/native_unittests/audio_device/audio_device_unittest.cc
@@ -477,14 +477,16 @@
   int total_delay_ms() const { return 10; }
 
   void UpdateParameters() {
-    int sample_rate = GetDefaultSampleRate(jni_, audio_manager_);
+    int input_sample_rate = GetDefaultSampleRate(jni_, audio_manager_);
+    int output_sample_rate = GetDefaultSampleRate(jni_, audio_manager_);
     bool stereo_playout_is_available;
     bool stereo_record_is_available;
     audio_device_->StereoPlayoutIsAvailable(&stereo_playout_is_available);
     audio_device_->StereoRecordingIsAvailable(&stereo_record_is_available);
-    GetAudioParameters(jni_, context_, audio_manager_, sample_rate,
-                       stereo_playout_is_available, stereo_record_is_available,
-                       &input_parameters_, &output_parameters_);
+    GetAudioParameters(jni_, context_, audio_manager_, input_sample_rate,
+                       output_sample_rate, stereo_playout_is_available,
+                       stereo_record_is_available, &input_parameters_,
+                       &output_parameters_);
   }
 
   void SetActiveAudioLayer(AudioDeviceModule::AudioLayer audio_layer) {
diff --git a/sdk/android/src/jni/audio_device/audio_device_module.cc b/sdk/android/src/jni/audio_device/audio_device_module.cc
index 61be7def..437012f 100644
--- a/sdk/android/src/jni/audio_device/audio_device_module.cc
+++ b/sdk/android/src/jni/audio_device/audio_device_module.cc
@@ -615,7 +615,8 @@
 void GetAudioParameters(JNIEnv* env,
                         const JavaRef<jobject>& j_context,
                         const JavaRef<jobject>& j_audio_manager,
-                        int sample_rate,
+                        int input_sample_rate,
+                        int output_sample_rate,
                         bool use_stereo_input,
                         bool use_stereo_output,
                         AudioParameters* input_parameters,
@@ -623,12 +624,14 @@
   const int output_channels = use_stereo_output ? 2 : 1;
   const int input_channels = use_stereo_input ? 2 : 1;
   const size_t output_buffer_size = Java_WebRtcAudioManager_getOutputBufferSize(
-      env, j_context, j_audio_manager, sample_rate, output_channels);
+      env, j_context, j_audio_manager, output_sample_rate, output_channels);
   const size_t input_buffer_size = Java_WebRtcAudioManager_getInputBufferSize(
-      env, j_context, j_audio_manager, sample_rate, input_channels);
-  output_parameters->reset(sample_rate, static_cast<size_t>(output_channels),
+      env, j_context, j_audio_manager, input_sample_rate, input_channels);
+  output_parameters->reset(output_sample_rate,
+                           static_cast<size_t>(output_channels),
                            static_cast<size_t>(output_buffer_size));
-  input_parameters->reset(sample_rate, static_cast<size_t>(input_channels),
+  input_parameters->reset(input_sample_rate,
+                          static_cast<size_t>(input_channels),
                           static_cast<size_t>(input_buffer_size));
   RTC_CHECK(input_parameters->is_valid());
   RTC_CHECK(output_parameters->is_valid());
diff --git a/sdk/android/src/jni/audio_device/audio_device_module.h b/sdk/android/src/jni/audio_device/audio_device_module.h
index 476da14..34979fe 100644
--- a/sdk/android/src/jni/audio_device/audio_device_module.h
+++ b/sdk/android/src/jni/audio_device/audio_device_module.h
@@ -78,7 +78,8 @@
 void GetAudioParameters(JNIEnv* env,
                         const JavaRef<jobject>& j_context,
                         const JavaRef<jobject>& j_audio_manager,
-                        int sample_rate,
+                        int input_sample_rate,
+                        int output_sample_rate,
                         bool use_stereo_input,
                         bool use_stereo_output,
                         AudioParameters* input_parameters,
diff --git a/sdk/android/src/jni/audio_device/java_audio_device_module.cc b/sdk/android/src/jni/audio_device/java_audio_device_module.cc
index 2b55c50..148340f 100644
--- a/sdk/android/src/jni/audio_device/java_audio_device_module.cc
+++ b/sdk/android/src/jni/audio_device/java_audio_device_module.cc
@@ -23,13 +23,15 @@
     const JavaParamRef<jobject>& j_audio_manager,
     const JavaParamRef<jobject>& j_webrtc_audio_record,
     const JavaParamRef<jobject>& j_webrtc_audio_track,
-    int sample_rate,
+    int input_sample_rate,
+    int output_sample_rate,
     jboolean j_use_stereo_input,
     jboolean j_use_stereo_output) {
   AudioParameters input_parameters;
   AudioParameters output_parameters;
-  GetAudioParameters(env, j_context, j_audio_manager, sample_rate,
-                     j_use_stereo_input, j_use_stereo_output, &input_parameters,
+  GetAudioParameters(env, j_context, j_audio_manager, input_sample_rate,
+                     output_sample_rate, j_use_stereo_input,
+                     j_use_stereo_output, &input_parameters,
                      &output_parameters);
   auto audio_input = absl::make_unique<AudioRecordJni>(
       env, input_parameters, kHighLatencyModeDelayEstimateInMilliseconds,