| OLD | NEW |
| 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/audio_output_controller.h" | 5 #include "media/audio/audio_output_controller.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 // Polling-related constants. | 30 // Polling-related constants. |
| 31 const int AudioOutputController::kPollNumAttempts = 3; | 31 const int AudioOutputController::kPollNumAttempts = 3; |
| 32 const int AudioOutputController::kPollPauseInMilliseconds = 3; | 32 const int AudioOutputController::kPollPauseInMilliseconds = 3; |
| 33 | 33 |
| 34 AudioOutputController::AudioOutputController( | 34 AudioOutputController::AudioOutputController( |
| 35 AudioManager* audio_manager, | 35 AudioManager* audio_manager, |
| 36 EventHandler* handler, | 36 EventHandler* handler, |
| 37 const AudioParameters& params, | 37 const AudioParameters& params, |
| 38 const std::string& output_device_id, | 38 const std::string& output_device_id, |
| 39 const std::string& input_device_id, | |
| 40 SyncReader* sync_reader) | 39 SyncReader* sync_reader) |
| 41 : audio_manager_(audio_manager), | 40 : audio_manager_(audio_manager), |
| 42 params_(params), | 41 params_(params), |
| 43 handler_(handler), | 42 handler_(handler), |
| 44 output_device_id_(output_device_id), | 43 output_device_id_(output_device_id), |
| 45 input_device_id_(input_device_id), | |
| 46 stream_(NULL), | 44 stream_(NULL), |
| 47 diverting_to_stream_(NULL), | 45 diverting_to_stream_(NULL), |
| 48 volume_(1.0), | 46 volume_(1.0), |
| 49 state_(kEmpty), | 47 state_(kEmpty), |
| 50 num_allowed_io_(0), | 48 num_allowed_io_(0), |
| 51 sync_reader_(sync_reader), | 49 sync_reader_(sync_reader), |
| 52 message_loop_(audio_manager->GetTaskRunner()), | 50 message_loop_(audio_manager->GetTaskRunner()), |
| 53 #if defined(AUDIO_POWER_MONITORING) | 51 #if defined(AUDIO_POWER_MONITORING) |
| 54 power_monitor_( | 52 power_monitor_( |
| 55 params.sample_rate(), | 53 params.sample_rate(), |
| 56 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)), | 54 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)), |
| 57 #endif | 55 #endif |
| 58 on_more_io_data_called_(0) { | 56 on_more_io_data_called_(0) { |
| 59 DCHECK(audio_manager); | 57 DCHECK(audio_manager); |
| 60 DCHECK(handler_); | 58 DCHECK(handler_); |
| 61 DCHECK(sync_reader_); | 59 DCHECK(sync_reader_); |
| 62 DCHECK(message_loop_.get()); | 60 DCHECK(message_loop_.get()); |
| 63 } | 61 } |
| 64 | 62 |
| 65 AudioOutputController::~AudioOutputController() { | 63 AudioOutputController::~AudioOutputController() { |
| 66 DCHECK_EQ(kClosed, state_); | 64 DCHECK_EQ(kClosed, state_); |
| 67 } | 65 } |
| 68 | 66 |
| 69 // static | 67 // static |
| 70 scoped_refptr<AudioOutputController> AudioOutputController::Create( | 68 scoped_refptr<AudioOutputController> AudioOutputController::Create( |
| 71 AudioManager* audio_manager, | 69 AudioManager* audio_manager, |
| 72 EventHandler* event_handler, | 70 EventHandler* event_handler, |
| 73 const AudioParameters& params, | 71 const AudioParameters& params, |
| 74 const std::string& output_device_id, | 72 const std::string& output_device_id, |
| 75 const std::string& input_device_id, | |
| 76 SyncReader* sync_reader) { | 73 SyncReader* sync_reader) { |
| 77 DCHECK(audio_manager); | 74 DCHECK(audio_manager); |
| 78 DCHECK(sync_reader); | 75 DCHECK(sync_reader); |
| 79 | 76 |
| 80 if (!params.IsValid() || !audio_manager) | 77 if (!params.IsValid() || !audio_manager) |
| 81 return NULL; | 78 return NULL; |
| 82 | 79 |
| 83 scoped_refptr<AudioOutputController> controller(new AudioOutputController( | 80 scoped_refptr<AudioOutputController> controller(new AudioOutputController( |
| 84 audio_manager, event_handler, params, output_device_id, input_device_id, | 81 audio_manager, event_handler, params, output_device_id, sync_reader)); |
| 85 sync_reader)); | |
| 86 controller->message_loop_->PostTask(FROM_HERE, base::Bind( | 82 controller->message_loop_->PostTask(FROM_HERE, base::Bind( |
| 87 &AudioOutputController::DoCreate, controller, false)); | 83 &AudioOutputController::DoCreate, controller, false)); |
| 88 return controller; | 84 return controller; |
| 89 } | 85 } |
| 90 | 86 |
| 91 void AudioOutputController::Play() { | 87 void AudioOutputController::Play() { |
| 92 message_loop_->PostTask(FROM_HERE, base::Bind( | 88 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 93 &AudioOutputController::DoPlay, this)); | 89 &AudioOutputController::DoPlay, this)); |
| 94 } | 90 } |
| 95 | 91 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 130 |
| 135 // Close() can be called before DoCreate() is executed. | 131 // Close() can be called before DoCreate() is executed. |
| 136 if (state_ == kClosed) | 132 if (state_ == kClosed) |
| 137 return; | 133 return; |
| 138 | 134 |
| 139 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). | 135 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). |
| 140 DCHECK_EQ(kEmpty, state_); | 136 DCHECK_EQ(kEmpty, state_); |
| 141 | 137 |
| 142 stream_ = diverting_to_stream_ ? | 138 stream_ = diverting_to_stream_ ? |
| 143 diverting_to_stream_ : | 139 diverting_to_stream_ : |
| 144 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_, | 140 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_); |
| 145 input_device_id_); | |
| 146 if (!stream_) { | 141 if (!stream_) { |
| 147 state_ = kError; | 142 state_ = kError; |
| 148 handler_->OnError(); | 143 handler_->OnError(); |
| 149 return; | 144 return; |
| 150 } | 145 } |
| 151 | 146 |
| 152 if (!stream_->Open()) { | 147 if (!stream_->Open()) { |
| 153 DoStopCloseAndClearStream(); | 148 DoStopCloseAndClearStream(); |
| 154 state_ = kError; | 149 state_ = kError; |
| 155 handler_->OnError(); | 150 handler_->OnError(); |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 UMA_HISTOGRAM_BOOLEAN( | 477 UMA_HISTOGRAM_BOOLEAN( |
| 483 "Media.AudioOutputControllerPlaybackStartupSuccess", playback_success); | 478 "Media.AudioOutputControllerPlaybackStartupSuccess", playback_success); |
| 484 | 479 |
| 485 // Let the AudioManager try and fix it. | 480 // Let the AudioManager try and fix it. |
| 486 if (!playback_success) | 481 if (!playback_success) |
| 487 audio_manager_->FixWedgedAudio(); | 482 audio_manager_->FixWedgedAudio(); |
| 488 } | 483 } |
| 489 } | 484 } |
| 490 | 485 |
| 491 } // namespace media | 486 } // namespace media |
| OLD | NEW |