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 c08efff93363beb5cd62d1bc2f606c664f7558ee..73f193068279c48cea9a2ab3257db55331cfbeee 100644 |
--- a/media/audio/mac/audio_manager_mac.cc |
+++ b/media/audio/mac/audio_manager_mac.cc |
@@ -273,26 +273,25 @@ class AudioManagerMac::AudioPowerObserver : public base::PowerObserver { |
AudioManagerMac::AudioManagerMac(AudioLogFactory* audio_log_factory) |
: AudioManagerBase(audio_log_factory), |
- current_sample_rate_(0) { |
- current_output_device_ = kAudioDeviceUnknown; |
- |
+ current_sample_rate_(0), |
+ current_output_device_(kAudioDeviceUnknown) { |
SetMaxOutputStreamsAllowed(kMaxOutputStreams); |
// Task must be posted last to avoid races from handing out "this" to the |
// audio thread. Always PostTask even if we're on the right thread since |
// AudioManager creation is on the startup path and this may be slow. |
GetTaskRunner()->PostTask(FROM_HERE, base::Bind( |
- &AudioManagerMac::CreateDeviceListener, base::Unretained(this))); |
+ &AudioManagerMac::InitializeOnAudioThread, base::Unretained(this))); |
} |
AudioManagerMac::~AudioManagerMac() { |
if (GetTaskRunner()->BelongsToCurrentThread()) { |
- DestroyDeviceListener(); |
+ ShutdownOnAudioThread(); |
} else { |
// It's safe to post a task here since Shutdown() will wait for all tasks to |
// complete before returning. |
GetTaskRunner()->PostTask(FROM_HERE, base::Bind( |
- &AudioManagerMac::DestroyDeviceListener, base::Unretained(this))); |
+ &AudioManagerMac::ShutdownOnAudioThread, base::Unretained(this))); |
} |
Shutdown(); |
@@ -580,6 +579,19 @@ AudioOutputStream* AudioManagerMac::MakeLowLatencyOutputStream( |
DLOG(ERROR) << "Failed to open output device: " << device_id; |
return NULL; |
} |
+ |
+ // Lazily create the audio device listener on the first stream creation. |
+ if (!output_device_listener_) { |
+ output_device_listener_.reset(new AudioDeviceListenerMac(base::Bind( |
+ &AudioManagerMac::HandleDeviceChanges, base::Unretained(this)))); |
+ // Only set the current output device for the default device. |
+ if (device_id.empty()) |
tommi (sloooow) - chröme
2014/02/13 06:56:20
Check for AudioManagerBase::kDefaultDeviceId?
DaleCurtis
2014/02/13 19:24:35
That's only for input no?
DaleCurtis
2014/02/13 20:31:53
Done.
|
+ current_output_device_ = device; |
+ // Just use the current sample rate since we don't allow non-native sample |
+ // rates on OSX. |
+ current_sample_rate_ = params.sample_rate(); |
+ } |
+ |
return new AUHALStream(this, params, device); |
} |
@@ -741,21 +753,12 @@ AudioParameters AudioManagerMac::GetPreferredOutputStreamParameters( |
AudioParameters::NO_EFFECTS); |
} |
-void AudioManagerMac::CreateDeviceListener() { |
+void AudioManagerMac::InitializeOnAudioThread() { |
DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
- |
- // Get a baseline for the sample-rate and current device, |
- // so we can intelligently handle device notifications only when necessary. |
- current_sample_rate_ = HardwareSampleRate(); |
- if (!GetDefaultOutputDevice(¤t_output_device_)) |
- current_output_device_ = kAudioDeviceUnknown; |
- |
- output_device_listener_.reset(new AudioDeviceListenerMac(base::Bind( |
- &AudioManagerMac::HandleDeviceChanges, base::Unretained(this)))); |
power_observer_.reset(new AudioPowerObserver()); |
} |
-void AudioManagerMac::DestroyDeviceListener() { |
+void AudioManagerMac::ShutdownOnAudioThread() { |
DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
output_device_listener_.reset(); |
power_observer_.reset(); |