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

Side by Side Diff: media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java

Issue 15217002: Using native sampling rate and optimal buffer size for audio on Android. (Closed) Base URL: https://src.chromium.org/svn/trunk/src/
Patch Set: rebase Created 7 years, 7 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 unified diff | Download patch
« no previous file with comments | « media/audio/android/audio_manager_android.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.media; 5 package org.chromium.media;
6 6
7 import android.content.BroadcastReceiver; 7 import android.content.BroadcastReceiver;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.Intent; 9 import android.content.Intent;
10 import android.content.IntentFilter; 10 import android.content.IntentFilter;
11 import android.content.pm.PackageManager;
12 import android.media.AudioFormat;
11 import android.media.AudioManager; 13 import android.media.AudioManager;
14 import android.media.AudioRecord;
15 import android.media.AudioTrack;
12 import android.os.Build; 16 import android.os.Build;
13 import android.util.Log; 17 import android.util.Log;
14 18
15 import org.chromium.base.CalledByNative; 19 import org.chromium.base.CalledByNative;
16 import org.chromium.base.JNINamespace; 20 import org.chromium.base.JNINamespace;
17 21
18 @JNINamespace("media") 22 @JNINamespace("media")
19 class AudioManagerAndroid { 23 class AudioManagerAndroid {
20 private static final String TAG = AudioManagerAndroid.class.getSimpleName(); 24 private static final String TAG = AudioManagerAndroid.class.getSimpleName();
25
21 // Most of Google lead devices use 44.1K as the default sampling rate, 44.1K 26 // Most of Google lead devices use 44.1K as the default sampling rate, 44.1K
22 // is also widely used on other android devices. 27 // is also widely used on other android devices.
23 private static final int DEFAULT_SAMPLING_RATE = 44100; 28 private static final int DEFAULT_SAMPLING_RATE = 44100;
29 // Randomly picked up frame size which is close to return value on N4.
30 // Return this default value when
31 // getProperty(PROPERTY_OUTPUT_FRAMES_PER_BUFFER) fails.
32 private static final int DEFAULT_FRAME_PER_BUFFER = 256;
24 33
25 private final AudioManager mAudioManager; 34 private final AudioManager mAudioManager;
26 private final Context mContext; 35 private final Context mContext;
27 36
28 private BroadcastReceiver mReceiver; 37 private BroadcastReceiver mReceiver;
29 private boolean mOriginalSpeakerStatus; 38 private boolean mOriginalSpeakerStatus;
30 39
31 @CalledByNative 40 @CalledByNative
32 public void setMode(int mode) { 41 public void setMode(int mode) {
33 try { 42 try {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 mContext.registerReceiver(mReceiver, filter); 83 mContext.registerReceiver(mReceiver, filter);
75 } 84 }
76 85
77 @CalledByNative 86 @CalledByNative
78 public void unregisterHeadsetReceiver() { 87 public void unregisterHeadsetReceiver() {
79 mContext.unregisterReceiver(mReceiver); 88 mContext.unregisterReceiver(mReceiver);
80 mReceiver = null; 89 mReceiver = null;
81 mAudioManager.setSpeakerphoneOn(mOriginalSpeakerStatus); 90 mAudioManager.setSpeakerphoneOn(mOriginalSpeakerStatus);
82 } 91 }
83 92
93 private void logDeviceInfo() {
94 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER +
95 " Board: " + Build.BOARD + " Device: " + Build.DEVICE +
qinmin 2013/05/23 16:27:39 nit: fix the indentation
leozwang1 2013/05/23 21:13:46 Done.
96 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT);
97 }
98
84 @CalledByNative 99 @CalledByNative
85 public int getNativeOutputSampleRate() { 100 private int getNativeOutputSampleRate() {
86 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.J ELLY_BEAN_MR1) { 101 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.J ELLY_BEAN_MR1) {
87 String sampleRateString = mAudioManager.getProperty( 102 String sampleRateString = mAudioManager.getProperty(
88 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); 103 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
89 return (sampleRateString == null ? 104 return (sampleRateString == null ?
90 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); 105 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString));
91 } else { 106 } else {
92 return DEFAULT_SAMPLING_RATE; 107 return DEFAULT_SAMPLING_RATE;
93 } 108 }
94 } 109 }
95 110
96 private void logDeviceInfo() { 111 @CalledByNative
97 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + 112 private static int getMinInputBufSize(int sampleRate, int channels) {
no longer working on chromium 2013/05/22 21:00:00 I am wondering if you really need the |channels| t
leozwang1 2013/05/22 21:03:41 java api takes number of channel as the input para
no longer working on chromium 2013/05/22 21:21:37 I know, but please note that you divide the return
leozwang1 2013/05/22 21:27:42 which converts size in bytes to frames. I think I
no longer working on chromium 2013/05/22 21:41:53 Right, that is exactly what I am trying to say, we
98 " Board: " + Build.BOARD + " Device: " + Build.DEVICE + 113 int channelConfig;
99 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); 114 if (channels == 1) {
115 channelConfig = AudioFormat.CHANNEL_IN_MONO;
116 } else if (channels == 2) {
117 channelConfig = AudioFormat.CHANNEL_IN_STEREO;
118 } else {
119 return -1;
120 }
121 return AudioRecord.getMinBufferSize(sampleRate, channelConfig,
122 AudioFormat.ENCODING_PCM_16BIT);
100 } 123 }
124
125 @CalledByNative
126 private static int getMinOutputBufSize(int sampleRate, int channels) {
no longer working on chromium 2013/05/22 21:00:00 the same here, could you please verify it?
127 int channelConfig;
128 if (channels == 1) {
129 channelConfig = AudioFormat.CHANNEL_OUT_MONO;
130 } else if (channels == 2) {
131 channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
132 } else {
133 return -1;
134 }
135 return AudioTrack.getMinBufferSize(sampleRate, channelConfig,
136 AudioFormat.ENCODING_PCM_16BIT);
137 }
138
139 @CalledByNative
140 private boolean isAudioLowLatencySupported() {
141 return mContext.getPackageManager().hasSystemFeature(
142 PackageManager.FEATURE_AUDIO_LOW_LATENCY);
143 }
144
145 @CalledByNative
146 private int getAudioLowLatencyFrameSize() {
147 String framesPerBuffer =
148 mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PE R_BUFFER);
149 return (framesPerBuffer == null ?
150 DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer));
151 }
152
101 } 153 }
OLDNEW
« no previous file with comments | « media/audio/android/audio_manager_android.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698