OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_clock.h" | 5 #include "media/filters/audio_clock.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "media/base/buffers.h" | 8 #include "media/base/buffers.h" |
9 | 9 |
10 namespace media { | 10 namespace media { |
(...skipping 27 matching lines...) Expand all Loading... |
38 DCHECK_GE(frames, 0); | 38 DCHECK_GE(frames, 0); |
39 DCHECK_GE(delay_frames, 0); | 39 DCHECK_GE(delay_frames, 0); |
40 | 40 |
41 if (last_endpoint_timestamp_ == kNoTimestamp()) | 41 if (last_endpoint_timestamp_ == kNoTimestamp()) |
42 PushBufferedAudio(delay_frames, 0, kNoTimestamp()); | 42 PushBufferedAudio(delay_frames, 0, kNoTimestamp()); |
43 | 43 |
44 TrimBufferedAudioToMatchDelay(delay_frames); | 44 TrimBufferedAudioToMatchDelay(delay_frames); |
45 PushBufferedAudio(frames, 0, kNoTimestamp()); | 45 PushBufferedAudio(frames, 0, kNoTimestamp()); |
46 } | 46 } |
47 | 47 |
48 base::TimeDelta AudioClock::CurrentMediaTimestamp() const { | 48 base::TimeDelta AudioClock::CurrentMediaTimestamp( |
| 49 base::TimeDelta time_since_writing) const { |
| 50 int frames_to_skip = |
| 51 static_cast<int>(time_since_writing.InSecondsF() * sample_rate_); |
49 int silence_frames = 0; | 52 int silence_frames = 0; |
50 for (size_t i = 0; i < buffered_audio_.size(); ++i) { | 53 for (size_t i = 0; i < buffered_audio_.size(); ++i) { |
| 54 int frames = buffered_audio_[i].frames; |
| 55 if (frames_to_skip > 0) { |
| 56 if (frames <= frames_to_skip) { |
| 57 frames_to_skip -= frames; |
| 58 continue; |
| 59 } |
| 60 frames -= frames_to_skip; |
| 61 frames_to_skip = 0; |
| 62 } |
| 63 |
51 // Account for silence ahead of the buffer closest to being played. | 64 // Account for silence ahead of the buffer closest to being played. |
52 if (buffered_audio_[i].playback_rate == 0) { | 65 if (buffered_audio_[i].playback_rate == 0) { |
53 silence_frames += buffered_audio_[i].frames; | 66 silence_frames += frames; |
54 continue; | 67 continue; |
55 } | 68 } |
56 | 69 |
57 // Multiply by playback rate as frames represent time-scaled audio. | 70 // Multiply by playback rate as frames represent time-scaled audio. |
58 return buffered_audio_[i].endpoint_timestamp - | 71 return buffered_audio_[i].endpoint_timestamp - |
59 base::TimeDelta::FromMicroseconds( | 72 base::TimeDelta::FromMicroseconds( |
60 ((buffered_audio_[i].frames * buffered_audio_[i].playback_rate) + | 73 ((frames * buffered_audio_[i].playback_rate) + silence_frames) / |
61 silence_frames) / | |
62 sample_rate_ * base::Time::kMicrosecondsPerSecond); | 74 sample_rate_ * base::Time::kMicrosecondsPerSecond); |
63 } | 75 } |
64 | 76 |
65 // Either: | 77 // Either: |
66 // 1) AudioClock is uninitialziated and we'll return kNoTimestamp() | 78 // 1) AudioClock is uninitialziated and we'll return kNoTimestamp() |
67 // 2) All previously buffered audio has been replaced by silence, | 79 // 2) All previously buffered audio has been replaced by silence, |
68 // meaning media time is now at the last endpoint | 80 // meaning media time is now at the last endpoint |
69 return last_endpoint_timestamp_; | 81 return last_endpoint_timestamp_; |
70 } | 82 } |
71 | 83 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 | 138 |
127 AudioClock::BufferedAudio::BufferedAudio(int frames, | 139 AudioClock::BufferedAudio::BufferedAudio(int frames, |
128 float playback_rate, | 140 float playback_rate, |
129 base::TimeDelta endpoint_timestamp) | 141 base::TimeDelta endpoint_timestamp) |
130 : frames(frames), | 142 : frames(frames), |
131 playback_rate(playback_rate), | 143 playback_rate(playback_rate), |
132 endpoint_timestamp(endpoint_timestamp) { | 144 endpoint_timestamp(endpoint_timestamp) { |
133 } | 145 } |
134 | 146 |
135 } // namespace media | 147 } // namespace media |
OLD | NEW |