OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/audio/audio_io.h" | 5 #include "media/audio/audio_io.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <objbase.h> // This has to be before initguid.h | 8 #include <objbase.h> // This has to be before initguid.h |
9 #include <initguid.h> | 9 #include <initguid.h> |
10 #include <mmsystem.h> | 10 #include <mmsystem.h> |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 358 |
359 std::string AudioManagerWin::GetDefaultOutputDeviceID() { | 359 std::string AudioManagerWin::GetDefaultOutputDeviceID() { |
360 if (!CoreAudioUtil::IsSupported()) | 360 if (!CoreAudioUtil::IsSupported()) |
361 return std::string(); | 361 return std::string(); |
362 return CoreAudioUtil::GetDefaultOutputDeviceID(); | 362 return CoreAudioUtil::GetDefaultOutputDeviceID(); |
363 } | 363 } |
364 | 364 |
365 AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters( | 365 AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters( |
366 const std::string& output_device_id, | 366 const std::string& output_device_id, |
367 const AudioParameters& input_params) { | 367 const AudioParameters& input_params) { |
368 // TODO(tommi): Support |output_device_id|. | |
369 DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!"; | |
370 | |
371 const bool core_audio_supported = CoreAudioUtil::IsSupported(); | 368 const bool core_audio_supported = CoreAudioUtil::IsSupported(); |
372 DLOG_IF(ERROR, !core_audio_supported && !output_device_id.empty()) | 369 DLOG_IF(ERROR, !core_audio_supported && !output_device_id.empty()) |
373 << "CoreAudio is required to open non-default devices."; | 370 << "CoreAudio is required to open non-default devices."; |
374 | 371 |
375 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 372 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
376 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; | 373 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; |
377 int sample_rate = 48000; | 374 int sample_rate = 48000; |
378 int buffer_size = kFallbackBufferSize; | 375 int buffer_size = kFallbackBufferSize; |
379 int bits_per_sample = 16; | 376 int bits_per_sample = 16; |
380 int input_channels = 0; | 377 int input_channels = 0; |
381 bool use_input_params = !core_audio_supported; | 378 bool use_input_params = !core_audio_supported; |
382 if (core_audio_supported) { | 379 if (core_audio_supported) { |
383 if (cmd_line->HasSwitch(switches::kEnableExclusiveAudio)) { | 380 if (cmd_line->HasSwitch(switches::kEnableExclusiveAudio)) { |
384 // TODO(rtoy): tune these values for best possible WebAudio | 381 // TODO(rtoy): tune these values for best possible WebAudio |
385 // performance. WebRTC works well at 48kHz and a buffer size of 480 | 382 // performance. WebRTC works well at 48kHz and a buffer size of 480 |
386 // samples will be used for this case. Note that exclusive mode is | 383 // samples will be used for this case. Note that exclusive mode is |
387 // experimental. This sample rate will be combined with a buffer size of | 384 // experimental. This sample rate will be combined with a buffer size of |
388 // 256 samples, which corresponds to an output delay of ~5.33ms. | 385 // 256 samples, which corresponds to an output delay of ~5.33ms. |
389 sample_rate = 48000; | 386 sample_rate = 48000; |
390 buffer_size = 256; | 387 buffer_size = 256; |
391 if (input_params.IsValid()) | 388 if (input_params.IsValid()) |
392 channel_layout = input_params.channel_layout(); | 389 channel_layout = input_params.channel_layout(); |
393 } else { | 390 } else { |
394 AudioParameters params; | 391 AudioParameters params; |
395 HRESULT hr = CoreAudioUtil::GetPreferredAudioParameters(output_device_id, | 392 HRESULT hr = CoreAudioUtil::GetPreferredAudioParameters( |
396 ¶ms); | 393 output_device_id.empty() ? |
| 394 GetDefaultOutputDeviceID() : output_device_id, |
| 395 ¶ms); |
397 if (SUCCEEDED(hr)) { | 396 if (SUCCEEDED(hr)) { |
398 bits_per_sample = params.bits_per_sample(); | 397 bits_per_sample = params.bits_per_sample(); |
399 buffer_size = params.frames_per_buffer(); | 398 buffer_size = params.frames_per_buffer(); |
400 channel_layout = params.channel_layout(); | 399 channel_layout = params.channel_layout(); |
401 sample_rate = params.sample_rate(); | 400 sample_rate = params.sample_rate(); |
402 } else { | 401 } else { |
403 use_input_params = true; | 402 use_input_params = true; |
404 } | 403 } |
405 } | 404 } |
406 } | 405 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 return new PCMWaveInAudioInputStream(this, params, kNumInputBuffers, | 468 return new PCMWaveInAudioInputStream(this, params, kNumInputBuffers, |
470 xp_device_id); | 469 xp_device_id); |
471 } | 470 } |
472 | 471 |
473 /// static | 472 /// static |
474 AudioManager* CreateAudioManager() { | 473 AudioManager* CreateAudioManager() { |
475 return new AudioManagerWin(); | 474 return new AudioManagerWin(); |
476 } | 475 } |
477 | 476 |
478 } // namespace media | 477 } // namespace media |
OLD | NEW |