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 |