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 |