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 24 matching lines...) Expand all Loading... |
35 void HistogramRendererEvent(AudioRendererEvent event) { | 35 void HistogramRendererEvent(AudioRendererEvent event) { |
36 UMA_HISTOGRAM_ENUMERATION("Media.AudioRendererEvents", event, MAX_EVENTS); | 36 UMA_HISTOGRAM_ENUMERATION("Media.AudioRendererEvents", event, MAX_EVENTS); |
37 } | 37 } |
38 | 38 |
39 } // namespace | 39 } // namespace |
40 | 40 |
41 AudioRendererImpl::AudioRendererImpl( | 41 AudioRendererImpl::AudioRendererImpl( |
42 const scoped_refptr<base::MessageLoopProxy>& message_loop, | 42 const scoped_refptr<base::MessageLoopProxy>& message_loop, |
43 media::AudioRendererSink* sink, | 43 media::AudioRendererSink* sink, |
44 ScopedVector<AudioDecoder> decoders, | 44 ScopedVector<AudioDecoder> decoders, |
45 const SetDecryptorReadyCB& set_decryptor_ready_cb) | 45 const SetDecryptorReadyCB& set_decryptor_ready_cb, |
| 46 bool increase_preroll_on_underflow) |
46 : message_loop_(message_loop), | 47 : message_loop_(message_loop), |
47 weak_factory_(this), | 48 weak_factory_(this), |
48 sink_(sink), | 49 sink_(sink), |
49 decoder_selector_(new AudioDecoderSelector( | 50 decoder_selector_(new AudioDecoderSelector( |
50 message_loop, decoders.Pass(), set_decryptor_ready_cb)), | 51 message_loop, decoders.Pass(), set_decryptor_ready_cb)), |
51 now_cb_(base::Bind(&base::Time::Now)), | 52 now_cb_(base::Bind(&base::Time::Now)), |
52 state_(kUninitialized), | 53 state_(kUninitialized), |
53 sink_playing_(false), | 54 sink_playing_(false), |
54 pending_read_(false), | 55 pending_read_(false), |
55 received_end_of_stream_(false), | 56 received_end_of_stream_(false), |
56 rendered_end_of_stream_(false), | 57 rendered_end_of_stream_(false), |
57 audio_time_buffered_(kNoTimestamp()), | 58 audio_time_buffered_(kNoTimestamp()), |
58 current_time_(kNoTimestamp()), | 59 current_time_(kNoTimestamp()), |
59 underflow_disabled_(false), | 60 underflow_disabled_(false), |
| 61 increase_preroll_on_underflow_(increase_preroll_on_underflow), |
60 preroll_aborted_(false), | 62 preroll_aborted_(false), |
61 actual_frames_per_buffer_(0) { | 63 actual_frames_per_buffer_(0) { |
62 } | 64 } |
63 | 65 |
64 AudioRendererImpl::~AudioRendererImpl() { | 66 AudioRendererImpl::~AudioRendererImpl() { |
65 // Stop() should have been called and |algorithm_| should have been destroyed. | 67 // Stop() should have been called and |algorithm_| should have been destroyed. |
66 DCHECK(state_ == kUninitialized || state_ == kStopped); | 68 DCHECK(state_ == kUninitialized || state_ == kStopped); |
67 DCHECK(!algorithm_.get()); | 69 DCHECK(!algorithm_.get()); |
68 } | 70 } |
69 | 71 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 sink_->Initialize(audio_parameters_, weak_this_); | 279 sink_->Initialize(audio_parameters_, weak_this_); |
278 sink_->Start(); | 280 sink_->Start(); |
279 | 281 |
280 // Some sinks play on start... | 282 // Some sinks play on start... |
281 sink_->Pause(); | 283 sink_->Pause(); |
282 DCHECK(!sink_playing_); | 284 DCHECK(!sink_playing_); |
283 | 285 |
284 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); | 286 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
285 } | 287 } |
286 | 288 |
287 void AudioRendererImpl::ResumeAfterUnderflow(bool buffer_more_audio) { | 289 void AudioRendererImpl::ResumeAfterUnderflow() { |
288 DCHECK(message_loop_->BelongsToCurrentThread()); | 290 DCHECK(message_loop_->BelongsToCurrentThread()); |
289 base::AutoLock auto_lock(lock_); | 291 base::AutoLock auto_lock(lock_); |
290 if (state_ == kUnderflow) { | 292 if (state_ == kUnderflow) { |
291 // The "&& preroll_aborted_" is a hack. If preroll is aborted, then we | 293 // The "&& preroll_aborted_" is a hack. If preroll is aborted, then we |
292 // shouldn't even reach the kUnderflow state to begin with. But for now | 294 // shouldn't even reach the kUnderflow state to begin with. But for now |
293 // we're just making sure that the audio buffer capacity (i.e. the | 295 // we're just making sure that the audio buffer capacity (i.e. the |
294 // number of bytes that need to be buffered for preroll to complete) | 296 // number of bytes that need to be buffered for preroll to complete) |
295 // does not increase due to an aborted preroll. | 297 // does not increase due to an aborted preroll. |
296 // TODO(vrk): Fix this bug correctly! (crbug.com/151352) | 298 // TODO(vrk): Fix this bug correctly! (crbug.com/151352) |
297 if (buffer_more_audio && !preroll_aborted_) | 299 if (increase_preroll_on_underflow_ && !preroll_aborted_) |
298 algorithm_->IncreaseQueueCapacity(); | 300 algorithm_->IncreaseQueueCapacity(); |
299 | 301 |
300 state_ = kRebuffering; | 302 state_ = kRebuffering; |
301 } | 303 } |
302 } | 304 } |
303 | 305 |
304 void AudioRendererImpl::SetVolume(float volume) { | 306 void AudioRendererImpl::SetVolume(float volume) { |
305 DCHECK(message_loop_->BelongsToCurrentThread()); | 307 DCHECK(message_loop_->BelongsToCurrentThread()); |
306 DCHECK(sink_.get()); | 308 DCHECK(sink_.get()); |
307 sink_->SetVolume(volume); | 309 sink_->SetVolume(volume); |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 case kUnderflow: | 641 case kUnderflow: |
640 case kRebuffering: | 642 case kRebuffering: |
641 case kStopped: | 643 case kStopped: |
642 if (status != PIPELINE_OK) | 644 if (status != PIPELINE_OK) |
643 error_cb_.Run(status); | 645 error_cb_.Run(status); |
644 return; | 646 return; |
645 } | 647 } |
646 } | 648 } |
647 | 649 |
648 } // namespace media | 650 } // namespace media |
OLD | NEW |