Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 30 matching lines...) Expand all Loading... | |
| 41 } // namespace | 41 } // namespace |
| 42 | 42 |
| 43 AudioRendererImpl::AudioRendererImpl( | 43 AudioRendererImpl::AudioRendererImpl( |
| 44 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 44 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 45 media::AudioRendererSink* sink, | 45 media::AudioRendererSink* sink, |
| 46 ScopedVector<AudioDecoder> decoders, | 46 ScopedVector<AudioDecoder> decoders, |
| 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_(new AudioBufferStream(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 buffering_state_(BUFFERING_HAVE_NOTHING), | 57 buffering_state_(BUFFERING_HAVE_NOTHING), |
| 58 rendering_(false), | 58 rendering_(false), |
| 59 sink_playing_(false), | 59 sink_playing_(false), |
| 60 pending_read_(false), | 60 pending_read_(false), |
| 61 received_end_of_stream_(false), | 61 received_end_of_stream_(false), |
| 62 rendered_end_of_stream_(false), | 62 rendered_end_of_stream_(false), |
| 63 weak_factory_(this) { | 63 weak_factory_(this) { |
| 64 audio_buffer_stream_.set_splice_observer(base::Bind( | 64 audio_buffer_stream_->set_splice_observer(base::Bind( |
| 65 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); | 65 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); |
| 66 audio_buffer_stream_.set_config_change_observer(base::Bind( | 66 audio_buffer_stream_->set_config_change_observer(base::Bind( |
| 67 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); | 67 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); |
| 68 } | 68 } |
| 69 | 69 |
| 70 AudioRendererImpl::~AudioRendererImpl() { | 70 AudioRendererImpl::~AudioRendererImpl() { |
| 71 // Stop() should have been called and |algorithm_| should have been destroyed. | 71 // Stop() should have been called and |algorithm_| should have been destroyed. |
| 72 DCHECK(state_ == kUninitialized || state_ == kStopped); | 72 DCHECK(state_ == kUninitialized || state_ == kStopped); |
| 73 DCHECK(!algorithm_.get()); | 73 DCHECK(!algorithm_.get()); |
| 74 } | 74 } |
| 75 | 75 |
| 76 void AudioRendererImpl::StartRendering() { | 76 void AudioRendererImpl::StartRendering() { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 DoFlush_Locked(); | 149 DoFlush_Locked(); |
| 150 } | 150 } |
| 151 | 151 |
| 152 void AudioRendererImpl::DoFlush_Locked() { | 152 void AudioRendererImpl::DoFlush_Locked() { |
| 153 DCHECK(task_runner_->BelongsToCurrentThread()); | 153 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 154 lock_.AssertAcquired(); | 154 lock_.AssertAcquired(); |
| 155 | 155 |
| 156 DCHECK(!pending_read_); | 156 DCHECK(!pending_read_); |
| 157 DCHECK_EQ(state_, kFlushed); | 157 DCHECK_EQ(state_, kFlushed); |
| 158 | 158 |
| 159 audio_buffer_stream_.Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, | 159 audio_buffer_stream_->Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, |
| 160 weak_factory_.GetWeakPtr())); | 160 weak_factory_.GetWeakPtr())); |
| 161 } | 161 } |
| 162 | 162 |
| 163 void AudioRendererImpl::ResetDecoderDone() { | 163 void AudioRendererImpl::ResetDecoderDone() { |
| 164 DCHECK(task_runner_->BelongsToCurrentThread()); | 164 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 165 { | 165 { |
| 166 base::AutoLock auto_lock(lock_); | 166 base::AutoLock auto_lock(lock_); |
| 167 if (state_ == kStopped) | 167 if (state_ == kStopped) |
| 168 return; | 168 return; |
| 169 | 169 |
| 170 DCHECK_EQ(state_, kFlushed); | 170 DCHECK_EQ(state_, kFlushed); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 algorithm_.reset(); | 209 algorithm_.reset(); |
| 210 time_cb_.Reset(); | 210 time_cb_.Reset(); |
| 211 flush_cb_.Reset(); | 211 flush_cb_.Reset(); |
| 212 } | 212 } |
| 213 | 213 |
| 214 if (sink_) { | 214 if (sink_) { |
| 215 sink_->Stop(); | 215 sink_->Stop(); |
| 216 sink_ = NULL; | 216 sink_ = NULL; |
| 217 } | 217 } |
| 218 | 218 |
| 219 audio_buffer_stream_.Stop(callback); | 219 audio_buffer_stream_.reset(); |
|
scherkus (not reviewing)
2014/07/16 17:49:48
will we be getting rid of Audio/VideoRenderer::Sto
xhwang
2014/07/16 23:45:49
Yes, that's the plan. I'd like to do the transitio
| |
| 220 task_runner_->PostTask(FROM_HERE, callback); | |
| 220 } | 221 } |
| 221 | 222 |
| 222 void AudioRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { | 223 void AudioRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { |
| 223 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InMicroseconds() << ")"; | 224 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InMicroseconds() << ")"; |
| 224 DCHECK(task_runner_->BelongsToCurrentThread()); | 225 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 225 | 226 |
| 226 base::AutoLock auto_lock(lock_); | 227 base::AutoLock auto_lock(lock_); |
| 227 DCHECK(!sink_playing_); | 228 DCHECK(!sink_playing_); |
| 228 DCHECK_EQ(state_, kFlushed); | 229 DCHECK_EQ(state_, kFlushed); |
| 229 DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); | 230 DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 ChannelLayoutToChannelCount( | 291 ChannelLayoutToChannelCount( |
| 291 stream->audio_decoder_config().channel_layout()), | 292 stream->audio_decoder_config().channel_layout()), |
| 292 hw_params.input_channels(), | 293 hw_params.input_channels(), |
| 293 hw_params.sample_rate(), | 294 hw_params.sample_rate(), |
| 294 hw_params.bits_per_sample(), | 295 hw_params.bits_per_sample(), |
| 295 hardware_config_->GetHighLatencyBufferSize()); | 296 hardware_config_->GetHighLatencyBufferSize()); |
| 296 } | 297 } |
| 297 | 298 |
| 298 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate())); | 299 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate())); |
| 299 | 300 |
| 300 audio_buffer_stream_.Initialize( | 301 audio_buffer_stream_->Initialize( |
| 301 stream, | 302 stream, |
| 302 false, | 303 false, |
| 303 statistics_cb, | 304 statistics_cb, |
| 304 base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, | 305 base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |
| 305 weak_factory_.GetWeakPtr())); | 306 weak_factory_.GetWeakPtr())); |
| 306 } | 307 } |
| 307 | 308 |
| 308 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { | 309 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
| 309 DCHECK(task_runner_->BelongsToCurrentThread()); | 310 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 310 | 311 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 480 } | 481 } |
| 481 | 482 |
| 482 void AudioRendererImpl::AttemptRead_Locked() { | 483 void AudioRendererImpl::AttemptRead_Locked() { |
| 483 DCHECK(task_runner_->BelongsToCurrentThread()); | 484 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 484 lock_.AssertAcquired(); | 485 lock_.AssertAcquired(); |
| 485 | 486 |
| 486 if (!CanRead_Locked()) | 487 if (!CanRead_Locked()) |
| 487 return; | 488 return; |
| 488 | 489 |
| 489 pending_read_ = true; | 490 pending_read_ = true; |
| 490 audio_buffer_stream_.Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, | 491 audio_buffer_stream_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, |
| 491 weak_factory_.GetWeakPtr())); | 492 weak_factory_.GetWeakPtr())); |
| 492 } | 493 } |
| 493 | 494 |
| 494 bool AudioRendererImpl::CanRead_Locked() { | 495 bool AudioRendererImpl::CanRead_Locked() { |
| 495 lock_.AssertAcquired(); | 496 lock_.AssertAcquired(); |
| 496 | 497 |
| 497 switch (state_) { | 498 switch (state_) { |
| 498 case kUninitialized: | 499 case kUninitialized: |
| 499 case kInitializing: | 500 case kInitializing: |
| 500 case kFlushing: | 501 case kFlushing: |
| 501 case kFlushed: | 502 case kFlushed: |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 700 << buffering_state; | 701 << buffering_state; |
| 701 DCHECK_NE(buffering_state_, buffering_state); | 702 DCHECK_NE(buffering_state_, buffering_state); |
| 702 lock_.AssertAcquired(); | 703 lock_.AssertAcquired(); |
| 703 buffering_state_ = buffering_state; | 704 buffering_state_ = buffering_state; |
| 704 | 705 |
| 705 task_runner_->PostTask(FROM_HERE, | 706 task_runner_->PostTask(FROM_HERE, |
| 706 base::Bind(buffering_state_cb_, buffering_state_)); | 707 base::Bind(buffering_state_cb_, buffering_state_)); |
| 707 } | 708 } |
| 708 | 709 |
| 709 } // namespace media | 710 } // namespace media |
| OLD | NEW |