Use low latency mode on Android O and later.
This CL makes it possible to use a low-latency mode on Android O and later. This should help to reduce the audio latency. The feature is disabled by default and needs to be enabled when creating the audio device module. Bug: webrtc:12284 Change-Id: Idf41146aa0bc1206e9a2e28e4101d85c3e4eaefc Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/196741 Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Reviewed-by: Henrik Andreassson <henrika@webrtc.org> Commit-Queue: Ivo Creusen <ivoc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32854}
This commit is contained in:
@ -49,12 +49,14 @@ public class JavaAudioDeviceModule implements AudioDeviceModule {
|
||||
private boolean useStereoInput;
|
||||
private boolean useStereoOutput;
|
||||
private AudioAttributes audioAttributes;
|
||||
private boolean useLowLatency;
|
||||
|
||||
private Builder(Context context) {
|
||||
this.context = context;
|
||||
this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
this.inputSampleRate = WebRtcAudioManager.getSampleRate(audioManager);
|
||||
this.outputSampleRate = WebRtcAudioManager.getSampleRate(audioManager);
|
||||
this.useLowLatency = false;
|
||||
}
|
||||
|
||||
public Builder setScheduler(ScheduledExecutorService scheduler) {
|
||||
@ -195,6 +197,14 @@ public class JavaAudioDeviceModule implements AudioDeviceModule {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Control if the low-latency mode should be used. The default is disabled.
|
||||
*/
|
||||
public Builder setUseLowLatency(boolean useLowLatency) {
|
||||
this.useLowLatency = useLowLatency;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set custom {@link AudioAttributes} to use.
|
||||
*/
|
||||
@ -225,6 +235,12 @@ public class JavaAudioDeviceModule implements AudioDeviceModule {
|
||||
}
|
||||
Logging.d(TAG, "HW AEC will not be used.");
|
||||
}
|
||||
// Low-latency mode was introduced in API version 26, see
|
||||
// https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_LOW_LATENCY
|
||||
final int MIN_LOW_LATENCY_SDK_VERSION = 26;
|
||||
if (useLowLatency && Build.VERSION.SDK_INT >= MIN_LOW_LATENCY_SDK_VERSION) {
|
||||
Logging.d(TAG, "Low latency mode will be used.");
|
||||
}
|
||||
ScheduledExecutorService executor = this.scheduler;
|
||||
if (executor == null) {
|
||||
executor = WebRtcAudioRecord.newDefaultScheduler();
|
||||
@ -232,8 +248,8 @@ public class JavaAudioDeviceModule implements AudioDeviceModule {
|
||||
final WebRtcAudioRecord audioInput = new WebRtcAudioRecord(context, executor, audioManager,
|
||||
audioSource, audioFormat, audioRecordErrorCallback, audioRecordStateCallback,
|
||||
samplesReadyCallback, useHardwareAcousticEchoCanceler, useHardwareNoiseSuppressor);
|
||||
final WebRtcAudioTrack audioOutput = new WebRtcAudioTrack(
|
||||
context, audioManager, audioAttributes, audioTrackErrorCallback, audioTrackStateCallback);
|
||||
final WebRtcAudioTrack audioOutput = new WebRtcAudioTrack(context, audioManager,
|
||||
audioAttributes, audioTrackErrorCallback, audioTrackStateCallback, useLowLatency);
|
||||
return new JavaAudioDeviceModule(context, audioManager, audioInput, audioOutput,
|
||||
inputSampleRate, outputSampleRate, useStereoInput, useStereoOutput);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user