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

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

Issue 277123002: Rename AudioRenderer::Play/Pause() to Start/StopRendering(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 <algorithm> 9 #include <algorithm>
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 const SetDecryptorReadyCB& set_decryptor_ready_cb, 47 const SetDecryptorReadyCB& set_decryptor_ready_cb,
48 AudioHardwareConfig* hardware_config) 48 AudioHardwareConfig* hardware_config)
49 : task_runner_(task_runner), 49 : task_runner_(task_runner),
50 sink_(sink), 50 sink_(sink),
51 audio_buffer_stream_(task_runner, 51 audio_buffer_stream_(task_runner,
52 decoders.Pass(), 52 decoders.Pass(),
53 set_decryptor_ready_cb), 53 set_decryptor_ready_cb),
54 hardware_config_(hardware_config), 54 hardware_config_(hardware_config),
55 now_cb_(base::Bind(&base::TimeTicks::Now)), 55 now_cb_(base::Bind(&base::TimeTicks::Now)),
56 state_(kUninitialized), 56 state_(kUninitialized),
57 rendering_(false),
57 sink_playing_(false), 58 sink_playing_(false),
58 pending_read_(false), 59 pending_read_(false),
59 received_end_of_stream_(false), 60 received_end_of_stream_(false),
60 rendered_end_of_stream_(false), 61 rendered_end_of_stream_(false),
61 underflow_disabled_(false), 62 underflow_disabled_(false),
62 preroll_aborted_(false), 63 preroll_aborted_(false),
63 weak_factory_(this) { 64 weak_factory_(this) {
64 audio_buffer_stream_.set_splice_observer(base::Bind( 65 audio_buffer_stream_.set_splice_observer(base::Bind(
65 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); 66 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr()));
66 audio_buffer_stream_.set_config_change_observer(base::Bind( 67 audio_buffer_stream_.set_config_change_observer(base::Bind(
67 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); 68 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr()));
68 } 69 }
69 70
70 AudioRendererImpl::~AudioRendererImpl() { 71 AudioRendererImpl::~AudioRendererImpl() {
71 // Stop() should have been called and |algorithm_| should have been destroyed. 72 // Stop() should have been called and |algorithm_| should have been destroyed.
72 DCHECK(state_ == kUninitialized || state_ == kStopped); 73 DCHECK(state_ == kUninitialized || state_ == kStopped);
73 DCHECK(!algorithm_.get()); 74 DCHECK(!algorithm_.get());
74 } 75 }
75 76
76 void AudioRendererImpl::Play() { 77 void AudioRendererImpl::StartRendering() {
78 DVLOG(1) << __FUNCTION__;
77 DCHECK(task_runner_->BelongsToCurrentThread()); 79 DCHECK(task_runner_->BelongsToCurrentThread());
80 DCHECK(!rendering_);
81 rendering_ = true;
78 82
79 base::AutoLock auto_lock(lock_); 83 base::AutoLock auto_lock(lock_);
80 DCHECK_EQ(state_, kPaused); 84 // Wait for an eventual call to SetPlaybackRate() to start rendering.
81 ChangeState_Locked(kPlaying); 85 if (algorithm_->playback_rate() == 0) {
82 earliest_end_time_ = now_cb_.Run(); 86 DCHECK(!sink_playing_);
87 return;
88 }
83 89
84 if (algorithm_->playback_rate() != 0) 90 StartRendering_Locked();
85 DoPlay_Locked();
86 else
87 DCHECK(!sink_playing_);
88 } 91 }
89 92
90 void AudioRendererImpl::DoPlay_Locked() { 93 void AudioRendererImpl::StartRendering_Locked() {
94 DVLOG(1) << __FUNCTION__;
91 DCHECK(task_runner_->BelongsToCurrentThread()); 95 DCHECK(task_runner_->BelongsToCurrentThread());
96 DCHECK(state_ == kPlaying || state_ == kRebuffering || state_ == kUnderflow)
97 << "state_=" << state_;
98 DCHECK(!sink_playing_);
99 DCHECK_NE(algorithm_->playback_rate(), 0);
92 lock_.AssertAcquired(); 100 lock_.AssertAcquired();
101
93 earliest_end_time_ = now_cb_.Run(); 102 earliest_end_time_ = now_cb_.Run();
103 sink_playing_ = true;
94 104
95 if ((state_ == kPlaying || state_ == kRebuffering || state_ == kUnderflow) && 105 base::AutoUnlock auto_unlock(lock_);
96 !sink_playing_) { 106 sink_->Play();
97 {
98 base::AutoUnlock auto_unlock(lock_);
99 sink_->Play();
100 }
101
102 sink_playing_ = true;
103 }
104 } 107 }
105 108
106 void AudioRendererImpl::Pause() { 109 void AudioRendererImpl::StopRendering() {
110 DVLOG(1) << __FUNCTION__;
107 DCHECK(task_runner_->BelongsToCurrentThread()); 111 DCHECK(task_runner_->BelongsToCurrentThread());
112 DCHECK(rendering_);
113 rendering_ = false;
108 114
109 base::AutoLock auto_lock(lock_); 115 base::AutoLock auto_lock(lock_);
110 DCHECK(state_ == kPlaying || state_ == kUnderflow || 116 // Rendering should have already been stopped with a zero playback rate.
111 state_ == kRebuffering) << "state_ == " << state_; 117 if (algorithm_->playback_rate() == 0) {
112 ChangeState_Locked(kPaused); 118 DCHECK(!sink_playing_);
119 return;
120 }
113 121
114 DoPause_Locked(); 122 StopRendering_Locked();
115 } 123 }
116 124
117 void AudioRendererImpl::DoPause_Locked() { 125 void AudioRendererImpl::StopRendering_Locked() {
118 DCHECK(task_runner_->BelongsToCurrentThread()); 126 DCHECK(task_runner_->BelongsToCurrentThread());
127 DCHECK(state_ == kPlaying || state_ == kRebuffering || state_ == kUnderflow)
128 << "state_=" << state_;
129 DCHECK(sink_playing_);
119 lock_.AssertAcquired(); 130 lock_.AssertAcquired();
120 131
121 if (sink_playing_) { 132 sink_playing_ = false;
122 { 133
123 base::AutoUnlock auto_unlock(lock_); 134 base::AutoUnlock auto_unlock(lock_);
124 sink_->Pause(); 135 sink_->Pause();
125 }
126 sink_playing_ = false;
127 }
128 } 136 }
129 137
130 void AudioRendererImpl::Flush(const base::Closure& callback) { 138 void AudioRendererImpl::Flush(const base::Closure& callback) {
131 DCHECK(task_runner_->BelongsToCurrentThread()); 139 DCHECK(task_runner_->BelongsToCurrentThread());
132 140
133 base::AutoLock auto_lock(lock_); 141 base::AutoLock auto_lock(lock_);
134 DCHECK_EQ(state_, kPaused); 142 DCHECK_EQ(state_, kPlaying);
135 DCHECK(flush_cb_.is_null()); 143 DCHECK(flush_cb_.is_null());
136 144
137 flush_cb_ = callback; 145 flush_cb_ = callback;
138 146
139 if (pending_read_) { 147 if (pending_read_) {
140 ChangeState_Locked(kFlushing); 148 ChangeState_Locked(kFlushing);
141 return; 149 return;
142 } 150 }
143 151
152 ChangeState_Locked(kFlushed);
144 DoFlush_Locked(); 153 DoFlush_Locked();
145 } 154 }
146 155
147 void AudioRendererImpl::DoFlush_Locked() { 156 void AudioRendererImpl::DoFlush_Locked() {
148 DCHECK(task_runner_->BelongsToCurrentThread()); 157 DCHECK(task_runner_->BelongsToCurrentThread());
149 lock_.AssertAcquired(); 158 lock_.AssertAcquired();
150 159
151 DCHECK(!pending_read_); 160 DCHECK(!pending_read_);
152 DCHECK_EQ(state_, kPaused); 161 DCHECK_EQ(state_, kFlushed);
153 162
154 audio_buffer_stream_.Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, 163 audio_buffer_stream_.Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone,
155 weak_factory_.GetWeakPtr())); 164 weak_factory_.GetWeakPtr()));
156 } 165 }
157 166
158 void AudioRendererImpl::ResetDecoderDone() { 167 void AudioRendererImpl::ResetDecoderDone() {
159 DCHECK(task_runner_->BelongsToCurrentThread()); 168 DCHECK(task_runner_->BelongsToCurrentThread());
160 { 169 {
161 base::AutoLock auto_lock(lock_); 170 base::AutoLock auto_lock(lock_);
162 if (state_ == kStopped) 171 if (state_ == kStopped)
163 return; 172 return;
164 173
165 DCHECK_EQ(state_, kPaused); 174 DCHECK_EQ(state_, kFlushed);
166 DCHECK(!flush_cb_.is_null()); 175 DCHECK(!flush_cb_.is_null());
167 176
168 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate())); 177 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate()));
169 received_end_of_stream_ = false; 178 received_end_of_stream_ = false;
170 rendered_end_of_stream_ = false; 179 rendered_end_of_stream_ = false;
171 preroll_aborted_ = false; 180 preroll_aborted_ = false;
172 181
173 earliest_end_time_ = now_cb_.Run(); 182 earliest_end_time_ = now_cb_.Run();
174 splicer_->Reset(); 183 splicer_->Reset();
175 if (buffer_converter_) 184 if (buffer_converter_)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 217
209 audio_buffer_stream_.Stop(callback); 218 audio_buffer_stream_.Stop(callback);
210 } 219 }
211 220
212 void AudioRendererImpl::Preroll(base::TimeDelta time, 221 void AudioRendererImpl::Preroll(base::TimeDelta time,
213 const PipelineStatusCB& cb) { 222 const PipelineStatusCB& cb) {
214 DCHECK(task_runner_->BelongsToCurrentThread()); 223 DCHECK(task_runner_->BelongsToCurrentThread());
215 224
216 base::AutoLock auto_lock(lock_); 225 base::AutoLock auto_lock(lock_);
217 DCHECK(!sink_playing_); 226 DCHECK(!sink_playing_);
218 DCHECK_EQ(state_, kPaused); 227 DCHECK_EQ(state_, kFlushed);
219 DCHECK(!pending_read_) << "Pending read must complete before seeking"; 228 DCHECK(!pending_read_) << "Pending read must complete before seeking";
220 DCHECK(preroll_cb_.is_null()); 229 DCHECK(preroll_cb_.is_null());
221 230
222 ChangeState_Locked(kPrerolling); 231 ChangeState_Locked(kPrerolling);
223 preroll_cb_ = cb; 232 preroll_cb_ = cb;
224 preroll_timestamp_ = time; 233 preroll_timestamp_ = time;
225 234
226 AttemptRead_Locked(); 235 AttemptRead_Locked();
227 } 236 }
228 237
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 323
315 if (expecting_config_changes_) 324 if (expecting_config_changes_)
316 buffer_converter_.reset(new AudioBufferConverter(audio_parameters_)); 325 buffer_converter_.reset(new AudioBufferConverter(audio_parameters_));
317 splicer_.reset(new AudioSplicer(audio_parameters_.sample_rate())); 326 splicer_.reset(new AudioSplicer(audio_parameters_.sample_rate()));
318 327
319 // We're all good! Continue initializing the rest of the audio renderer 328 // We're all good! Continue initializing the rest of the audio renderer
320 // based on the decoder format. 329 // based on the decoder format.
321 algorithm_.reset(new AudioRendererAlgorithm()); 330 algorithm_.reset(new AudioRendererAlgorithm());
322 algorithm_->Initialize(0, audio_parameters_); 331 algorithm_->Initialize(0, audio_parameters_);
323 332
324 ChangeState_Locked(kPaused); 333 ChangeState_Locked(kFlushed);
325 334
326 HistogramRendererEvent(INITIALIZED); 335 HistogramRendererEvent(INITIALIZED);
327 336
328 { 337 {
329 base::AutoUnlock auto_unlock(lock_); 338 base::AutoUnlock auto_unlock(lock_);
330 sink_->Initialize(audio_parameters_, this); 339 sink_->Initialize(audio_parameters_, this);
331 sink_->Start(); 340 sink_->Start();
332 341
333 // Some sinks play on start... 342 // Some sinks play on start...
334 sink_->Pause(); 343 sink_->Pause();
(...skipping 23 matching lines...) Expand all
358 367
359 void AudioRendererImpl::SetVolume(float volume) { 368 void AudioRendererImpl::SetVolume(float volume) {
360 DCHECK(task_runner_->BelongsToCurrentThread()); 369 DCHECK(task_runner_->BelongsToCurrentThread());
361 DCHECK(sink_); 370 DCHECK(sink_);
362 sink_->SetVolume(volume); 371 sink_->SetVolume(volume);
363 } 372 }
364 373
365 void AudioRendererImpl::DecodedAudioReady( 374 void AudioRendererImpl::DecodedAudioReady(
366 AudioBufferStream::Status status, 375 AudioBufferStream::Status status,
367 const scoped_refptr<AudioBuffer>& buffer) { 376 const scoped_refptr<AudioBuffer>& buffer) {
368 DVLOG(1) << __FUNCTION__ << "(" << status << ")"; 377 DVLOG(2) << __FUNCTION__ << "(" << status << ")";
369 DCHECK(task_runner_->BelongsToCurrentThread()); 378 DCHECK(task_runner_->BelongsToCurrentThread());
370 379
371 base::AutoLock auto_lock(lock_); 380 base::AutoLock auto_lock(lock_);
372 DCHECK(state_ != kUninitialized); 381 DCHECK(state_ != kUninitialized);
373 382
374 CHECK(pending_read_); 383 CHECK(pending_read_);
375 pending_read_ = false; 384 pending_read_ = false;
376 385
377 if (status == AudioBufferStream::ABORTED || 386 if (status == AudioBufferStream::ABORTED ||
378 status == AudioBufferStream::DEMUXER_READ_ABORTED) { 387 status == AudioBufferStream::DEMUXER_READ_ABORTED) {
379 HandleAbortedReadOrDecodeError(false); 388 HandleAbortedReadOrDecodeError(false);
380 return; 389 return;
381 } 390 }
382 391
383 if (status == AudioBufferStream::DECODE_ERROR) { 392 if (status == AudioBufferStream::DECODE_ERROR) {
384 HandleAbortedReadOrDecodeError(true); 393 HandleAbortedReadOrDecodeError(true);
385 return; 394 return;
386 } 395 }
387 396
388 DCHECK_EQ(status, AudioBufferStream::OK); 397 DCHECK_EQ(status, AudioBufferStream::OK);
389 DCHECK(buffer.get()); 398 DCHECK(buffer.get());
390 399
391 if (state_ == kFlushing) { 400 if (state_ == kFlushing) {
392 ChangeState_Locked(kPaused); 401 ChangeState_Locked(kFlushed);
393 DoFlush_Locked(); 402 DoFlush_Locked();
394 return; 403 return;
395 } 404 }
396 405
397 if (expecting_config_changes_) { 406 if (expecting_config_changes_) {
398 DCHECK(buffer_converter_); 407 DCHECK(buffer_converter_);
399 buffer_converter_->AddInput(buffer); 408 buffer_converter_->AddInput(buffer);
400 while (buffer_converter_->HasNextBuffer()) { 409 while (buffer_converter_->HasNextBuffer()) {
401 if (!splicer_->AddInput(buffer_converter_->GetNextBuffer())) { 410 if (!splicer_->AddInput(buffer_converter_->GetNextBuffer())) {
402 HandleAbortedReadOrDecodeError(true); 411 HandleAbortedReadOrDecodeError(true);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 algorithm_->EnqueueBuffer(buffer); 465 algorithm_->EnqueueBuffer(buffer);
457 } 466 }
458 467
459 switch (state_) { 468 switch (state_) {
460 case kUninitialized: 469 case kUninitialized:
461 case kInitializing: 470 case kInitializing:
462 case kFlushing: 471 case kFlushing:
463 NOTREACHED(); 472 NOTREACHED();
464 return false; 473 return false;
465 474
466 case kPaused: 475 case kFlushed:
467 DCHECK(!pending_read_); 476 DCHECK(!pending_read_);
468 return false; 477 return false;
469 478
470 case kPrerolling: 479 case kPrerolling:
471 if (!buffer->end_of_stream() && !algorithm_->IsQueueFull()) 480 if (!buffer->end_of_stream() && !algorithm_->IsQueueFull())
472 return true; 481 return true;
473 ChangeState_Locked(kPaused); 482 ChangeState_Locked(kPlaying);
474 base::ResetAndReturn(&preroll_cb_).Run(PIPELINE_OK); 483 base::ResetAndReturn(&preroll_cb_).Run(PIPELINE_OK);
475 return false; 484 return false;
476 485
477 case kPlaying: 486 case kPlaying:
478 case kUnderflow: 487 case kUnderflow:
479 return false; 488 return false;
480 489
481 case kRebuffering: 490 case kRebuffering:
482 if (!algorithm_->IsQueueFull()) 491 if (!algorithm_->IsQueueFull())
483 return true; 492 return true;
(...skipping 22 matching lines...) Expand all
506 audio_buffer_stream_.Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, 515 audio_buffer_stream_.Read(base::Bind(&AudioRendererImpl::DecodedAudioReady,
507 weak_factory_.GetWeakPtr())); 516 weak_factory_.GetWeakPtr()));
508 } 517 }
509 518
510 bool AudioRendererImpl::CanRead_Locked() { 519 bool AudioRendererImpl::CanRead_Locked() {
511 lock_.AssertAcquired(); 520 lock_.AssertAcquired();
512 521
513 switch (state_) { 522 switch (state_) {
514 case kUninitialized: 523 case kUninitialized:
515 case kInitializing: 524 case kInitializing:
516 case kPaused: 525 case kFlushed:
517 case kFlushing: 526 case kFlushing:
518 case kStopped: 527 case kStopped:
519 return false; 528 return false;
520 529
521 case kPrerolling: 530 case kPrerolling:
522 case kPlaying: 531 case kPlaying:
523 case kUnderflow: 532 case kUnderflow:
524 case kRebuffering: 533 case kRebuffering:
525 break; 534 break;
526 } 535 }
527 536
528 return !pending_read_ && !received_end_of_stream_ && 537 return !pending_read_ && !received_end_of_stream_ &&
529 !algorithm_->IsQueueFull(); 538 !algorithm_->IsQueueFull();
530 } 539 }
531 540
532 void AudioRendererImpl::SetPlaybackRate(float playback_rate) { 541 void AudioRendererImpl::SetPlaybackRate(float playback_rate) {
533 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; 542 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")";
534 DCHECK(task_runner_->BelongsToCurrentThread()); 543 DCHECK(task_runner_->BelongsToCurrentThread());
535 DCHECK_GE(playback_rate, 0); 544 DCHECK_GE(playback_rate, 0);
536 DCHECK(sink_); 545 DCHECK(sink_);
537 546
538 base::AutoLock auto_lock(lock_); 547 base::AutoLock auto_lock(lock_);
539 548
540 // We have two cases here: 549 // We have two cases here:
541 // Play: current_playback_rate == 0 && playback_rate != 0 550 // Play: current_playback_rate == 0 && playback_rate != 0
542 // Pause: current_playback_rate != 0 && playback_rate == 0 551 // Pause: current_playback_rate != 0 && playback_rate == 0
543 float current_playback_rate = algorithm_->playback_rate(); 552 float current_playback_rate = algorithm_->playback_rate();
544 if (current_playback_rate == 0 && playback_rate != 0) 553 algorithm_->SetPlaybackRate(playback_rate);
545 DoPlay_Locked();
546 else if (current_playback_rate != 0 && playback_rate == 0)
547 DoPause_Locked();
548 554
549 algorithm_->SetPlaybackRate(playback_rate); 555 if (!rendering_)
556 return;
557
558 if (current_playback_rate == 0 && playback_rate != 0) {
559 StartRendering_Locked();
560 return;
561 }
562
563 if (current_playback_rate != 0 && playback_rate == 0) {
564 StopRendering_Locked();
565 return;
566 }
550 } 567 }
551 568
552 bool AudioRendererImpl::IsBeforePrerollTime( 569 bool AudioRendererImpl::IsBeforePrerollTime(
553 const scoped_refptr<AudioBuffer>& buffer) { 570 const scoped_refptr<AudioBuffer>& buffer) {
554 DCHECK_EQ(state_, kPrerolling); 571 DCHECK_EQ(state_, kPrerolling);
555 return buffer && !buffer->end_of_stream() && 572 return buffer && !buffer->end_of_stream() &&
556 (buffer->timestamp() + buffer->duration()) < preroll_timestamp_; 573 (buffer->timestamp() + buffer->duration()) < preroll_timestamp_;
557 } 574 }
558 575
559 int AudioRendererImpl::Render(AudioBus* audio_bus, 576 int AudioRendererImpl::Render(AudioBus* audio_bus,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 707
691 void AudioRendererImpl::HandleAbortedReadOrDecodeError(bool is_decode_error) { 708 void AudioRendererImpl::HandleAbortedReadOrDecodeError(bool is_decode_error) {
692 lock_.AssertAcquired(); 709 lock_.AssertAcquired();
693 710
694 PipelineStatus status = is_decode_error ? PIPELINE_ERROR_DECODE : PIPELINE_OK; 711 PipelineStatus status = is_decode_error ? PIPELINE_ERROR_DECODE : PIPELINE_OK;
695 switch (state_) { 712 switch (state_) {
696 case kUninitialized: 713 case kUninitialized:
697 case kInitializing: 714 case kInitializing:
698 NOTREACHED(); 715 NOTREACHED();
699 return; 716 return;
700 case kPaused:
701 if (status != PIPELINE_OK)
702 error_cb_.Run(status);
703 return;
704 case kFlushing: 717 case kFlushing:
705 ChangeState_Locked(kPaused); 718 ChangeState_Locked(kFlushed);
706 719
707 if (status == PIPELINE_OK) { 720 if (status == PIPELINE_OK) {
708 DoFlush_Locked(); 721 DoFlush_Locked();
709 return; 722 return;
710 } 723 }
711 724
712 error_cb_.Run(status); 725 error_cb_.Run(status);
713 base::ResetAndReturn(&flush_cb_).Run(); 726 base::ResetAndReturn(&flush_cb_).Run();
714 return; 727 return;
715 case kPrerolling: 728 case kPrerolling:
716 // This is a signal for abort if it's not an error. 729 // This is a signal for abort if it's not an error.
717 preroll_aborted_ = !is_decode_error; 730 preroll_aborted_ = !is_decode_error;
718 ChangeState_Locked(kPaused); 731 ChangeState_Locked(kPlaying);
719 base::ResetAndReturn(&preroll_cb_).Run(status); 732 base::ResetAndReturn(&preroll_cb_).Run(status);
720 return; 733 return;
734 case kFlushed:
721 case kPlaying: 735 case kPlaying:
722 case kUnderflow: 736 case kUnderflow:
723 case kRebuffering: 737 case kRebuffering:
724 case kStopped: 738 case kStopped:
725 if (status != PIPELINE_OK) 739 if (status != PIPELINE_OK)
726 error_cb_.Run(status); 740 error_cb_.Run(status);
727 return; 741 return;
728 } 742 }
729 } 743 }
730 744
(...skipping 13 matching lines...) Expand all
744 DCHECK(expecting_config_changes_); 758 DCHECK(expecting_config_changes_);
745 buffer_converter_->ResetTimestampState(); 759 buffer_converter_->ResetTimestampState();
746 // Drain flushed buffers from the converter so the AudioSplicer receives all 760 // Drain flushed buffers from the converter so the AudioSplicer receives all
747 // data ahead of any OnNewSpliceBuffer() calls. Since discontinuities should 761 // data ahead of any OnNewSpliceBuffer() calls. Since discontinuities should
748 // only appear after config changes, AddInput() should never fail here. 762 // only appear after config changes, AddInput() should never fail here.
749 while (buffer_converter_->HasNextBuffer()) 763 while (buffer_converter_->HasNextBuffer())
750 CHECK(splicer_->AddInput(buffer_converter_->GetNextBuffer())); 764 CHECK(splicer_->AddInput(buffer_converter_->GetNextBuffer()));
751 } 765 }
752 766
753 } // namespace media 767 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698