Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: media/audio/mac/audio_manager_mac.cc

Issue 14273018: Use the browser UI thread for audio on OSX. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test failures. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "media/audio/mac/audio_manager_mac.h" 5 #include "media/audio/mac/audio_manager_mac.h"
6 6
7 #include <CoreAudio/AudioHardware.h> 7 #include <CoreAudio/AudioHardware.h>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 228
229 return audio_device_id; 229 return audio_device_id;
230 } 230 }
231 231
232 AudioManagerMac::AudioManagerMac() 232 AudioManagerMac::AudioManagerMac()
233 : current_sample_rate_(0) { 233 : current_sample_rate_(0) {
234 current_output_device_ = kAudioDeviceUnknown; 234 current_output_device_ = kAudioDeviceUnknown;
235 235
236 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 236 SetMaxOutputStreamsAllowed(kMaxOutputStreams);
237 237
238 // Task must be posted last to avoid races from handing out "this" to the 238 if (GetMessageLoop()->BelongsToCurrentThread()) {
239 // audio thread. 239 CreateDeviceListener();
240 GetMessageLoop()->PostTask(FROM_HERE, base::Bind( 240 } else {
241 &AudioManagerMac::CreateDeviceListener, base::Unretained(this))); 241 // Task must be posted last to avoid races from handing out "this" to the
242 // audio thread.
243 GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
244 &AudioManagerMac::CreateDeviceListener, base::Unretained(this)));
245 }
242 } 246 }
243 247
244 AudioManagerMac::~AudioManagerMac() { 248 AudioManagerMac::~AudioManagerMac() {
245 // It's safe to post a task here since Shutdown() will wait for all tasks to 249 if (GetMessageLoop()->BelongsToCurrentThread()) {
246 // complete before returning. 250 DestroyDeviceListener();
247 GetMessageLoop()->PostTask(FROM_HERE, base::Bind( 251 } else {
248 &AudioManagerMac::DestroyDeviceListener, base::Unretained(this))); 252 // It's safe to post a task here since Shutdown() will wait for all tasks to
253 // complete before returning.
254 GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
255 &AudioManagerMac::DestroyDeviceListener, base::Unretained(this)));
256 }
249 257
250 Shutdown(); 258 Shutdown();
251 } 259 }
252 260
253 bool AudioManagerMac::HasAudioOutputDevices() { 261 bool AudioManagerMac::HasAudioOutputDevices() {
254 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice); 262 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice);
255 } 263 }
256 264
257 bool AudioManagerMac::HasAudioInputDevices() { 265 bool AudioManagerMac::HasAudioInputDevices() {
258 return HasAudioHardware(kAudioHardwarePropertyDefaultInputDevice); 266 return HasAudioHardware(kAudioHardwarePropertyDefaultInputDevice);
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 551
544 void AudioManagerMac::CreateDeviceListener() { 552 void AudioManagerMac::CreateDeviceListener() {
545 DCHECK(GetMessageLoop()->BelongsToCurrentThread()); 553 DCHECK(GetMessageLoop()->BelongsToCurrentThread());
546 554
547 // Get a baseline for the sample-rate and current device, 555 // Get a baseline for the sample-rate and current device,
548 // so we can intelligently handle device notifications only when necessary. 556 // so we can intelligently handle device notifications only when necessary.
549 current_sample_rate_ = HardwareSampleRate(); 557 current_sample_rate_ = HardwareSampleRate();
550 if (!GetDefaultOutputDevice(&current_output_device_)) 558 if (!GetDefaultOutputDevice(&current_output_device_))
551 current_output_device_ = kAudioDeviceUnknown; 559 current_output_device_ = kAudioDeviceUnknown;
552 560
553 output_device_listener_.reset(new AudioDeviceListenerMac(BindToLoop( 561 output_device_listener_.reset(new AudioDeviceListenerMac(base::Bind(
554 GetMessageLoop(), base::Bind( 562 &AudioManagerMac::HandleDeviceChanges, base::Unretained(this))));
555 &AudioManagerMac::HandleDeviceChanges,
556 base::Unretained(this)))));
557 } 563 }
558 564
559 void AudioManagerMac::DestroyDeviceListener() { 565 void AudioManagerMac::DestroyDeviceListener() {
560 DCHECK(GetMessageLoop()->BelongsToCurrentThread()); 566 DCHECK(GetMessageLoop()->BelongsToCurrentThread());
561 output_device_listener_.reset(); 567 output_device_listener_.reset();
562 } 568 }
563 569
564 void AudioManagerMac::HandleDeviceChanges() { 570 void AudioManagerMac::HandleDeviceChanges() {
565 int new_sample_rate = HardwareSampleRate(); 571 int new_sample_rate = HardwareSampleRate();
566 AudioDeviceID new_output_device; 572 AudioDeviceID new_output_device;
567 GetDefaultOutputDevice(&new_output_device); 573 GetDefaultOutputDevice(&new_output_device);
568 574
569 if (current_sample_rate_ == new_sample_rate && 575 if (current_sample_rate_ == new_sample_rate &&
570 current_output_device_ == new_output_device) 576 current_output_device_ == new_output_device)
571 return; 577 return;
572 578
573 current_sample_rate_ = new_sample_rate; 579 current_sample_rate_ = new_sample_rate;
574 current_output_device_ = new_output_device; 580 current_output_device_ = new_output_device;
575 NotifyAllOutputDeviceChangeListeners(); 581 NotifyAllOutputDeviceChangeListeners();
576 } 582 }
577 583
578 AudioManager* CreateAudioManager() { 584 AudioManager* CreateAudioManager() {
579 return new AudioManagerMac(); 585 return new AudioManagerMac();
580 } 586 }
581 587
582 } // namespace media 588 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698