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 |