Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: media/audio/audio_output_controller.cc

Issue 2443573003: Factor out AudioOutputDelegate from AudioRendererHost. (Closed)
Patch Set: Final comments addressed. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/audio/audio_output_controller.h ('k') | media/audio/audio_output_controller_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <limits> 10 #include <limits>
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 return; 131 return;
132 132
133 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). 133 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener().
134 DCHECK_EQ(kEmpty, state_); 134 DCHECK_EQ(kEmpty, state_);
135 135
136 stream_ = diverting_to_stream_ ? 136 stream_ = diverting_to_stream_ ?
137 diverting_to_stream_ : 137 diverting_to_stream_ :
138 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_); 138 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_);
139 if (!stream_) { 139 if (!stream_) {
140 state_ = kError; 140 state_ = kError;
141 handler_->OnError(); 141 handler_->OnControllerError();
142 return; 142 return;
143 } 143 }
144 144
145 if (!stream_->Open()) { 145 if (!stream_->Open()) {
146 DoStopCloseAndClearStream(); 146 DoStopCloseAndClearStream();
147 state_ = kError; 147 state_ = kError;
148 handler_->OnError(); 148 handler_->OnControllerError();
149 return; 149 return;
150 } 150 }
151 151
152 // Everything started okay, so re-register for state change callbacks if 152 // Everything started okay, so re-register for state change callbacks if
153 // stream_ was created via AudioManager. 153 // stream_ was created via AudioManager.
154 if (stream_ != diverting_to_stream_) 154 if (stream_ != diverting_to_stream_)
155 audio_manager_->AddOutputDeviceChangeListener(this); 155 audio_manager_->AddOutputDeviceChangeListener(this);
156 156
157 // We have successfully opened the stream. Set the initial volume. 157 // We have successfully opened the stream. Set the initial volume.
158 stream_->SetVolume(volume_); 158 stream_->SetVolume(volume_);
159 159
160 // Finally set the state to kCreated. 160 // Finally set the state to kCreated.
161 state_ = kCreated; 161 state_ = kCreated;
162 162
163 // And then report we have been created if we haven't done so already. 163 // And then report we have been created if we haven't done so already.
164 if (!is_for_device_change) 164 if (!is_for_device_change)
165 handler_->OnCreated(); 165 handler_->OnControllerCreated();
166 } 166 }
167 167
168 void AudioOutputController::DoPlay() { 168 void AudioOutputController::DoPlay() {
169 DCHECK(message_loop_->BelongsToCurrentThread()); 169 DCHECK(message_loop_->BelongsToCurrentThread());
170 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.PlayTime"); 170 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.PlayTime");
171 TRACE_EVENT0("audio", "AudioOutputController::DoPlay"); 171 TRACE_EVENT0("audio", "AudioOutputController::DoPlay");
172 172
173 // We can start from created or paused state. 173 // We can start from created or paused state.
174 if (state_ != kCreated && state_ != kPaused) 174 if (state_ != kCreated && state_ != kPaused)
175 return; 175 return;
(...skipping 14 matching lines...) Expand all
190 // it. 190 // it.
191 // 191 //
192 // Timer self-manages its lifetime and WedgeCheck() will only record the UMA 192 // Timer self-manages its lifetime and WedgeCheck() will only record the UMA
193 // statistic if state is still kPlaying. Additional Start() calls will 193 // statistic if state is still kPlaying. Additional Start() calls will
194 // invalidate the previous timer. 194 // invalidate the previous timer.
195 wedge_timer_.reset(new base::OneShotTimer()); 195 wedge_timer_.reset(new base::OneShotTimer());
196 wedge_timer_->Start( 196 wedge_timer_->Start(
197 FROM_HERE, TimeDelta::FromSeconds(5), this, 197 FROM_HERE, TimeDelta::FromSeconds(5), this,
198 &AudioOutputController::WedgeCheck); 198 &AudioOutputController::WedgeCheck);
199 199
200 handler_->OnPlaying(); 200 handler_->OnControllerPlaying();
201 } 201 }
202 202
203 void AudioOutputController::StopStream() { 203 void AudioOutputController::StopStream() {
204 DCHECK(message_loop_->BelongsToCurrentThread()); 204 DCHECK(message_loop_->BelongsToCurrentThread());
205 205
206 if (state_ == kPlaying) { 206 if (state_ == kPlaying) {
207 wedge_timer_.reset(); 207 wedge_timer_.reset();
208 stream_->Stop(); 208 stream_->Stop();
209 209
210 // A stopped stream is silent, and power_montior_.Scan() is no longer being 210 // A stopped stream is silent, and power_montior_.Scan() is no longer being
(...skipping 12 matching lines...) Expand all
223 StopStream(); 223 StopStream();
224 224
225 if (state_ != kPaused) 225 if (state_ != kPaused)
226 return; 226 return;
227 227
228 // Let the renderer know we've stopped. Necessary to let PPAPI clients know 228 // Let the renderer know we've stopped. Necessary to let PPAPI clients know
229 // audio has been shutdown. TODO(dalecurtis): This stinks. PPAPI should have 229 // audio has been shutdown. TODO(dalecurtis): This stinks. PPAPI should have
230 // a better way to know when it should exit PPB_Audio_Shared::Run(). 230 // a better way to know when it should exit PPB_Audio_Shared::Run().
231 sync_reader_->RequestMoreData(base::TimeDelta::Max(), base::TimeTicks(), 0); 231 sync_reader_->RequestMoreData(base::TimeDelta::Max(), base::TimeTicks(), 0);
232 232
233 handler_->OnPaused(); 233 handler_->OnControllerPaused();
234 } 234 }
235 235
236 void AudioOutputController::DoClose() { 236 void AudioOutputController::DoClose() {
237 DCHECK(message_loop_->BelongsToCurrentThread()); 237 DCHECK(message_loop_->BelongsToCurrentThread());
238 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CloseTime"); 238 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CloseTime");
239 TRACE_EVENT0("audio", "AudioOutputController::DoClose"); 239 TRACE_EVENT0("audio", "AudioOutputController::DoClose");
240 240
241 if (state_ != kClosed) { 241 if (state_ != kClosed) {
242 DoStopCloseAndClearStream(); 242 DoStopCloseAndClearStream();
243 sync_reader_->Close(); 243 sync_reader_->Close();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 // since it would break the diverted setup. Once diversion is 284 // since it would break the diverted setup. Once diversion is
285 // finished using StopDiverting() the output will switch to the new 285 // finished using StopDiverting() the output will switch to the new
286 // device ID. 286 // device ID.
287 if (stream_ != diverting_to_stream_) 287 if (stream_ != diverting_to_stream_)
288 OnDeviceChange(); 288 OnDeviceChange();
289 } 289 }
290 290
291 void AudioOutputController::DoReportError() { 291 void AudioOutputController::DoReportError() {
292 DCHECK(message_loop_->BelongsToCurrentThread()); 292 DCHECK(message_loop_->BelongsToCurrentThread());
293 if (state_ != kClosed) 293 if (state_ != kClosed)
294 handler_->OnError(); 294 handler_->OnControllerError();
295 } 295 }
296 296
297 int AudioOutputController::OnMoreData(base::TimeDelta delay, 297 int AudioOutputController::OnMoreData(base::TimeDelta delay,
298 base::TimeTicks delay_timestamp, 298 base::TimeTicks delay_timestamp,
299 int prior_frames_skipped, 299 int prior_frames_skipped,
300 AudioBus* dest) { 300 AudioBus* dest) {
301 TRACE_EVENT0("audio", "AudioOutputController::OnMoreData"); 301 TRACE_EVENT0("audio", "AudioOutputController::OnMoreData");
302 302
303 // Indicate that we haven't wedged (at least not indefinitely, WedgeCheck() 303 // Indicate that we haven't wedged (at least not indefinitely, WedgeCheck()
304 // may have already fired if OnMoreData() took an abnormal amount of time). 304 // may have already fired if OnMoreData() took an abnormal amount of time).
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 DCHECK(message_loop_->BelongsToCurrentThread()); 505 DCHECK(message_loop_->BelongsToCurrentThread());
506 506
507 // If we should be playing and we haven't, that's a wedge. 507 // If we should be playing and we haven't, that's a wedge.
508 if (state_ == kPlaying) { 508 if (state_ == kPlaying) {
509 UMA_HISTOGRAM_BOOLEAN("Media.AudioOutputControllerPlaybackStartupSuccess", 509 UMA_HISTOGRAM_BOOLEAN("Media.AudioOutputControllerPlaybackStartupSuccess",
510 base::AtomicRefCountIsOne(&on_more_io_data_called_)); 510 base::AtomicRefCountIsOne(&on_more_io_data_called_));
511 } 511 }
512 } 512 }
513 513
514 } // namespace media 514 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_output_controller.h ('k') | media/audio/audio_output_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698