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/renderers/audio_renderer_impl.h" | 5 #include "media/renderers/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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 media::AudioRendererSink* sink, | 45 media::AudioRendererSink* sink, |
46 ScopedVector<AudioDecoder> decoders, | 46 ScopedVector<AudioDecoder> decoders, |
47 const AudioHardwareConfig& hardware_config, | 47 const AudioHardwareConfig& hardware_config, |
48 const scoped_refptr<MediaLog>& media_log) | 48 const scoped_refptr<MediaLog>& media_log) |
49 : task_runner_(task_runner), | 49 : task_runner_(task_runner), |
50 expecting_config_changes_(false), | 50 expecting_config_changes_(false), |
51 sink_(sink), | 51 sink_(sink), |
52 audio_buffer_stream_( | 52 audio_buffer_stream_( |
53 new AudioBufferStream(task_runner, decoders.Pass(), media_log)), | 53 new AudioBufferStream(task_runner, decoders.Pass(), media_log)), |
54 hardware_config_(hardware_config), | 54 hardware_config_(hardware_config), |
55 playback_rate_(0), | 55 playback_rate_(0.0), |
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())); |
(...skipping 27 matching lines...) Expand all Loading... |
93 } | 93 } |
94 | 94 |
95 StartRendering_Locked(); | 95 StartRendering_Locked(); |
96 } | 96 } |
97 | 97 |
98 void AudioRendererImpl::StartRendering_Locked() { | 98 void AudioRendererImpl::StartRendering_Locked() { |
99 DVLOG(1) << __FUNCTION__; | 99 DVLOG(1) << __FUNCTION__; |
100 DCHECK(task_runner_->BelongsToCurrentThread()); | 100 DCHECK(task_runner_->BelongsToCurrentThread()); |
101 DCHECK_EQ(state_, kPlaying); | 101 DCHECK_EQ(state_, kPlaying); |
102 DCHECK(!sink_playing_); | 102 DCHECK(!sink_playing_); |
103 DCHECK_NE(playback_rate_, 0); | 103 DCHECK_NE(playback_rate_, 0.0); |
104 lock_.AssertAcquired(); | 104 lock_.AssertAcquired(); |
105 | 105 |
106 sink_playing_ = true; | 106 sink_playing_ = true; |
107 | 107 |
108 base::AutoUnlock auto_unlock(lock_); | 108 base::AutoUnlock auto_unlock(lock_); |
109 sink_->Play(); | 109 sink_->Play(); |
110 } | 110 } |
111 | 111 |
112 void AudioRendererImpl::StopTicking() { | 112 void AudioRendererImpl::StopTicking() { |
113 DVLOG(1) << __FUNCTION__; | 113 DVLOG(1) << __FUNCTION__; |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 return false; | 528 return false; |
529 | 529 |
530 case kPlaying: | 530 case kPlaying: |
531 break; | 531 break; |
532 } | 532 } |
533 | 533 |
534 return !pending_read_ && !received_end_of_stream_ && | 534 return !pending_read_ && !received_end_of_stream_ && |
535 !algorithm_->IsQueueFull(); | 535 !algorithm_->IsQueueFull(); |
536 } | 536 } |
537 | 537 |
538 void AudioRendererImpl::SetPlaybackRate(float playback_rate) { | 538 void AudioRendererImpl::SetPlaybackRate(double playback_rate) { |
539 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; | 539 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; |
540 DCHECK(task_runner_->BelongsToCurrentThread()); | 540 DCHECK(task_runner_->BelongsToCurrentThread()); |
541 DCHECK_GE(playback_rate, 0); | 541 DCHECK_GE(playback_rate, 0); |
542 DCHECK(sink_.get()); | 542 DCHECK(sink_.get()); |
543 | 543 |
544 base::AutoLock auto_lock(lock_); | 544 base::AutoLock auto_lock(lock_); |
545 | 545 |
546 // We have two cases here: | 546 // We have two cases here: |
547 // Play: current_playback_rate == 0 && playback_rate != 0 | 547 // Play: current_playback_rate == 0 && playback_rate != 0 |
548 // Pause: current_playback_rate != 0 && playback_rate == 0 | 548 // Pause: current_playback_rate != 0 && playback_rate == 0 |
549 float current_playback_rate = playback_rate_; | 549 double current_playback_rate = playback_rate_; |
550 playback_rate_ = playback_rate; | 550 playback_rate_ = playback_rate; |
551 | 551 |
552 if (!rendering_) | 552 if (!rendering_) |
553 return; | 553 return; |
554 | 554 |
555 if (current_playback_rate == 0 && playback_rate != 0) { | 555 if (current_playback_rate == 0 && playback_rate != 0) { |
556 StartRendering_Locked(); | 556 StartRendering_Locked(); |
557 return; | 557 return; |
558 } | 558 } |
559 | 559 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 << buffering_state; | 750 << buffering_state; |
751 DCHECK_NE(buffering_state_, buffering_state); | 751 DCHECK_NE(buffering_state_, buffering_state); |
752 lock_.AssertAcquired(); | 752 lock_.AssertAcquired(); |
753 buffering_state_ = buffering_state; | 753 buffering_state_ = buffering_state; |
754 | 754 |
755 task_runner_->PostTask(FROM_HERE, | 755 task_runner_->PostTask(FROM_HERE, |
756 base::Bind(buffering_state_cb_, buffering_state_)); | 756 base::Bind(buffering_state_cb_, buffering_state_)); |
757 } | 757 } |
758 | 758 |
759 } // namespace media | 759 } // namespace media |
OLD | NEW |