Index: media/audio/mac/audio_manager_mac.cc |
diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc |
index 20c51530813c825ef7edbb8f4d5bac3ef720cc68..3671317ba67ab2b8a1fa3a10611b062170fd145c 100644 |
--- a/media/audio/mac/audio_manager_mac.cc |
+++ b/media/audio/mac/audio_manager_mac.cc |
@@ -426,24 +426,55 @@ AudioOutputStream* AudioManagerMac::MakeLinearOutputStream( |
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); |
- |
- // 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); |
+ 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; |
} |
AudioDeviceID device = kAudioObjectUnknown; |
- GetDefaultOutputDevice(&device); |
- return new AUHALStream(this, params, device); |
+ 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"; |
+ } 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"; |
+ } |
+ |
+ 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. |
+ // TODO(crogers): consider tracking UMA stats on AUHALStream |
+ // versus AudioSynchronizedStream. |
+ return new AudioSynchronizedStream(this, |
+ params, |
+ kAudioDeviceUnknown, |
+ kAudioDeviceUnknown); |
} |
AudioInputStream* AudioManagerMac::MakeLinearInputStream( |