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

Side by Side Diff: media/filters/audio_renderer_impl.cc

Issue 10669022: Add status parameter to DemuxerStream::ReadCB (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 5 months 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 | Annotate | Revision Log
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/filters/audio_renderer_impl.h" 5 #include "media/filters/audio_renderer_impl.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 return; 220 return;
221 sink_->SetVolume(volume); 221 sink_->SetVolume(volume);
222 } 222 }
223 223
224 AudioRendererImpl::~AudioRendererImpl() { 224 AudioRendererImpl::~AudioRendererImpl() {
225 // Stop() should have been called and |algorithm_| should have been destroyed. 225 // Stop() should have been called and |algorithm_| should have been destroyed.
226 DCHECK(state_ == kUninitialized || state_ == kStopped); 226 DCHECK(state_ == kUninitialized || state_ == kStopped);
227 DCHECK(!algorithm_.get()); 227 DCHECK(!algorithm_.get());
228 } 228 }
229 229
230 void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { 230 void AudioRendererImpl::DecodedAudioReady(AudioDecoder::Status status,
231 const scoped_refptr<Buffer>& buffer) {
231 base::AutoLock auto_lock(lock_); 232 base::AutoLock auto_lock(lock_);
232 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || 233 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying ||
233 state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped); 234 state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped);
234 235
235 CHECK(pending_read_); 236 CHECK(pending_read_);
236 pending_read_ = false; 237 pending_read_ = false;
237 238
238 if (buffer && buffer->IsEndOfStream()) { 239 if (status == AudioDecoder::kDecodeError) {
240 HandleDecodeError();
241 return;
242 }
243
244 if (status == AudioDecoder::kAborted) {
245 HandleAbortedRead();
246 return;
247 }
248
249 DCHECK_EQ(status, AudioDecoder::kOk);
250 DCHECK(buffer);
251
252 if (buffer->IsEndOfStream()) {
239 received_end_of_stream_ = true; 253 received_end_of_stream_ = true;
240 254
241 // Transition to kPlaying if we are currently handling an underflow since 255 // Transition to kPlaying if we are currently handling an underflow since
242 // no more data will be arriving. 256 // no more data will be arriving.
243 if (state_ == kUnderflow || state_ == kRebuffering) 257 if (state_ == kUnderflow || state_ == kRebuffering)
244 state_ = kPlaying; 258 state_ = kPlaying;
245 } 259 }
246 260
247 switch (state_) { 261 switch (state_) {
248 case kUninitialized: 262 case kUninitialized:
249 NOTREACHED(); 263 NOTREACHED();
250 return; 264 return;
251 case kPaused: 265 case kPaused:
252 if (buffer && !buffer->IsEndOfStream()) 266 if (!buffer->IsEndOfStream())
253 algorithm_->EnqueueBuffer(buffer); 267 algorithm_->EnqueueBuffer(buffer);
254 DCHECK(!pending_read_); 268 DCHECK(!pending_read_);
255 base::ResetAndReturn(&pause_cb_).Run(); 269 base::ResetAndReturn(&pause_cb_).Run();
256 return; 270 return;
257 case kSeeking: 271 case kSeeking:
258 if (IsBeforeSeekTime(buffer)) { 272 if (IsBeforeSeekTime(buffer)) {
259 ScheduleRead_Locked(); 273 ScheduleRead_Locked();
260 return; 274 return;
261 } 275 }
262 if (buffer && !buffer->IsEndOfStream()) { 276 if (!buffer->IsEndOfStream()) {
263 algorithm_->EnqueueBuffer(buffer); 277 algorithm_->EnqueueBuffer(buffer);
264 if (!algorithm_->IsQueueFull()) 278 if (!algorithm_->IsQueueFull())
265 return; 279 return;
266 } 280 }
267 state_ = kPaused; 281 state_ = kPaused;
268 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); 282 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
269 return; 283 return;
270 case kPlaying: 284 case kPlaying:
271 case kUnderflow: 285 case kUnderflow:
272 case kRebuffering: 286 case kRebuffering:
273 if (buffer && !buffer->IsEndOfStream()) 287 if (!buffer->IsEndOfStream())
274 algorithm_->EnqueueBuffer(buffer); 288 algorithm_->EnqueueBuffer(buffer);
275 return; 289 return;
276 case kStopped: 290 case kStopped:
277 return; 291 return;
278 } 292 }
279 } 293 }
280 294
281 void AudioRendererImpl::ScheduleRead_Locked() { 295 void AudioRendererImpl::ScheduleRead_Locked() {
282 lock_.AssertAcquired(); 296 lock_.AssertAcquired();
283 if (pending_read_ || state_ == kPaused) 297 if (pending_read_ || state_ == kPaused)
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 515
502 void AudioRendererImpl::OnRenderError() { 516 void AudioRendererImpl::OnRenderError() {
503 host()->DisableAudioRenderer(); 517 host()->DisableAudioRenderer();
504 } 518 }
505 519
506 void AudioRendererImpl::DisableUnderflowForTesting() { 520 void AudioRendererImpl::DisableUnderflowForTesting() {
507 DCHECK(!is_initialized_); 521 DCHECK(!is_initialized_);
508 underflow_disabled_ = true; 522 underflow_disabled_ = true;
509 } 523 }
510 524
525 void AudioRendererImpl::HandleDecodeError() {
526 switch (state_) {
527 case kUninitialized:
528 NOTREACHED();
529 return;
530 case kPaused:
531 base::ResetAndReturn(&pause_cb_).Run();
Ami GONE FROM CHROMIUM 2012/06/26 00:33:21 does the error get dropped at this point?
acolwell GONE FROM CHROMIUM 2012/07/12 01:19:38 Done.
532 return;
533 case kSeeking:
534 state_ = kPaused;
535 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_DECODE);
536 return;
537 case kPlaying:
538 case kUnderflow:
539 case kRebuffering:
540 case kStopped:
541 host()->SetError(PIPELINE_ERROR_DECODE);
542 return;
543 }
544 }
545
546 void AudioRendererImpl::HandleAbortedRead() {
547 switch (state_) {
548 case kUninitialized:
549 NOTREACHED();
550 return;
551 case kPaused:
552 base::ResetAndReturn(&pause_cb_).Run();
553 return;
554 case kSeeking:
555 state_ = kPaused;
556 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
557 return;
558 case kPlaying:
559 case kUnderflow:
560 case kRebuffering:
561 case kStopped:
562 return;
563 }
564 }
565
511 } // namespace media 566 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698