| 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 <CoreAudio/AudioHardware.h> | 5 #include <CoreAudio/AudioHardware.h> |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/mac/mac_logging.h" | 9 #include "base/mac/mac_logging.h" |
| 10 #include "base/mac/mac_util.h" | |
| 11 #include "base/mac/scoped_cftyperef.h" | 10 #include "base/mac/scoped_cftyperef.h" |
| 12 #include "base/sys_string_conversions.h" | 11 #include "base/sys_string_conversions.h" |
| 13 #include "media/audio/mac/audio_input_mac.h" | 12 #include "media/audio/mac/audio_input_mac.h" |
| 14 #include "media/audio/mac/audio_low_latency_input_mac.h" | 13 #include "media/audio/mac/audio_low_latency_input_mac.h" |
| 15 #include "media/audio/mac/audio_low_latency_output_mac.h" | 14 #include "media/audio/mac/audio_low_latency_output_mac.h" |
| 16 #include "media/audio/mac/audio_manager_mac.h" | 15 #include "media/audio/mac/audio_manager_mac.h" |
| 17 #include "media/audio/mac/audio_output_mac.h" | 16 #include "media/audio/mac/audio_output_mac.h" |
| 18 #include "media/base/limits.h" | 17 #include "media/base/limits.h" |
| 19 | 18 |
| 20 namespace media { | 19 namespace media { |
| 21 | 20 |
| 22 // Maximum number of output streams that can be open simultaneously. | 21 // Maximum number of output streams that can be open simultaneously. |
| 23 static const int kMaxOutputStreams = 50; | 22 static const int kMaxOutputStreams = 50; |
| 24 | 23 |
| 25 // By experiment the maximum number of audio streams allowed in Leopard | |
| 26 // is 18. But we put a slightly smaller number just to be safe. | |
| 27 static const int kMaxOutputStreamsLeopard = 15; | |
| 28 | |
| 29 static bool HasAudioHardware(AudioObjectPropertySelector selector) { | 24 static bool HasAudioHardware(AudioObjectPropertySelector selector) { |
| 30 AudioDeviceID output_device_id = kAudioObjectUnknown; | 25 AudioDeviceID output_device_id = kAudioObjectUnknown; |
| 31 const AudioObjectPropertyAddress property_address = { | 26 const AudioObjectPropertyAddress property_address = { |
| 32 selector, | 27 selector, |
| 33 kAudioObjectPropertyScopeGlobal, // mScope | 28 kAudioObjectPropertyScopeGlobal, // mScope |
| 34 kAudioObjectPropertyElementMaster // mElement | 29 kAudioObjectPropertyElementMaster // mElement |
| 35 }; | 30 }; |
| 36 size_t output_device_id_size = sizeof(output_device_id); | 31 size_t output_device_id_size = sizeof(output_device_id); |
| 37 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, | 32 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, |
| 38 &property_address, | 33 &property_address, |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 | 200 |
| 206 if (result) { | 201 if (result) { |
| 207 OSSTATUS_DLOG(WARNING, result) << "Unable to query device " << device_id | 202 OSSTATUS_DLOG(WARNING, result) << "Unable to query device " << device_id |
| 208 << " for AudioDeviceID"; | 203 << " for AudioDeviceID"; |
| 209 } | 204 } |
| 210 | 205 |
| 211 return audio_device_id; | 206 return audio_device_id; |
| 212 } | 207 } |
| 213 | 208 |
| 214 AudioManagerMac::AudioManagerMac() { | 209 AudioManagerMac::AudioManagerMac() { |
| 215 // We are hitting a bug in Leopard where too many audio streams will cause | 210 SetMaxOutputStreamsAllowed(kMaxOutputStreams); |
| 216 // a deadlock in the AudioQueue API when starting the stream. Unfortunately | |
| 217 // there's no way to detect it within the AudioQueue API, so we put a | |
| 218 // special hard limit only for Leopard. | |
| 219 // See bug: http://crbug.com/30242 | |
| 220 // In OS other than OSX Leopard, the number of audio streams | |
| 221 // allowed is a lot more. | |
| 222 int max_output_stream = base::mac::IsOSLeopardOrEarlier() ? | |
| 223 kMaxOutputStreamsLeopard : kMaxOutputStreams; | |
| 224 SetMaxOutputStreamsAllowed(max_output_stream); | |
| 225 } | 211 } |
| 226 | 212 |
| 227 AudioManagerMac::~AudioManagerMac() { | 213 AudioManagerMac::~AudioManagerMac() { |
| 228 Shutdown(); | 214 Shutdown(); |
| 229 } | 215 } |
| 230 | 216 |
| 231 bool AudioManagerMac::HasAudioOutputDevices() { | 217 bool AudioManagerMac::HasAudioOutputDevices() { |
| 232 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice); | 218 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice); |
| 233 } | 219 } |
| 234 | 220 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 stream = new AUAudioInputStream(this, params, audio_device_id); | 270 stream = new AUAudioInputStream(this, params, audio_device_id); |
| 285 | 271 |
| 286 return stream; | 272 return stream; |
| 287 } | 273 } |
| 288 | 274 |
| 289 AudioManager* CreateAudioManager() { | 275 AudioManager* CreateAudioManager() { |
| 290 return new AudioManagerMac(); | 276 return new AudioManagerMac(); |
| 291 } | 277 } |
| 292 | 278 |
| 293 } // namespace media | 279 } // namespace media |
| OLD | NEW |