| Index: media/audio/mac/audio_manager_mac.cc
|
| diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc
|
| index 970720679abf418b9cd2ef11f49d017d75c60084..71af5e654966b788649cf6aaa8e88c0d2cd4e6c2 100644
|
| --- a/media/audio/mac/audio_manager_mac.cc
|
| +++ b/media/audio/mac/audio_manager_mac.cc
|
| @@ -432,8 +432,9 @@ void AudioManagerMac::GetAudioOutputDeviceNames(
|
| GetAudioDeviceInfo(false, device_names);
|
| }
|
|
|
| -AudioParameters AudioManagerMac::GetInputStreamParameters(
|
| - const std::string& device_id) {
|
| +AudioParameters AudioManagerMac::GetPreferredInputStreamParameters(
|
| + const std::string& input_device_id,
|
| + const AudioParameters& input_params) {
|
| AudioDeviceID device = GetAudioDeviceIdByUId(true, device_id);
|
| if (device == kAudioObjectUnknown) {
|
| DLOG(ERROR) << "Invalid device " << device_id;
|
| @@ -442,29 +443,41 @@ AudioParameters AudioManagerMac::GetInputStreamParameters(
|
| kFallbackSampleRate, 16, ChooseBufferSize(kFallbackSampleRate));
|
| }
|
|
|
| + const bool has_valid_input_params = input_params.IsValid();
|
| +
|
| int channels = 0;
|
| - ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
|
| + ChannelLayout channel_layout = has_valid_input_params ?
|
| + input_params.channel_layout() : CHANNEL_LAYOUT_STEREO;
|
| if (GetDeviceChannels(device, kAudioDevicePropertyScopeInput, &channels) &&
|
| channels <= 2) {
|
| + // Use the native channel layout of the device.
|
| channel_layout = GuessChannelLayout(channels);
|
| } else {
|
| DLOG(ERROR) << "Failed to get the device channels, use stereo as default "
|
| << "for device " << device_id;
|
| }
|
|
|
| + // Use the native sample rate of the device if it can.
|
| int sample_rate = HardwareSampleRateForDevice(device);
|
| - if (!sample_rate)
|
| - sample_rate = kFallbackSampleRate;
|
| + if (!sample_rate) {
|
| + sample_rate = has_valid_input_params ?
|
| + input_params.sample_rate() : kFallbackSampleRate;
|
| + }
|
| +
|
| + int buffer_size = ChooseBufferSize(sample_rate);
|
| +
|
| + if (has_valid_input_params) {
|
| + buffer_size =
|
| + std::min(kMaximumInputOutputBufferSize,
|
| + std::max(input_params.frames_per_buffer(), buffer_size));
|
| + }
|
|
|
| - // Due to the sharing of the input and output buffer sizes, we need to choose
|
| - // the input buffer size based on the output sample rate. See
|
| - // http://crbug.com/154352.
|
| - const int buffer_size = ChooseBufferSize(sample_rate);
|
| + const int bits_per_sample = has_valid_input_params ?
|
| + input_params.bits_per_sample() : 16;
|
|
|
| - // TODO(xians): query the native channel layout for the specific device.
|
| return AudioParameters(
|
| AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
|
| - sample_rate, 16, buffer_size);
|
| + sample_rate, bits_per_sample, buffer_size);
|
| }
|
|
|
| std::string AudioManagerMac::GetAssociatedOutputDeviceID(
|
|
|