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 state_(kUninitialized), | 55 state_(kUninitialized), |
56 buffering_state_(BUFFERING_HAVE_NOTHING), | 56 buffering_state_(BUFFERING_HAVE_NOTHING), |
57 rendering_(false), | 57 rendering_(false), |
58 sink_playing_(false), | 58 sink_playing_(false), |
59 pending_read_(false), | 59 pending_read_(false), |
60 received_end_of_stream_(false), | 60 received_end_of_stream_(false), |
61 rendered_end_of_stream_(false), | 61 rendered_end_of_stream_(false), |
62 weak_factory_(this) { | 62 weak_factory_(this) { |
63 audio_buffer_stream_.set_splice_observer(base::Bind( | 63 audio_buffer_stream_->set_splice_observer(base::Bind( |
64 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); | 64 &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); |
65 audio_buffer_stream_.set_config_change_observer(base::Bind( | 65 audio_buffer_stream_->set_config_change_observer(base::Bind( |
66 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); | 66 &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); |
67 } | 67 } |
68 | 68 |
69 AudioRendererImpl::~AudioRendererImpl() { | 69 AudioRendererImpl::~AudioRendererImpl() { |
70 // Stop() should have been called and |algorithm_| should have been destroyed. | 70 // Stop() should have been called and |algorithm_| should have been destroyed. |
71 DCHECK(state_ == kUninitialized || state_ == kStopped); | 71 DCHECK(state_ == kUninitialized || state_ == kStopped); |
72 DCHECK(!algorithm_.get()); | 72 DCHECK(!algorithm_.get()); |
73 } | 73 } |
74 | 74 |
75 void AudioRendererImpl::StartRendering() { | 75 void AudioRendererImpl::StartRendering() { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 DoFlush_Locked(); | 148 DoFlush_Locked(); |
149 } | 149 } |
150 | 150 |
151 void AudioRendererImpl::DoFlush_Locked() { | 151 void AudioRendererImpl::DoFlush_Locked() { |
152 DCHECK(task_runner_->BelongsToCurrentThread()); | 152 DCHECK(task_runner_->BelongsToCurrentThread()); |
153 lock_.AssertAcquired(); | 153 lock_.AssertAcquired(); |
154 | 154 |
155 DCHECK(!pending_read_); | 155 DCHECK(!pending_read_); |
156 DCHECK_EQ(state_, kFlushed); | 156 DCHECK_EQ(state_, kFlushed); |
157 | 157 |
158 audio_buffer_stream_.Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, | 158 audio_buffer_stream_->Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, |
159 weak_factory_.GetWeakPtr())); | 159 weak_factory_.GetWeakPtr())); |
160 } | 160 } |
161 | 161 |
162 void AudioRendererImpl::ResetDecoderDone() { | 162 void AudioRendererImpl::ResetDecoderDone() { |
163 DCHECK(task_runner_->BelongsToCurrentThread()); | 163 DCHECK(task_runner_->BelongsToCurrentThread()); |
164 { | 164 { |
165 base::AutoLock auto_lock(lock_); | 165 base::AutoLock auto_lock(lock_); |
166 if (state_ == kStopped) | 166 if (state_ == kStopped) |
167 return; | 167 return; |
168 | 168 |
169 DCHECK_EQ(state_, kFlushed); | 169 DCHECK_EQ(state_, kFlushed); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 algorithm_.reset(); | 208 algorithm_.reset(); |
209 time_cb_.Reset(); | 209 time_cb_.Reset(); |
210 flush_cb_.Reset(); | 210 flush_cb_.Reset(); |
211 } | 211 } |
212 | 212 |
213 if (sink_) { | 213 if (sink_) { |
214 sink_->Stop(); | 214 sink_->Stop(); |
215 sink_ = NULL; | 215 sink_ = NULL; |
216 } | 216 } |
217 | 217 |
218 audio_buffer_stream_.Stop(callback); | 218 audio_buffer_stream_.reset(); |
| 219 task_runner_->PostTask(FROM_HERE, callback); |
219 } | 220 } |
220 | 221 |
221 void AudioRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { | 222 void AudioRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { |
222 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InMicroseconds() << ")"; | 223 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InMicroseconds() << ")"; |
223 DCHECK(task_runner_->BelongsToCurrentThread()); | 224 DCHECK(task_runner_->BelongsToCurrentThread()); |
224 | 225 |
225 base::AutoLock auto_lock(lock_); | 226 base::AutoLock auto_lock(lock_); |
226 DCHECK(!sink_playing_); | 227 DCHECK(!sink_playing_); |
227 DCHECK_EQ(state_, kFlushed); | 228 DCHECK_EQ(state_, kFlushed); |
228 DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); | 229 DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 ChannelLayoutToChannelCount( | 290 ChannelLayoutToChannelCount( |
290 stream->audio_decoder_config().channel_layout()), | 291 stream->audio_decoder_config().channel_layout()), |
291 hw_params.input_channels(), | 292 hw_params.input_channels(), |
292 hw_params.sample_rate(), | 293 hw_params.sample_rate(), |
293 hw_params.bits_per_sample(), | 294 hw_params.bits_per_sample(), |
294 hardware_config_->GetHighLatencyBufferSize()); | 295 hardware_config_->GetHighLatencyBufferSize()); |
295 } | 296 } |
296 | 297 |
297 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate())); | 298 audio_clock_.reset(new AudioClock(audio_parameters_.sample_rate())); |
298 | 299 |
299 audio_buffer_stream_.Initialize( | 300 audio_buffer_stream_->Initialize( |
300 stream, | 301 stream, |
301 false, | 302 false, |
302 statistics_cb, | 303 statistics_cb, |
303 base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, | 304 base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |
304 weak_factory_.GetWeakPtr())); | 305 weak_factory_.GetWeakPtr())); |
305 } | 306 } |
306 | 307 |
307 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { | 308 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
308 DCHECK(task_runner_->BelongsToCurrentThread()); | 309 DCHECK(task_runner_->BelongsToCurrentThread()); |
309 | 310 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 } | 480 } |
480 | 481 |
481 void AudioRendererImpl::AttemptRead_Locked() { | 482 void AudioRendererImpl::AttemptRead_Locked() { |
482 DCHECK(task_runner_->BelongsToCurrentThread()); | 483 DCHECK(task_runner_->BelongsToCurrentThread()); |
483 lock_.AssertAcquired(); | 484 lock_.AssertAcquired(); |
484 | 485 |
485 if (!CanRead_Locked()) | 486 if (!CanRead_Locked()) |
486 return; | 487 return; |
487 | 488 |
488 pending_read_ = true; | 489 pending_read_ = true; |
489 audio_buffer_stream_.Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, | 490 audio_buffer_stream_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, |
490 weak_factory_.GetWeakPtr())); | 491 weak_factory_.GetWeakPtr())); |
491 } | 492 } |
492 | 493 |
493 bool AudioRendererImpl::CanRead_Locked() { | 494 bool AudioRendererImpl::CanRead_Locked() { |
494 lock_.AssertAcquired(); | 495 lock_.AssertAcquired(); |
495 | 496 |
496 switch (state_) { | 497 switch (state_) { |
497 case kUninitialized: | 498 case kUninitialized: |
498 case kInitializing: | 499 case kInitializing: |
499 case kFlushing: | 500 case kFlushing: |
500 case kFlushed: | 501 case kFlushed: |
(...skipping 199 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 |