| 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/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 static const int kPowerMeasurementTimeConstantMillis = 10; | 25 static const int kPowerMeasurementTimeConstantMillis = 10; |
| 26 | 26 |
| 27 // Desired frequency of calls to EventHandler::OnPowerMeasured() for reporting | 27 // Desired frequency of calls to EventHandler::OnPowerMeasured() for reporting |
| 28 // power levels in the audio signal. | 28 // power levels in the audio signal. |
| 29 static const int kPowerMeasurementsPerSecond = 30; | 29 static const int kPowerMeasurementsPerSecond = 30; |
| 30 | 30 |
| 31 // Polling-related constants. | 31 // Polling-related constants. |
| 32 const int AudioOutputController::kPollNumAttempts = 3; | 32 const int AudioOutputController::kPollNumAttempts = 3; |
| 33 const int AudioOutputController::kPollPauseInMilliseconds = 3; | 33 const int AudioOutputController::kPollPauseInMilliseconds = 3; |
| 34 | 34 |
| 35 AudioOutputController::AudioOutputController(AudioManager* audio_manager, | 35 AudioOutputController::AudioOutputController( |
| 36 EventHandler* handler, | 36 AudioManager* audio_manager, |
| 37 const AudioParameters& params, | 37 EventHandler* handler, |
| 38 const std::string& input_device_id, | 38 const AudioParameters& params, |
| 39 SyncReader* sync_reader) | 39 const std::string& output_device_id, |
| 40 const std::string& input_device_id, |
| 41 SyncReader* sync_reader) |
| 40 : audio_manager_(audio_manager), | 42 : audio_manager_(audio_manager), |
| 41 params_(params), | 43 params_(params), |
| 42 handler_(handler), | 44 handler_(handler), |
| 45 output_device_id_(output_device_id), |
| 43 input_device_id_(input_device_id), | 46 input_device_id_(input_device_id), |
| 44 stream_(NULL), | 47 stream_(NULL), |
| 45 diverting_to_stream_(NULL), | 48 diverting_to_stream_(NULL), |
| 46 volume_(1.0), | 49 volume_(1.0), |
| 47 state_(kEmpty), | 50 state_(kEmpty), |
| 48 num_allowed_io_(0), | 51 num_allowed_io_(0), |
| 49 sync_reader_(sync_reader), | 52 sync_reader_(sync_reader), |
| 50 message_loop_(audio_manager->GetMessageLoop()), | 53 message_loop_(audio_manager->GetMessageLoop()), |
| 51 number_polling_attempts_left_(0), | 54 number_polling_attempts_left_(0), |
| 52 power_monitor_( | 55 power_monitor_( |
| 53 params.sample_rate(), | 56 params.sample_rate(), |
| 54 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)) { | 57 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)) { |
| 55 DCHECK(audio_manager); | 58 DCHECK(audio_manager); |
| 56 DCHECK(handler_); | 59 DCHECK(handler_); |
| 57 DCHECK(sync_reader_); | 60 DCHECK(sync_reader_); |
| 58 DCHECK(message_loop_.get()); | 61 DCHECK(message_loop_.get()); |
| 59 } | 62 } |
| 60 | 63 |
| 61 AudioOutputController::~AudioOutputController() { | 64 AudioOutputController::~AudioOutputController() { |
| 62 DCHECK_EQ(kClosed, state_); | 65 DCHECK_EQ(kClosed, state_); |
| 63 } | 66 } |
| 64 | 67 |
| 65 // static | 68 // static |
| 66 scoped_refptr<AudioOutputController> AudioOutputController::Create( | 69 scoped_refptr<AudioOutputController> AudioOutputController::Create( |
| 67 AudioManager* audio_manager, | 70 AudioManager* audio_manager, |
| 68 EventHandler* event_handler, | 71 EventHandler* event_handler, |
| 69 const AudioParameters& params, | 72 const AudioParameters& params, |
| 73 const std::string& output_device_id, |
| 70 const std::string& input_device_id, | 74 const std::string& input_device_id, |
| 71 SyncReader* sync_reader) { | 75 SyncReader* sync_reader) { |
| 72 DCHECK(audio_manager); | 76 DCHECK(audio_manager); |
| 73 DCHECK(sync_reader); | 77 DCHECK(sync_reader); |
| 74 | 78 |
| 75 if (!params.IsValid() || !audio_manager) | 79 if (!params.IsValid() || !audio_manager) |
| 76 return NULL; | 80 return NULL; |
| 77 | 81 |
| 78 scoped_refptr<AudioOutputController> controller(new AudioOutputController( | 82 scoped_refptr<AudioOutputController> controller(new AudioOutputController( |
| 79 audio_manager, event_handler, params, input_device_id, sync_reader)); | 83 audio_manager, event_handler, params, output_device_id, input_device_id, |
| 84 sync_reader)); |
| 80 controller->message_loop_->PostTask(FROM_HERE, base::Bind( | 85 controller->message_loop_->PostTask(FROM_HERE, base::Bind( |
| 81 &AudioOutputController::DoCreate, controller, false)); | 86 &AudioOutputController::DoCreate, controller, false)); |
| 82 return controller; | 87 return controller; |
| 83 } | 88 } |
| 84 | 89 |
| 85 void AudioOutputController::Play() { | 90 void AudioOutputController::Play() { |
| 86 message_loop_->PostTask(FROM_HERE, base::Bind( | 91 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 87 &AudioOutputController::DoPlay, this)); | 92 &AudioOutputController::DoPlay, this)); |
| 88 } | 93 } |
| 89 | 94 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 107 DCHECK(message_loop_->BelongsToCurrentThread()); | 112 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 108 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime"); | 113 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime"); |
| 109 | 114 |
| 110 // Close() can be called before DoCreate() is executed. | 115 // Close() can be called before DoCreate() is executed. |
| 111 if (state_ == kClosed) | 116 if (state_ == kClosed) |
| 112 return; | 117 return; |
| 113 | 118 |
| 114 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). | 119 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). |
| 115 DCHECK_EQ(kEmpty, state_); | 120 DCHECK_EQ(kEmpty, state_); |
| 116 | 121 |
| 117 stream_ = diverting_to_stream_ ? diverting_to_stream_ : | 122 stream_ = diverting_to_stream_ ? |
| 118 audio_manager_->MakeAudioOutputStreamProxy(params_, "", input_device_id_); | 123 diverting_to_stream_ : |
| 124 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_, |
| 125 input_device_id_); |
| 119 if (!stream_) { | 126 if (!stream_) { |
| 120 state_ = kError; | 127 state_ = kError; |
| 121 handler_->OnError(); | 128 handler_->OnError(); |
| 122 return; | 129 return; |
| 123 } | 130 } |
| 124 | 131 |
| 125 if (!stream_->Open()) { | 132 if (!stream_->Open()) { |
| 126 DoStopCloseAndClearStream(); | 133 DoStopCloseAndClearStream(); |
| 127 state_ = kError; | 134 state_ = kError; |
| 128 handler_->OnError(); | 135 handler_->OnError(); |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_)); | 397 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_)); |
| 391 base::AtomicRefCountInc(&num_allowed_io_); | 398 base::AtomicRefCountInc(&num_allowed_io_); |
| 392 } | 399 } |
| 393 | 400 |
| 394 void AudioOutputController::DisallowEntryToOnMoreIOData() { | 401 void AudioOutputController::DisallowEntryToOnMoreIOData() { |
| 395 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_); | 402 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_); |
| 396 DCHECK(is_zero); | 403 DCHECK(is_zero); |
| 397 } | 404 } |
| 398 | 405 |
| 399 } // namespace media | 406 } // namespace media |
| OLD | NEW |