diff --git a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java index 4b4c63b5b7..3adc6b63b6 100644 --- a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java +++ b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java @@ -29,7 +29,8 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { * 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { 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 fb7ce91ca0..dd1b36740e 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 @@ void GetDefaultAudioParameters(JNIEnv* env, const JavaParamRef j_context(application_context); const ScopedJavaLocalRef 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 97f3c59c36..e7c9e7f374 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 @@ class AudioDeviceTest : public ::testing::Test { 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 61be7defa7..437012f6c2 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 @@ int GetDefaultSampleRate(JNIEnv* env, const JavaRef& j_audio_manager) { void GetAudioParameters(JNIEnv* env, const JavaRef& j_context, const JavaRef& 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 @@ void GetAudioParameters(JNIEnv* env, 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(output_channels), + env, j_context, j_audio_manager, input_sample_rate, input_channels); + output_parameters->reset(output_sample_rate, + static_cast(output_channels), static_cast(output_buffer_size)); - input_parameters->reset(sample_rate, static_cast(input_channels), + input_parameters->reset(input_sample_rate, + static_cast(input_channels), static_cast(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 476da14ceb..34979fe933 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 @@ int GetDefaultSampleRate(JNIEnv* env, const JavaRef& j_audio_manager); void GetAudioParameters(JNIEnv* env, const JavaRef& j_context, const JavaRef& 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 2b55c5012f..148340f561 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 @@ static jlong JNI_JavaAudioDeviceModule_CreateAudioDeviceModule( const JavaParamRef& j_audio_manager, const JavaParamRef& j_webrtc_audio_record, const JavaParamRef& 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( env, input_parameters, kHighLatencyModeDelayEstimateInMilliseconds,