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 54251185eb3f4114840e31f01998b6f41c600c99..a60f5eaeba468cef5f7dc6f31abfe211ee2537bb 100644 |
| --- a/media/audio/mac/audio_manager_mac.cc |
| +++ b/media/audio/mac/audio_manager_mac.cc |
| @@ -365,53 +365,30 @@ class AudioManagerMac::AudioPowerObserver : public base::PowerObserver { |
| DISALLOW_COPY_AND_ASSIGN(AudioPowerObserver); |
| }; |
| -AudioManagerMac::AudioManagerMac(AudioLogFactory* audio_log_factory) |
| - : AudioManagerBase(audio_log_factory), |
| +AudioManagerMac::AudioManagerMac( |
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, |
| + AudioLogFactory* audio_log_factory) |
| + : AudioManagerBase(std::move(task_runner), |
| + std::move(worker_task_runner), |
| + audio_log_factory), |
| current_sample_rate_(0), |
| current_output_device_(kAudioDeviceUnknown) { |
| SetMaxOutputStreamsAllowed(kMaxOutputStreams); |
| - // CoreAudio calls must occur on the main thread of the process, which in our |
| - // case is sadly the browser UI thread. Failure to execute calls on the right |
| - // thread leads to crashes and odd behavior. See http://crbug.com/158170. |
| - // TODO(dalecurtis): We should require the message loop to be passed in. |
| - task_runner_ = base::MessageLoopForUI::IsCurrent() |
| - ? base::ThreadTaskRunnerHandle::Get() |
| - : AudioManagerBase::GetTaskRunner(); |
| - |
| // 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. |
| - task_runner_->PostTask(FROM_HERE, |
| - base::Bind(&AudioManagerMac::InitializeOnAudioThread, |
| - base::Unretained(this))); |
| + GetTaskRunner()->PostTask( |
| + FROM_HERE, base::Bind(&AudioManagerMac::InitializeOnAudioThread, |
| + base::Unretained(this))); |
| } |
| AudioManagerMac::~AudioManagerMac() { |
| - if (task_runner_->BelongsToCurrentThread()) { |
| - ShutdownOnAudioThread(); |
| - } else { |
| - // It's safe to post a task here since Shutdown() will wait for all tasks to |
| - // complete before returning. |
| - task_runner_->PostTask(FROM_HERE, |
| - base::Bind(&AudioManagerMac::ShutdownOnAudioThread, |
| - base::Unretained(this))); |
| - } |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| Shutdown(); |
| -} |
| - |
| -scoped_refptr<base::SingleThreadTaskRunner> AudioManagerMac::GetTaskRunner() { |
| - return task_runner_; |
| -} |
| - |
| -scoped_refptr<base::SingleThreadTaskRunner> |
| -AudioManagerMac::GetWorkerTaskRunner() { |
| - if (!worker_thread_) { |
| - worker_thread_.reset(new base::Thread("AudioWorkerThread")); |
| - CHECK(worker_thread_->Start()); |
| - } |
| - return worker_thread_->task_runner(); |
| + ShutdownOnAudioThread(); |
|
DaleCurtis
2016/04/05 21:55:36
Ditto. Also these methods are confusing now. Maybe
|
| } |
| bool AudioManagerMac::HasAudioOutputDevices() { |
| @@ -551,7 +528,7 @@ AudioParameters AudioManagerMac::GetInputStreamParameters( |
| std::string AudioManagerMac::GetAssociatedOutputDeviceID( |
| const std::string& input_device_id) { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| AudioDeviceID device = GetAudioDeviceIdByUId(true, input_device_id); |
| if (device == kAudioObjectUnknown) |
| return std::string(); |
| @@ -676,7 +653,7 @@ AudioOutputStream* AudioManagerMac::MakeLowLatencyOutputStream( |
| } |
| std::string AudioManagerMac::GetDefaultOutputDeviceID() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| AudioDeviceID device_id = kAudioObjectUnknown; |
| if (!GetDefaultOutputDevice(&device_id)) |
| return std::string(); |
| @@ -775,12 +752,12 @@ AudioParameters AudioManagerMac::GetPreferredOutputStreamParameters( |
| } |
| void AudioManagerMac::InitializeOnAudioThread() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| power_observer_.reset(new AudioPowerObserver()); |
| } |
| void AudioManagerMac::ShutdownOnAudioThread() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| output_device_listener_.reset(); |
| power_observer_.reset(); |
| @@ -799,7 +776,7 @@ void AudioManagerMac::ShutdownOnAudioThread() { |
| } |
| void AudioManagerMac::HandleDeviceChanges() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| const int new_sample_rate = HardwareSampleRate(); |
| AudioDeviceID new_output_device; |
| GetDefaultOutputDevice(&new_output_device); |
| @@ -841,17 +818,17 @@ int AudioManagerMac::ChooseBufferSize(bool is_input, int sample_rate) { |
| } |
| bool AudioManagerMac::ShouldDeferStreamStart() const { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| return power_observer_->ShouldDeferStreamStart(); |
| } |
| bool AudioManagerMac::IsOnBatteryPower() const { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| return power_observer_->IsOnBatteryPower(); |
| } |
| size_t AudioManagerMac::GetNumberOfResumeNotifications() const { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| return power_observer_->num_resume_notifications(); |
| } |
| @@ -861,7 +838,7 @@ bool AudioManagerMac::MaybeChangeBufferSize(AudioDeviceID device_id, |
| size_t desired_buffer_size, |
| bool* size_was_changed, |
| size_t* io_buffer_frame_size) { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); |
| const bool is_input = (element == 1); |
| DVLOG(1) << "MaybeChangeBufferSize(id=0x" << std::hex << device_id |
| << ", is_input=" << is_input << ", desired_buffer_size=" << std::dec |
| @@ -981,8 +958,13 @@ void AudioManagerMac::ReleaseInputStream(AudioInputStream* stream) { |
| AudioManagerBase::ReleaseInputStream(stream); |
| } |
| -AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) { |
| - return new AudioManagerMac(audio_log_factory); |
| +ScopedAudioManagerPtr CreateAudioManager( |
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, |
| + AudioLogFactory* audio_log_factory) { |
| + return ScopedAudioManagerPtr( |
| + new AudioManagerMac(std::move(task_runner), std::move(worker_task_runner), |
| + audio_log_factory)); |
| } |
| } // namespace media |