| 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 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 ScopedVector<AudioDecoder> decoders, | 39 ScopedVector<AudioDecoder> decoders, |
| 40 const scoped_refptr<MediaLog>& media_log) | 40 const scoped_refptr<MediaLog>& media_log) |
| 41 : task_runner_(task_runner), | 41 : task_runner_(task_runner), |
| 42 expecting_config_changes_(false), | 42 expecting_config_changes_(false), |
| 43 sink_(sink), | 43 sink_(sink), |
| 44 audio_buffer_stream_( | 44 audio_buffer_stream_( |
| 45 new AudioBufferStream(task_runner, std::move(decoders), media_log)), | 45 new AudioBufferStream(task_runner, std::move(decoders), media_log)), |
| 46 media_log_(media_log), | 46 media_log_(media_log), |
| 47 client_(nullptr), | 47 client_(nullptr), |
| 48 tick_clock_(new base::DefaultTickClock()), | 48 tick_clock_(new base::DefaultTickClock()), |
| 49 bytes_decoded_(0), |
| 49 last_audio_memory_usage_(0), | 50 last_audio_memory_usage_(0), |
| 50 last_decoded_sample_rate_(0), | 51 last_decoded_sample_rate_(0), |
| 51 playback_rate_(0.0), | 52 playback_rate_(0.0), |
| 52 state_(kUninitialized), | 53 state_(kUninitialized), |
| 53 buffering_state_(BUFFERING_HAVE_NOTHING), | 54 buffering_state_(BUFFERING_HAVE_NOTHING), |
| 54 rendering_(false), | 55 rendering_(false), |
| 55 sink_playing_(false), | 56 sink_playing_(false), |
| 56 pending_read_(false), | 57 pending_read_(false), |
| 57 received_end_of_stream_(false), | 58 received_end_of_stream_(false), |
| 58 rendered_end_of_stream_(false), | 59 rendered_end_of_stream_(false), |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 AudioHardwareConfig::GetHighLatencyBufferSize( | 438 AudioHardwareConfig::GetHighLatencyBufferSize( |
| 438 sample_rate, preferred_buffer_size)); | 439 sample_rate, preferred_buffer_size)); |
| 439 } | 440 } |
| 440 | 441 |
| 441 audio_clock_.reset( | 442 audio_clock_.reset( |
| 442 new AudioClock(base::TimeDelta(), audio_parameters_.sample_rate())); | 443 new AudioClock(base::TimeDelta(), audio_parameters_.sample_rate())); |
| 443 | 444 |
| 444 audio_buffer_stream_->Initialize( | 445 audio_buffer_stream_->Initialize( |
| 445 stream, base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, | 446 stream, base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |
| 446 weak_factory_.GetWeakPtr()), | 447 weak_factory_.GetWeakPtr()), |
| 447 cdm_context, base::Bind(&AudioRendererImpl::OnStatisticsUpdate, | 448 cdm_context, |
| 448 weak_factory_.GetWeakPtr()), | 449 base::Bind(&AudioRendererImpl::BytesDecoded, weak_factory_.GetWeakPtr()), |
| 449 base::Bind(&AudioRendererImpl::OnWaitingForDecryptionKey, | 450 base::Bind(&AudioRendererImpl::OnWaitingForDecryptionKey, |
| 450 weak_factory_.GetWeakPtr())); | 451 weak_factory_.GetWeakPtr())); |
| 451 } | 452 } |
| 452 | 453 |
| 453 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { | 454 void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
| 454 DVLOG(1) << __FUNCTION__ << ": " << success; | 455 DVLOG(1) << __FUNCTION__ << ": " << success; |
| 455 DCHECK(task_runner_->BelongsToCurrentThread()); | 456 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 456 | 457 |
| 457 base::AutoLock auto_lock(lock_); | 458 base::AutoLock auto_lock(lock_); |
| 458 | 459 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 void AudioRendererImpl::OnSuspend() { | 529 void AudioRendererImpl::OnSuspend() { |
| 529 base::AutoLock auto_lock(lock_); | 530 base::AutoLock auto_lock(lock_); |
| 530 is_suspending_ = true; | 531 is_suspending_ = true; |
| 531 } | 532 } |
| 532 | 533 |
| 533 void AudioRendererImpl::OnResume() { | 534 void AudioRendererImpl::OnResume() { |
| 534 base::AutoLock auto_lock(lock_); | 535 base::AutoLock auto_lock(lock_); |
| 535 is_suspending_ = false; | 536 is_suspending_ = false; |
| 536 } | 537 } |
| 537 | 538 |
| 539 void AudioRendererImpl::BytesDecoded(uint64_t bytes) { |
| 540 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 541 base::AutoLock auto_lock(lock_); |
| 542 |
| 543 bytes_decoded_ += bytes; |
| 544 } |
| 545 |
| 538 void AudioRendererImpl::DecodedAudioReady( | 546 void AudioRendererImpl::DecodedAudioReady( |
| 539 AudioBufferStream::Status status, | 547 AudioBufferStream::Status status, |
| 540 const scoped_refptr<AudioBuffer>& buffer) { | 548 const scoped_refptr<AudioBuffer>& buffer) { |
| 541 DVLOG(2) << __FUNCTION__ << "(" << status << ")"; | 549 DVLOG(2) << __FUNCTION__ << "(" << status << ")"; |
| 542 DCHECK(task_runner_->BelongsToCurrentThread()); | 550 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 543 | 551 |
| 544 base::AutoLock auto_lock(lock_); | 552 base::AutoLock auto_lock(lock_); |
| 545 DCHECK(state_ != kUninitialized); | 553 DCHECK(state_ != kUninitialized); |
| 546 | 554 |
| 547 CHECK(pending_read_); | 555 CHECK(pending_read_); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 algorithm_->EnqueueBuffer(buffer); | 662 algorithm_->EnqueueBuffer(buffer); |
| 655 } | 663 } |
| 656 | 664 |
| 657 // Store the timestamp of the first packet so we know when to start actual | 665 // Store the timestamp of the first packet so we know when to start actual |
| 658 // audio playback. | 666 // audio playback. |
| 659 if (first_packet_timestamp_ == kNoTimestamp()) | 667 if (first_packet_timestamp_ == kNoTimestamp()) |
| 660 first_packet_timestamp_ = buffer->timestamp(); | 668 first_packet_timestamp_ = buffer->timestamp(); |
| 661 | 669 |
| 662 const size_t memory_usage = algorithm_->GetMemoryUsage(); | 670 const size_t memory_usage = algorithm_->GetMemoryUsage(); |
| 663 PipelineStatistics stats; | 671 PipelineStatistics stats; |
| 672 stats.audio_bytes_decoded = bytes_decoded_; |
| 664 stats.audio_memory_usage = memory_usage - last_audio_memory_usage_; | 673 stats.audio_memory_usage = memory_usage - last_audio_memory_usage_; |
| 674 bytes_decoded_ = 0; |
| 665 last_audio_memory_usage_ = memory_usage; | 675 last_audio_memory_usage_ = memory_usage; |
| 666 task_runner_->PostTask(FROM_HERE, | 676 task_runner_->PostTask(FROM_HERE, |
| 667 base::Bind(&AudioRendererImpl::OnStatisticsUpdate, | 677 base::Bind(&AudioRendererImpl::OnStatisticsUpdate, |
| 668 weak_factory_.GetWeakPtr(), stats)); | 678 weak_factory_.GetWeakPtr(), stats)); |
| 669 | 679 |
| 670 switch (state_) { | 680 switch (state_) { |
| 671 case kUninitialized: | 681 case kUninitialized: |
| 672 case kInitializing: | 682 case kInitializing: |
| 673 case kFlushing: | 683 case kFlushing: |
| 674 NOTREACHED(); | 684 NOTREACHED(); |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 959 DCHECK_NE(buffering_state_, buffering_state); | 969 DCHECK_NE(buffering_state_, buffering_state); |
| 960 lock_.AssertAcquired(); | 970 lock_.AssertAcquired(); |
| 961 buffering_state_ = buffering_state; | 971 buffering_state_ = buffering_state; |
| 962 | 972 |
| 963 task_runner_->PostTask( | 973 task_runner_->PostTask( |
| 964 FROM_HERE, base::Bind(&AudioRendererImpl::OnBufferingStateChange, | 974 FROM_HERE, base::Bind(&AudioRendererImpl::OnBufferingStateChange, |
| 965 weak_factory_.GetWeakPtr(), buffering_state_)); | 975 weak_factory_.GetWeakPtr(), buffering_state_)); |
| 966 } | 976 } |
| 967 | 977 |
| 968 } // namespace media | 978 } // namespace media |
| OLD | NEW |