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 |