Chromium Code Reviews| Index: media/filters/audio_renderer_impl.cc |
| diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
| index f9b314d2ec2536ff43b18fd15ae2db222f61a4a0..e62a0d4547844e2862d1b9df3809d3783a8b4d74 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -162,26 +162,46 @@ void AudioRendererImpl::ResetDecoder() { |
| } |
| void AudioRendererImpl::ResetDecoderDone() { |
| - base::AutoLock auto_lock(lock_); |
| - if (state_ == kStopped) |
| - return; |
| - |
| - DCHECK_EQ(state_, kPaused); |
| - DCHECK(!flush_cb_.is_null()); |
| + { |
| + base::AutoLock auto_lock(lock_); |
| + if (state_ == kStopped) |
| + return; |
| - audio_time_buffered_ = kNoTimestamp(); |
| - current_time_ = kNoTimestamp(); |
| - received_end_of_stream_ = false; |
| - rendered_end_of_stream_ = false; |
| - preroll_aborted_ = false; |
| + DCHECK_EQ(state_, kPaused); |
| + DCHECK(!flush_cb_.is_null()); |
| - earliest_end_time_ = now_cb_.Run(); |
| - splicer_->Reset(); |
| - algorithm_->FlushBuffers(); |
| + audio_time_buffered_ = kNoTimestamp(); |
| + current_time_ = kNoTimestamp(); |
| + received_end_of_stream_ = false; |
| + rendered_end_of_stream_ = false; |
| + preroll_aborted_ = false; |
| + earliest_end_time_ = now_cb_.Run(); |
| + splicer_->Reset(); |
| + algorithm_->FlushBuffers(); |
| + } |
| base::ResetAndReturn(&flush_cb_).Run(); |
| } |
| +void AudioRendererImpl::StopDecoderDone() { |
| + { |
|
DaleCurtis
2014/01/09 23:04:21
Both ***Done() methods should have DCHECK(task_run
|
| + base::AutoLock auto_lock(lock_); |
| + if (state_ == kStopped) |
| + return; |
| + |
| + DCHECK(!stop_cb_.is_null()); |
| + DCHECK(init_cb_.is_null()); |
| + |
| + ChangeState_Locked(kStopped); |
| + algorithm_.reset(); |
| + init_cb_.Reset(); |
| + underflow_cb_.Reset(); |
| + time_cb_.Reset(); |
| + flush_cb_.Reset(); |
| + } |
| + base::ResetAndReturn(&stop_cb_).Run(); |
| +} |
| + |
| void AudioRendererImpl::Stop(const base::Closure& callback) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DCHECK(!callback.is_null()); |
| @@ -194,17 +214,16 @@ void AudioRendererImpl::Stop(const base::Closure& callback) { |
| sink_ = NULL; |
| } |
| - { |
| - base::AutoLock auto_lock(lock_); |
| - ChangeState_Locked(kStopped); |
| - algorithm_.reset(NULL); |
| - init_cb_.Reset(); |
| - underflow_cb_.Reset(); |
| - time_cb_.Reset(); |
| - flush_cb_.Reset(); |
| + stop_cb_ = callback; |
| + |
| + if (decoder_) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + decoder_->Stop(BindToCurrentLoop( |
| + base::Bind(&AudioRendererImpl::StopDecoderDone, weak_this_))); |
| + return; |
| } |
| - callback.Run(); |
| + StopDecoderDone(); |
| } |
| void AudioRendererImpl::Preroll(base::TimeDelta time, |