| 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 79ebe609ea9f4daba77e89c0dcc4354e5bb3c0e5..6db1ed483e1a5b7b279718d28c7ee97e8ee982c1 100644
|
| --- a/media/audio/mac/audio_manager_mac.cc
|
| +++ b/media/audio/mac/audio_manager_mac.cc
|
| @@ -566,8 +566,13 @@ AudioOutputStream* AudioManagerMac::MakeLowLatencyOutputStream(
|
|
|
| // 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))));
|
| + // NOTE: Use BindToCurrentLoop() to ensure the callback is always PostTask'd
|
| + // even if OSX calls us on the right thread. Some CoreAudio drivers will
|
| + // fire the callbacks during stream creation, leading to re-entrancy issues
|
| + // otherwise. See http://crbug.com/349604
|
| + output_device_listener_.reset(
|
| + new AudioDeviceListenerMac(BindToCurrentLoop(base::Bind(
|
| + &AudioManagerMac::HandleDeviceChanges, base::Unretained(this)))));
|
| // Only set the current output device for the default device.
|
| if (device_id == AudioManagerBase::kDefaultDeviceId || device_id.empty())
|
| current_output_device_ = device;
|
| @@ -698,13 +703,8 @@ void AudioManagerMac::ShutdownOnAudioThread() {
|
| }
|
|
|
| void AudioManagerMac::HandleDeviceChanges() {
|
| - if (!GetTaskRunner()->BelongsToCurrentThread()) {
|
| - GetTaskRunner()->PostTask(FROM_HERE, base::Bind(
|
| - &AudioManagerMac::HandleDeviceChanges, base::Unretained(this)));
|
| - return;
|
| - }
|
| -
|
| - int new_sample_rate = HardwareSampleRate();
|
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread());
|
| + const int new_sample_rate = HardwareSampleRate();
|
| AudioDeviceID new_output_device;
|
| GetDefaultOutputDevice(&new_output_device);
|
|
|
|
|