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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 // 3) We haven't already signalled that we've ended | 581 // 3) We haven't already signalled that we've ended |
582 // 4) We've played all known audio data sent to hardware | 582 // 4) We've played all known audio data sent to hardware |
583 // | 583 // |
584 // We use the following conditions to determine underflow: | 584 // We use the following conditions to determine underflow: |
585 // 1) Algorithm can not fill the audio callback buffer | 585 // 1) Algorithm can not fill the audio callback buffer |
586 // 2) We have NOT received an end of stream buffer | 586 // 2) We have NOT received an end of stream buffer |
587 // 3) We are in the kPlaying state | 587 // 3) We are in the kPlaying state |
588 // | 588 // |
589 // Otherwise the buffer has data we can send to the device. | 589 // Otherwise the buffer has data we can send to the device. |
590 const base::TimeDelta media_timestamp_before_filling = | 590 const base::TimeDelta media_timestamp_before_filling = |
591 audio_clock_->CurrentMediaTimestamp(); | 591 audio_clock_->CurrentMediaTimestamp(base::TimeDelta()); |
592 if (algorithm_->frames_buffered() > 0) { | 592 if (algorithm_->frames_buffered() > 0) { |
593 frames_written = algorithm_->FillBuffer(audio_bus, requested_frames); | 593 frames_written = algorithm_->FillBuffer(audio_bus, requested_frames); |
594 audio_clock_->WroteAudio( | 594 audio_clock_->WroteAudio( |
595 frames_written, delay_frames, playback_rate, algorithm_->GetTime()); | 595 frames_written, delay_frames, playback_rate, algorithm_->GetTime()); |
596 } | 596 } |
597 audio_clock_->WroteSilence(requested_frames - frames_written, delay_frames); | 597 audio_clock_->WroteSilence(requested_frames - frames_written, delay_frames); |
598 | 598 |
599 if (frames_written == 0) { | 599 if (frames_written == 0) { |
600 if (received_end_of_stream_ && !rendered_end_of_stream_ && | 600 if (received_end_of_stream_ && !rendered_end_of_stream_ && |
601 audio_clock_->CurrentMediaTimestamp() == | 601 audio_clock_->CurrentMediaTimestamp(base::TimeDelta()) == |
602 audio_clock_->last_endpoint_timestamp()) { | 602 audio_clock_->last_endpoint_timestamp()) { |
603 rendered_end_of_stream_ = true; | 603 rendered_end_of_stream_ = true; |
604 ended_cb_.Run(); | 604 ended_cb_.Run(); |
605 } else if (!received_end_of_stream_ && state_ == kPlaying) { | 605 } else if (!received_end_of_stream_ && state_ == kPlaying) { |
606 if (buffering_state_ != BUFFERING_HAVE_NOTHING) { | 606 if (buffering_state_ != BUFFERING_HAVE_NOTHING) { |
607 algorithm_->IncreaseQueueCapacity(); | 607 algorithm_->IncreaseQueueCapacity(); |
608 SetBufferingState_Locked(BUFFERING_HAVE_NOTHING); | 608 SetBufferingState_Locked(BUFFERING_HAVE_NOTHING); |
609 } | 609 } |
610 } | 610 } |
611 } | 611 } |
612 | 612 |
613 if (CanRead_Locked()) { | 613 if (CanRead_Locked()) { |
614 task_runner_->PostTask(FROM_HERE, | 614 task_runner_->PostTask(FROM_HERE, |
615 base::Bind(&AudioRendererImpl::AttemptRead, | 615 base::Bind(&AudioRendererImpl::AttemptRead, |
616 weak_factory_.GetWeakPtr())); | 616 weak_factory_.GetWeakPtr())); |
617 } | 617 } |
618 | 618 |
619 // We only want to execute |time_cb_| if time has progressed and we haven't | 619 // We only want to execute |time_cb_| if time has progressed and we haven't |
620 // signaled end of stream yet. | 620 // signaled end of stream yet. |
621 if (media_timestamp_before_filling != | 621 if (media_timestamp_before_filling != |
622 audio_clock_->CurrentMediaTimestamp() && | 622 audio_clock_->CurrentMediaTimestamp(base::TimeDelta()) && |
623 !rendered_end_of_stream_) { | 623 !rendered_end_of_stream_) { |
624 time_cb = base::Bind(time_cb_, | 624 time_cb = |
625 audio_clock_->CurrentMediaTimestamp(), | 625 base::Bind(time_cb_, |
626 audio_clock_->last_endpoint_timestamp()); | 626 audio_clock_->CurrentMediaTimestamp(base::TimeDelta()), |
| 627 audio_clock_->last_endpoint_timestamp()); |
627 } | 628 } |
628 } | 629 } |
629 | 630 |
630 if (!time_cb.is_null()) | 631 if (!time_cb.is_null()) |
631 task_runner_->PostTask(FROM_HERE, time_cb); | 632 task_runner_->PostTask(FROM_HERE, time_cb); |
632 | 633 |
633 DCHECK_LE(frames_written, requested_frames); | 634 DCHECK_LE(frames_written, requested_frames); |
634 return frames_written; | 635 return frames_written; |
635 } | 636 } |
636 | 637 |
(...skipping 63 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 |