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 bd809b8c6cd2195cbc12e7fecaed8355444a41cb..7bfc638a615f6d9f898c2bcc3b78ebb8d7576c42 100644 |
--- a/media/audio/win/audio_manager_win.cc |
+++ b/media/audio/win/audio_manager_win.cc |
@@ -20,6 +20,7 @@ |
#include "base/process_util.h" |
#include "base/string_number_conversions.h" |
#include "base/string_util.h" |
+#include "media/audio/audio_parameters.h" |
#include "media/audio/audio_util.h" |
#include "media/audio/win/audio_device_listener_win.h" |
#include "media/audio/win/audio_low_latency_input_win.h" |
@@ -31,6 +32,7 @@ |
#include "media/audio/win/wavein_input_win.h" |
#include "media/audio/win/waveout_output_win.h" |
#include "media/base/bind_to_loop.h" |
+#include "media/base/channel_layout.h" |
#include "media/base/limits.h" |
#include "media/base/media_switches.h" |
@@ -61,6 +63,10 @@ static const int kWinMaxChannels = 8; |
// play. |
static const int kNumInputBuffers = 3; |
+// Buffer size to use for input and output stream when a proper size can't be |
+// determined from the system |
+static const int kFallbackBufferSize = 2048; |
+ |
static int GetVersionPartAsInt(DWORDLONG num) { |
return static_cast<int>(num & 0xffff); |
} |
@@ -255,6 +261,26 @@ void AudioManagerWin::GetAudioInputDeviceNames( |
} |
} |
+AudioParameters AudioManagerWin::GetInputStreamParameters( |
+ const std::string& device_id) { |
+ int sample_rate = 0; |
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_NONE; |
+ if (!CoreAudioUtil::IsSupported()) { |
+ sample_rate = 48000; |
+ channel_layout = CHANNEL_LAYOUT_STEREO; |
+ } else { |
+ sample_rate = WASAPIAudioInputStream::HardwareSampleRate(device_id); |
+ channel_layout = |
+ WASAPIAudioInputStream::HardwareChannelCount(device_id) == 1 ? |
+ CHANNEL_LAYOUT_MONO : CHANNEL_LAYOUT_STEREO; |
+ } |
+ |
+ // TODO(Henrika): improve the default buffer size value for input stream. |
+ return AudioParameters( |
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, |
+ sample_rate, 16, kFallbackBufferSize); |
+} |
+ |
// Factory for the implementations of AudioOutputStream for AUDIO_PCM_LINEAR |
// mode. |
// - PCMWaveOutAudioOutputStream: Based on the waveOut API. |
@@ -329,6 +355,60 @@ AudioInputStream* AudioManagerWin::MakeLowLatencyInputStream( |
return stream; |
} |
+AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters( |
+ const AudioParameters& input_params) { |
+ const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
+ int sample_rate = 0; |
+ int buffer_size = 0; |
+ int bits_per_sample = 16; |
+ int input_channels = 0; |
+ if (!CoreAudioUtil::IsSupported()) { |
+ // Fall back to Windows Wave implementation on Windows XP or lower. |
+ // Use 48kHz as default input sample rate, kFallbackBufferSize as |
+ // default buffer size. |
+ sample_rate = 48000; |
+ buffer_size = kFallbackBufferSize; |
+ } else if (cmd_line->HasSwitch(switches::kEnableExclusiveAudio)) { |
+ // TODO(crogers): tune these values for best possible WebAudio performance. |
+ // WebRTC works well at 48kHz and a buffer size of 480 samples will be used |
+ // for this case. Note that exclusive mode is experimental. |
+ // This sample rate will be combined with a buffer size of 256 samples, |
+ // which corresponds to an output delay of ~5.33ms. |
+ sample_rate = 48000; |
+ buffer_size = 256; |
+ } else { |
+ // Hardware sample-rate on Windows can be configured, so we must query. |
+ // TODO(henrika): improve possibility to specify an audio endpoint. |
+ // Use the default device (same as for Wave) for now to be compatible. |
+ sample_rate = WASAPIAudioOutputStream::HardwareSampleRate(); |
+ |
+ AudioParameters params; |
+ HRESULT hr = CoreAudioUtil::GetPreferredAudioParameters(eRender, eConsole, |
+ ¶ms); |
+ buffer_size = FAILED(hr) ? kFallbackBufferSize : params.frames_per_buffer(); |
+ channel_layout = WASAPIAudioOutputStream::HardwareChannelLayout(); |
+ } |
+ |
+ if (input_params.IsValid()) { |
+ input_channels = input_params.input_channels(); |
+ if (!CoreAudioUtil::IsSupported()) { |
+ // If WASAPI isn't supported we'll fallback to WaveOut, which will take |
+ // care of resampling and bits per sample changes. By setting these |
+ // equal to the input values, AudioOutputResampler will skip resampling |
+ // and bit per sample differences (since the input parameters will match |
+ // the output parameters). |
+ sample_rate = input_params.sample_rate(); |
+ bits_per_sample = input_params.bits_per_sample(); |
+ channel_layout = input_params.channel_layout(); |
+ } |
+ } |
+ |
+ return AudioParameters( |
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, |
+ sample_rate, bits_per_sample, buffer_size); |
+} |
+ |
AudioInputStream* AudioManagerWin::CreatePCMWaveInAudioInputStream( |
const AudioParameters& params, |
const std::string& device_id) { |
@@ -352,26 +432,4 @@ AudioManager* CreateAudioManager() { |
return new AudioManagerWin(); |
} |
-AudioParameters AudioManagerWin::GetPreferredLowLatencyOutputStreamParameters( |
- const AudioParameters& input_params) { |
- // If WASAPI isn't supported we'll fallback to WaveOut, which will take care |
- // of resampling and bits per sample changes. By setting these equal to the |
- // input values, AudioOutputResampler will skip resampling and bit per sample |
- // differences (since the input parameters will match the output parameters). |
- int sample_rate = input_params.sample_rate(); |
- int bits_per_sample = input_params.bits_per_sample(); |
- ChannelLayout channel_layout = input_params.channel_layout(); |
- int input_channels = input_params.input_channels(); |
- if (CoreAudioUtil::IsSupported()) { |
- sample_rate = GetAudioHardwareSampleRate(); |
- bits_per_sample = 16; |
- channel_layout = WASAPIAudioOutputStream::HardwareChannelLayout(); |
- } |
- |
- // TODO(dalecurtis): This should include hardware bits per channel eventually. |
- return AudioParameters( |
- AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, |
- sample_rate, bits_per_sample, GetAudioHardwareBufferSize()); |
-} |
- |
} // namespace media |