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

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

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

Powered by Google App Engine
This is Rietveld 408576698