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..09d6fef14d6167bbf1f065470ca65b6d7ece44b1 100644 |
--- a/media/filters/audio_renderer_impl.cc |
+++ b/media/filters/audio_renderer_impl.cc |
@@ -162,26 +162,48 @@ void AudioRendererImpl::ResetDecoder() { |
} |
void AudioRendererImpl::ResetDecoderDone() { |
- base::AutoLock auto_lock(lock_); |
if (state_ == kStopped) |
DaleCurtis
2014/01/09 01:24:49
State must be checked under lock; it can be change
|
return; |
DCHECK_EQ(state_, kPaused); |
DCHECK(!flush_cb_.is_null()); |
- 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::AutoLock auto_lock(lock_); |
+ 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() { |
+ if (state_ == kStopped) |
+ return; |
+ |
+ DCHECK(!stop_cb_.is_null()); |
+ DCHECK(init_cb_.is_null()); |
+ |
+ { |
+ base::AutoLock auto_lock(lock_); |
+ 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 +216,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, |