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

Unified Diff: media/audio/android/audio_manager_android.cc

Issue 14430003: Using native sampling rate and optimal buffer size for audio on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 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: media/audio/android/audio_manager_android.cc
diff --git a/media/audio/android/audio_manager_android.cc b/media/audio/android/audio_manager_android.cc
index ec43db4187b9c7f54641fb0e5acb6c5a689fbd0f..0242205d1b2c83c7f3943284b1323d8e69cbface 100644
--- a/media/audio/android/audio_manager_android.cc
+++ b/media/audio/android/audio_manager_android.cc
@@ -56,14 +56,11 @@ void AudioManagerAndroid::GetAudioInputDeviceNames(
AudioParameters AudioManagerAndroid::GetInputStreamParameters(
const std::string& device_id) {
- // TODO(xians): figure out the right input sample rate and buffer size to
- // achieve the best audio performance for Android devices.
- // TODO(xians): query the native channel layout for the specific device.
- static const int kDefaultSampleRate = 16000;
static const int kDefaultBufferSize = 1024;
+ int size = GetMinInputBufferSize(GetNativeOutputSampleRate(), 2);
return AudioParameters(
AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
- kDefaultSampleRate, 16, kDefaultBufferSize);
+ GetNativeOutputSampleRate(), 16, size <= 0 ? kDefaultBufferSize : size);
}
AudioOutputStream* AudioManagerAndroid::MakeAudioOutputStream(
@@ -120,16 +117,17 @@ AudioInputStream* AudioManagerAndroid::MakeLowLatencyInputStream(
return new OpenSLESInputStream(this, params);
}
+int AudioManagerAndroid::GetAudioOptimalOutputFrameSize(int sample_rate) {
+ return IsAudioLowLatencySupported() ? GetAudioLowLatencyFrameSize() * 4 :
+ GetMinOutputBufferSize(sample_rate, 1) / 2;
+}
+
AudioParameters AudioManagerAndroid::GetPreferredOutputStreamParameters(
const AudioParameters& input_params) {
- // TODO(xians): figure out the right output sample rate and buffer size to
- // achieve the best audio performance for Android devices.
- static const int kDefaultSampleRate = 44100;
static const int kDefaultBufferSize = 2048;
-
ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
- int sample_rate = kDefaultSampleRate;
- int buffer_size = kDefaultBufferSize;
+ int sample_rate = GetNativeOutputSampleRate();
+ int buffer_size = GetAudioOptimalOutputFrameSize(sample_rate);
int bits_per_sample = 16;
int input_channels = 0;
if (input_params.IsValid()) {
@@ -138,12 +136,7 @@ AudioParameters AudioManagerAndroid::GetPreferredOutputStreamParameters(
bits_per_sample = input_params.bits_per_sample();
channel_layout = input_params.channel_layout();
input_channels = input_params.input_channels();
-
- // TODO(leozwang): Android defines the minimal buffer size requirment
- // we should follow it. From Android 4.1, a new audio low latency api
- // set was introduced and is under development, we want to take advantage
- // of it.
- buffer_size = std::min(buffer_size, input_params.frames_per_buffer());
+ buffer_size = buffer_size <= 0 ? kDefaultBufferSize : buffer_size;
}
int user_buffer_size = GetUserBufferSize();
@@ -178,4 +171,34 @@ void AudioManagerAndroid::UnregisterHeadsetReceiver() {
j_audio_manager_.obj());
}
+int AudioManagerAndroid::GetNativeOutputSampleRate() {
+ return Java_AudioManagerAndroid_getNativeOutputSampleRate(
+ base::android::AttachCurrentThread(),
+ j_audio_manager_.obj());
+}
+
+int AudioManagerAndroid::GetMinInputBufferSize(int rate, int channels) {
+ return Java_AudioManagerAndroid_getMinInputBufSize(
+ base::android::AttachCurrentThread(),
+ rate, channels);
+}
+
+int AudioManagerAndroid::GetMinOutputBufferSize(int rate, int channels) {
+ return Java_AudioManagerAndroid_getMinOutputBufSize(
+ base::android::AttachCurrentThread(),
+ rate, channels);
+}
+
+bool AudioManagerAndroid::IsAudioLowLatencySupported() {
+ return Java_AudioManagerAndroid_isAudioLowLatencySupported(
+ base::android::AttachCurrentThread(),
+ j_audio_manager_.obj());
+}
+
+int AudioManagerAndroid::GetAudioLowLatencyFrameSize() {
+ return Java_AudioManagerAndroid_getAudioLowLatencyFrameSize(
+ base::android::AttachCurrentThread(),
+ j_audio_manager_.obj());
+}
+
} // namespace media
« no previous file with comments | « media/audio/android/audio_manager_android.h ('k') | media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698