Index: media/audio/win/audio_manager_win.cc |
diff --git a/media/audio/win/audio_manager_win.cc b/media/audio/win/audio_manager_win.cc |
index eb05ca0547b19095cf97348ea5b78a443f324c20..1c183f7a12ca99611e006142d6688e952e7e5e28 100644 |
--- a/media/audio/win/audio_manager_win.cc |
+++ b/media/audio/win/audio_manager_win.cc |
@@ -299,27 +299,50 @@ void AudioManagerWin::GetAudioOutputDeviceNames( |
GetAudioDeviceNamesImpl(false, device_names); |
} |
-AudioParameters AudioManagerWin::GetInputStreamParameters( |
- const std::string& device_id) { |
- AudioParameters parameters; |
- if (!core_audio_supported()) { |
- // Windows Wave implementation is being used. |
- parameters = AudioParameters( |
- AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, 0, 48000, |
- 16, kFallbackBufferSize, AudioParameters::NO_EFFECTS); |
- } else { |
- parameters = WASAPIAudioInputStream::GetInputStreamParameters(device_id); |
+AudioParameters AudioManagerWin::GetPreferredInputStreamParameters( |
+ const std::string& input_device_id, |
+ const AudioParameters& input_params) { |
+ // Default format used by the wave implementation. |
+ AudioParameters::Format format = AUDIO_PCM_LINEAR; |
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
+ int buffer_size = kFallbackBufferSize; |
+ int bits_per_sample = 16; |
+ int input_channels = 0; |
+ int sample_rate = 48000; |
+ int effects = AudioParameters::NO_EFFECTS; |
+ |
+ if (core_audio_supported()) { |
+ // When core audio is being used, we need to respect the native format |
+ // of the device. |
+ AudioParameters parameters = |
+ WASAPIAudioInputStream::GetInputStreamParameters(device_id); |
+ format = parameters.format(); |
+ channel_layout = parameters.channel_layout(); |
+ bits_per_sample = parameters.bits_per_sample(); |
+ input_channels = parameters.input_channels(); |
+ sample_rate = parameters.sample_rate(); |
+ effects |= parameters.effects(); |
} |
- int user_buffer_size = GetUserBufferSize(); |
- if (user_buffer_size) { |
- parameters.Reset(parameters.format(), parameters.channel_layout(), |
- parameters.channels(), parameters.input_channels(), |
- parameters.sample_rate(), parameters.bits_per_sample(), |
- user_buffer_size); |
+ if (input_params.IsValid()) { |
+ input_channels = input_params.input_channels(); |
+ effects |= input_params.effects(); |
+ bits_per_sample = input_params.bits_per_sample(); |
+ buffer_size = input_params.frames_per_buffer(); |
+ channel_layout = input_params.channel_layout(); |
+ |
+ // When core audio is being used, we must use the device's native sample |
+ // rate. |
+ if (!core_audio_supported()) |
+ sample_rate = input_params.sample_rate(); |
} |
- return parameters; |
+ int user_buffer_size = GetUserBufferSize(); |
+ if (user_buffer_size) |
+ buffer_size = user_buffer_size; |
+ |
+ return AudioParameters(format, channel_layout, input_channels, |
+ sample_rate, bits_per_sample, buffer_size, effects); |
} |
std::string AudioManagerWin::GetAssociatedOutputDeviceID( |