Index: media/audio/mac/audio_manager_mac.cc |
=================================================================== |
--- media/audio/mac/audio_manager_mac.cc (revision 191870) |
+++ media/audio/mac/audio_manager_mac.cc (working copy) |
@@ -426,24 +426,53 @@ |
AudioOutputStream* AudioManagerMac::MakeLowLatencyOutputStream( |
const AudioParameters& params) { |
+ // Handle basic output with no input channels. |
+ if (params.input_channels() == 0) { |
+ AudioDeviceID device = kAudioObjectUnknown; |
+ GetDefaultOutputDevice(&device); |
+ return new AUHALStream(this, params, device); |
+ } |
+ |
// TODO(crogers): support more than stereo input. |
- if (params.input_channels() == 2) { |
- if (HasUnifiedDefaultIO()) |
- return new AudioHardwareUnifiedStream(this, params); |
+ if (params.input_channels() != 2) { |
+ // WebAudio is currently hard-coded to 2 channels so we should not |
+ // see this case. |
+ NOTREACHED() << "Only stereo input is currently supported!"; |
+ return NULL; |
+ } |
- // TODO(crogers): use aggregate devices along with AUHALStream |
- // to get better performance for built-in hardware. |
- |
- // kAudioDeviceUnknown translates to "use default" here. |
- return new AudioSynchronizedStream(this, |
- params, |
- kAudioDeviceUnknown, |
- kAudioDeviceUnknown); |
+ AudioDeviceID device = kAudioObjectUnknown; |
+ if (HasUnifiedDefaultIO()) { |
+ // For I/O, the simplest case is when the default input and output |
+ // devices are the same. |
+ GetDefaultOutputDevice(&device); |
+ LOG(INFO) << "UNIFIED: default input and output devices are identical"; |
no longer working on chromium
2013/04/17 09:16:22
just a thought, do you want to use uma to record t
Chris Rogers
2013/04/17 20:42:31
Not a bad idea - for now added TODO
|
+ } else { |
+ // Some audio hardware is presented as separate input and output devices |
+ // even though they are really the same physical hardware and |
+ // share the same "clock domain" at the lowest levels of the driver. |
+ // A common of example of this is the "built-in" audio hardware: |
+ // "Built-in Line Input" |
+ // "Built-in Output" |
+ // We would like to use an "aggregate" device for these situations, since |
+ // CoreAudio will make the most efficient use of the shared "clock domain" |
+ // so we get the lowest latency and use fewer threads. |
+ device = aggregate_device_manager_.GetDefaultAggregateDevice(); |
+ if (device != kAudioObjectUnknown) |
+ LOG(INFO) << "Using AGGREGATE audio device"; |
} |
- AudioDeviceID device = kAudioObjectUnknown; |
- GetDefaultOutputDevice(&device); |
- return new AUHALStream(this, params, device); |
+ if (device != kAudioObjectUnknown) |
+ return new AUHALStream(this, params, device); |
+ |
+ // Fallback to AudioSynchronizedStream which will handle completely |
+ // different and arbitrary combinations of input and output devices |
+ // even running at different sample-rates. |
+ // kAudioDeviceUnknown translates to "use default" here. |
+ return new AudioSynchronizedStream(this, |
+ params, |
+ kAudioDeviceUnknown, |
+ kAudioDeviceUnknown); |
} |
AudioInputStream* AudioManagerMac::MakeLinearInputStream( |