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

Unified Diff: media/audio/win/audio_manager_win.cc

Issue 12316131: Moved AudioUtil static functions to AudioManager interfaces (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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/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..fe485f69ebe6719ef1723d715c6cf8ff08ad3af3 100644
--- a/media/audio/win/audio_manager_win.cc
+++ b/media/audio/win/audio_manager_win.cc
@@ -20,7 +20,7 @@
#include "base/process_util.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
-#include "media/audio/audio_util.h"
+#include "media/audio/audio_parameters.h"
#include "media/audio/win/audio_device_listener_win.h"
#include "media/audio/win/audio_low_latency_input_win.h"
#include "media/audio/win/audio_low_latency_output_win.h"
@@ -31,6 +31,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"
@@ -47,6 +48,9 @@ DEFINE_GUID(AM_KSCATEGORY_AUDIO, 0x6994ad04, 0x93ef, 0x11d0,
namespace media {
+using WASAPIAudioInputStream::HardwareChannelCount;
DaleCurtis 2013/02/27 02:46:11 I think this makes things a little confusing since
no longer working on chromium 2013/03/01 16:44:33 true, done now. Thanks for pointing out.
+using WASAPIAudioInputStream::HardwareSampleRate;
+
// Maximum number of output streams that can be open simultaneously.
static const int kMaxOutputStreams = 50;
@@ -61,6 +65,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 +263,62 @@ void AudioManagerWin::GetAudioInputDeviceNames(
}
}
+AudioParameters AudioManagerWin::GetDefaultOutputStreamParameters() {
+ const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
+ int sample_rate = 0;
+ int buffer_size = 0;
+ if (!CoreAudioUtil::IsSupported()) {
+ // Fall back to Windows Wave implementation on Windows XP or lower
+ // and 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 = HardwareSampleRate();
+
+ AudioParameters params;
+ HRESULT hr = CoreAudioUtil::GetPreferredAudioParameters(eRender, eConsole,
+ &params);
+ buffer_size = FAILED(hr) ? kFallbackBufferSize : params.frames_per_buffer();
+ channel_layout = WASAPIAudioOutputStream::HardwareChannelLayout();
+ }
+
+ return AudioParameters(
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
+ sample_rate, 16, buffer_size);
+}
+
+AudioParameters AudioManagerWin::GetDefaultInputStreamParameters(
+ 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 = HardwareSampleRate(device_id);
+ channel_layout = 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.
@@ -362,16 +426,19 @@ AudioParameters AudioManagerWin::GetPreferredLowLatencyOutputStreamParameters(
int bits_per_sample = input_params.bits_per_sample();
ChannelLayout channel_layout = input_params.channel_layout();
int input_channels = input_params.input_channels();
+ int buffer_size = input_params.frames_per_buffer();
if (CoreAudioUtil::IsSupported()) {
- sample_rate = GetAudioHardwareSampleRate();
- bits_per_sample = 16;
- channel_layout = WASAPIAudioOutputStream::HardwareChannelLayout();
+ AudioParameters default_params = GetDefaultOutputStreamParameters();
+ sample_rate = default_params.sample_rate();
+ bits_per_sample = default_params.bits_per_sample();
+ channel_layout = default_params.channel_layout();
+ buffer_size = default_params.frames_per_buffer();
}
// 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());
+ sample_rate, bits_per_sample, buffer_size);
}
} // namespace media
« media/audio/cras/audio_manager_cras.h ('K') | « media/audio/win/audio_manager_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698