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 9066380d62c230dc9fd74c632085e0d991794746..5b51c012d006fa54af8f424e32c26f75068e3032 100644 |
--- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
+++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
@@ -8,7 +8,11 @@ import android.content.BroadcastReceiver; |
import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
+import android.content.pm.PackageManager; |
+import android.media.AudioFormat; |
import android.media.AudioManager; |
+import android.media.AudioRecord; |
+import android.media.AudioTrack; |
import android.os.Build; |
import android.util.Log; |
@@ -18,6 +22,10 @@ import org.chromium.base.JNINamespace; |
@JNINamespace("media") |
class AudioManagerAndroid { |
private static final String TAG = AudioManagerAndroid.class.getSimpleName(); |
+ // Most of Google lead devices use 44.1K as the default sampling rate, 44.1K |
+ // is also widely used on other android devices. |
+ private static final int DEFAULT_SAMPLING_RATE = 44100; |
+ private static final int DEFAULT_FRAME_PER_BUFFER = 256; |
private final AudioManager mAudioManager; |
private final Context mContext; |
@@ -83,4 +91,57 @@ class AudioManagerAndroid { |
" Board: " + Build.BOARD + " Device: " + Build.DEVICE + |
" Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); |
} |
+ |
+ @CalledByNative |
+ private int getNativeOutputSampleRate() { |
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { |
+ String sampleRateString = mAudioManager.getProperty( |
+ AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); |
+ return (sampleRateString == null ? |
+ DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); |
+ } else { |
+ return DEFAULT_SAMPLING_RATE; |
+ } |
+ } |
+ |
+ @CalledByNative |
+ private static int getMinInputBufSize(int sampleRate, int channels) { |
+ int channelConfig; |
+ if (channels == 1) |
+ channelConfig = AudioFormat.CHANNEL_IN_MONO; |
+ else if (channels == 2) |
+ channelConfig = AudioFormat.CHANNEL_IN_STEREO; |
+ else |
+ return -1; |
+ return AudioRecord.getMinBufferSize(sampleRate, channelConfig, |
+ AudioFormat.ENCODING_PCM_16BIT); |
+ } |
+ |
+ @CalledByNative |
+ private static int getMinOutputBufSize(int sampleRate, int channels) { |
+ int channelConfig; |
+ if (channels == 1) |
+ channelConfig = AudioFormat.CHANNEL_OUT_MONO; |
+ else if (channels == 2) |
+ channelConfig = AudioFormat.CHANNEL_OUT_STEREO; |
+ else |
+ return -1; |
+ return AudioTrack.getMinBufferSize(sampleRate, channelConfig, |
+ AudioFormat.ENCODING_PCM_16BIT); |
+ } |
+ |
+ @CalledByNative |
+ private boolean isAudioLowLatencySupported() { |
+ return mContext.getPackageManager().hasSystemFeature( |
+ PackageManager.FEATURE_AUDIO_LOW_LATENCY); |
+ } |
+ |
+ @CalledByNative |
+ private int getAudioLowLatencyFrameSize() { |
+ String framesPerBuffer = |
+ mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); |
+ return (framesPerBuffer == null ? |
+ DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
+ } |
+ |
} |