Chromium Code Reviews| 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(); |