Index: media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
diff --git a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
index 1a9cb0a383687af8f62e67fa8864f05a6917e742..9bf82cfefb760ba534f09419d4892b17b9e290ae 100644 |
--- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
+++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
@@ -11,6 +11,7 @@ import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
import android.content.pm.PackageManager; |
+import android.media.audiofx.AcousticEchoCanceler; |
import android.media.AudioFormat; |
import android.media.AudioManager; |
import android.media.AudioRecord; |
@@ -104,6 +105,14 @@ class AudioManagerAndroid { |
// fails. |
private static final int DEFAULT_FRAME_PER_BUFFER = 256; |
+ // List of device models which have been vetted for good quality platform |
+ // echo cancellation. |
+ private static final Set<String> PLATFORM_AEC_MODEL_WHITELIST = |
+ new HashSet<String>(Arrays.asList(new String[] { |
+ "Nexus 5", |
+ "Nexus 7" |
+ })); |
+ |
private final AudioManager mAudioManager; |
private final Context mContext; |
@@ -278,7 +287,7 @@ class AudioManagerAndroid { |
@CalledByNative |
private int getNativeOutputSampleRate() { |
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { |
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
String sampleRateString = mAudioManager.getProperty( |
AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); |
return (sampleRateString == null ? |
@@ -342,6 +351,20 @@ class AudioManagerAndroid { |
DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
} |
+ @CalledByNative |
+ public static boolean isPlatformAECSupported() { |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { |
+ // AcousticEchoCanceler was added in API level 16 (Jelly Bean). |
+ return false; |
+ } |
+ |
+ boolean isAvailable = AcousticEchoCanceler.isAvailable(); |
+ boolean isWhitelisted = PLATFORM_AEC_MODEL_WHITELIST.contains(Build.MODEL); |
+ logd("AcousticEchoCanceler.isAvailable: " + isAvailable); |
+ logd("Build.MODEL: " + Build.MODEL + " isWhitelisted: " + isWhitelisted); |
+ return isAvailable && isWhitelisted; |
+ } |
+ |
/** Sets the speaker phone mode. */ |
public void setSpeakerphoneOn(boolean on) { |
boolean wasOn = mAudioManager.isSpeakerphoneOn(); |
@@ -567,12 +590,12 @@ class AudioManagerAndroid { |
} |
/** Trivial helper method for debug logging */ |
- private void logd(String msg) { |
+ private static void logd(String msg) { |
Log.d(TAG, msg); |
} |
/** Trivial helper method for error logging */ |
- private void loge(String msg) { |
+ private static void loge(String msg) { |
Log.e(TAG, msg); |
} |
} |