Index: media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
=================================================================== |
--- media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java (revision 201553) |
+++ media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java (working copy) |
@@ -8,7 +8,11 @@ |
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,9 +22,14 @@ |
@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; |
+ // Randomly picked up frame size which is close to return value on N4. |
+ // Return this default value when |
+ // getProperty(PROPERTY_OUTPUT_FRAMES_PER_BUFFER) fails. |
+ private static final int DEFAULT_FRAME_PER_BUFFER = 256; |
private final AudioManager mAudioManager; |
private final Context mContext; |
@@ -81,8 +90,14 @@ |
mAudioManager.setSpeakerphoneOn(mOriginalSpeakerStatus); |
} |
+ private void logDeviceInfo() { |
+ Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + |
+ " Board: " + Build.BOARD + " Device: " + Build.DEVICE + |
+ " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); |
+ } |
+ |
@CalledByNative |
- public int getNativeOutputSampleRate() { |
+ 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); |
@@ -93,9 +108,58 @@ |
} |
} |
- private void logDeviceInfo() { |
- Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + |
- " Board: " + Build.BOARD + " Device: " + Build.DEVICE + |
- " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); |
+ /** |
+ * Returns the minimum frame size required for audio input. |
+ * |
+ * @param sampleRate sampling rate |
+ * @param channels number of channels |
+ */ |
+ @CalledByNative |
+ private static int getMinInputFrameSize(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) / 2 / channels; |
} |
+ |
+ /** |
+ * Returns the minimum frame size required for audio output. |
+ * |
+ * @param sampleRate sampling rate |
+ * @param channels number of channels |
+ */ |
+ @CalledByNative |
+ private static int getMinOutputFrameSize(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) / 2 / channels; |
+ } |
+ |
+ @CalledByNative |
+ private boolean isAudioLowLatencySupported() { |
+ return mContext.getPackageManager().hasSystemFeature( |
+ PackageManager.FEATURE_AUDIO_LOW_LATENCY); |
+ } |
+ |
+ @CalledByNative |
+ private int getAudioLowLatencyOutputFrameSize() { |
+ String framesPerBuffer = |
+ mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); |
+ return (framesPerBuffer == null ? |
+ DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
+ } |
+ |
} |