Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java

Issue 1344563002: Improving support for Android Audio Effects in WebRTC (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Improved comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
diff --git a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
index fbd7ea322ca42a7360ffcf32d6584dd4c3e200d5..ef1d7aca229e8ce0ebd2e23d1bd079a48321b267 100644
--- a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
+++ b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
@@ -22,29 +22,111 @@ import android.os.Process;
import org.webrtc.Logging;
import java.lang.Thread;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public final class WebRtcAudioUtils {
- // List of devices where it has been verified that the built-in AEC performs
- // bad and where it makes sense to avoid using it and instead rely on the
- // native WebRTC AEC instead. The device name is given by Build.MODEL.
- private static final String[] BLACKLISTED_AEC_MODELS = new String[] {
- "Nexus 5", // Nexus 5
- "D6503", // Sony Xperia Z2 D6503
- };
+ private static final String TAG = "WebRtcAudioUtils";
// List of devices where we have seen issues (e.g. bad audio quality) using
- // the low latency ouput mode in combination with OpenSL ES.
+ // the low latency output mode in combination with OpenSL ES.
// The device name is given by Build.MODEL.
private static final String[] BLACKLISTED_OPEN_SL_ES_MODELS = new String[] {
"Nexus 6", // Nexus 6
};
- // Use 44.1kHz as the default sampling rate.
- private static final int SAMPLE_RATE_HZ = 44100;
+ // List of devices where it has been verified that the built-in effect
+ // bad and where it makes sense to avoid using it and instead rely on the
+ // native WebRTC version instead. The device name is given by Build.MODEL.
+ private static final String[] BLACKLISTED_AEC_MODELS = new String[] {
+ "Nexus 5",
+ "D6503", // Sony Xperia Z2 D6503
+ };
+ private static final String[] BLACKLISTED_AGC_MODELS = new String[] {
+ "Nexus 10",
+ "Nexus 9",
+ };
+ private static final String[] BLACKLISTED_NS_MODELS = new String[] {
+ "Nexus 10",
+ "Nexus 9",
+ "Nexus 6",
+ "Nexus 5",
+ };
+
+ // Use 16kHz as the default sample rate. A higher sample rate might prevent
+ // us from supporting communication mode on some older (e.g. ICS) devices.
+ private static final int DEFAULT_SAMPLE_RATE_HZ = 16000;
+ private static int defaultSampleRateHz = DEFAULT_SAMPLE_RATE_HZ;
+ // Set to true if setDefaultSampleRateHz() has been called.
+ private static boolean isDefaultSampleRateOverridden = false;
+
+ // By default, utilize hardware based audio effects when available.
+ private static boolean useWebRtcBasedAcousticEchoCanceler = false;
+ private static boolean useWebRtcBasedAutomaticGainControl = false;
+ private static boolean useWebRtcBasedNoiseSuppressor = false;
+
+ // Call these methods if any hardware based effect shall be replaced by a
+ // software based version provided by the WebRTC stack instead.
+ public static synchronized void setWebRtcBasedAcousticEchoCanceler(
+ boolean enable) {
+ useWebRtcBasedAcousticEchoCanceler = enable;
+ }
+ public static synchronized void setWebRtcBasedAutomaticGainControl(
+ boolean enable) {
+ useWebRtcBasedAutomaticGainControl = enable;
+ }
+ public static synchronized void setWebRtcBasedNoiseSuppressor(
+ boolean enable) {
+ useWebRtcBasedNoiseSuppressor = enable;
+ }
+
+ public static synchronized boolean useWebRtcBasedAcousticEchoCanceler() {
+ if (useWebRtcBasedAcousticEchoCanceler) {
+ Logging.w(TAG, "Overriding default behavior; now using WebRTC AEC!");
+ }
+ return useWebRtcBasedAcousticEchoCanceler;
+ }
+ public static synchronized boolean useWebRtcBasedAutomaticGainControl() {
+ if (useWebRtcBasedAutomaticGainControl) {
+ Logging.w(TAG, "Overriding default behavior; now using WebRTC AGC!");
+ }
+ return useWebRtcBasedAutomaticGainControl;
+ }
+ public static synchronized boolean useWebRtcBasedNoiseSuppressor() {
+ if (useWebRtcBasedNoiseSuppressor) {
+ Logging.w(TAG, "Overriding default behavior; now using WebRTC NS!");
+ }
+ return useWebRtcBasedNoiseSuppressor;
+ }
+
+ // Call this method if the default handling of querying the native sample
+ // rate shall be overridden. Can be useful on some devices where the
+ // available Android APIs are known to return invalid results.
+ public static synchronized void setDefaultSampleRateHz(int sampleRateHz) {
+ isDefaultSampleRateOverridden = true;
+ defaultSampleRateHz = sampleRateHz;
+ }
+
+ public static synchronized boolean isDefaultSampleRateOverridden() {
+ return isDefaultSampleRateOverridden;
+ }
+
+ public static synchronized int getDefaultSampleRateHz() {
+ return defaultSampleRateHz;
+ }
+
+ public static List<String> getBlackListedModelsForAecUsage() {
+ return Arrays.asList(WebRtcAudioUtils.BLACKLISTED_AEC_MODELS);
+ }
+
+ public static List<String> getBlackListedModelsForAgcUsage() {
+ return Arrays.asList(WebRtcAudioUtils.BLACKLISTED_AGC_MODELS);
+ }
+
+ public static List<String> getBlackListedModelsForNsUsage() {
+ return Arrays.asList(WebRtcAudioUtils.BLACKLISTED_NS_MODELS);
+ }
public static boolean runningOnGingerBreadOrHigher() {
// November 2010: Android 2.3, API Level 9.
@@ -78,12 +160,6 @@ public final class WebRtcAudioUtils {
Build.BRAND.startsWith("generic_");
}
- // Returns true if the device is blacklisted for HW AEC usage.
- public static boolean deviceIsBlacklistedForHwAecUsage() {
- List<String> blackListedModels = Arrays.asList(BLACKLISTED_AEC_MODELS);
- return blackListedModels.contains(Build.MODEL);
- }
-
// Returns true if the device is blacklisted for OpenSL ES usage.
public static boolean deviceIsBlacklistedForOpenSLESUsage() {
List<String> blackListedModels =
@@ -91,23 +167,6 @@ public final class WebRtcAudioUtils {
return blackListedModels.contains(Build.MODEL);
}
- // Returns true if the device supports Acoustic Echo Canceler (AEC).
- public static boolean isAcousticEchoCancelerSupported() {
- // AcousticEchoCanceler was added in API level 16 (Jelly Bean).
- if (!WebRtcAudioUtils.runningOnJellyBeanOrHigher()) {
- return false;
- }
- // Check if the device implements acoustic echo cancellation.
- return AcousticEchoCanceler.isAvailable();
- }
-
- // Returns true if the device supports AEC and it not blacklisted.
- public static boolean isAcousticEchoCancelerApproved() {
- if (deviceIsBlacklistedForHwAecUsage())
- return false;
- return isAcousticEchoCancelerSupported();
- }
-
// Information about the current build, taken from system properties.
public static void logDeviceInfo(String tag) {
Logging.d(tag, "Android SDK: " + Build.VERSION.SDK_INT + ", "

Powered by Google App Engine
This is Rietveld 408576698