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/base/audio_timestamp_helper.h" | 5 #include "media/base/audio_timestamp_helper.h" |
6 #include "media/base/buffers.h" | 6 #include "media/base/buffers.h" |
7 #include "media/filters/audio_clock.h" | 7 #include "media/filters/audio_clock.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace media { | 10 namespace media { |
11 | 11 |
12 class AudioClockTest : public testing::Test { | 12 class AudioClockTest : public testing::Test { |
13 public: | 13 public: |
14 AudioClockTest() | 14 AudioClockTest() |
15 : sample_rate_(10), | 15 : sample_rate_(10), clock_(base::TimeDelta(), sample_rate_) {} |
16 timestamp_helper_(sample_rate_), | |
17 clock_(sample_rate_) { | |
18 timestamp_helper_.SetBaseTimestamp(base::TimeDelta()); | |
19 } | |
20 | 16 |
21 virtual ~AudioClockTest() {} | 17 virtual ~AudioClockTest() {} |
22 | 18 |
23 void WroteAudio(int frames, int delay_frames, float playback_rate) { | 19 void WroteAudio(int frames_written, |
24 timestamp_helper_.AddFrames(static_cast<int>(frames * playback_rate)); | 20 int frames_requested, |
| 21 int delay_frames, |
| 22 float playback_rate) { |
25 clock_.WroteAudio( | 23 clock_.WroteAudio( |
26 frames, delay_frames, playback_rate, timestamp_helper_.GetTimestamp()); | 24 frames_written, frames_requested, delay_frames, playback_rate); |
27 } | 25 } |
28 | 26 |
29 void WroteSilence(int frames, int delay_frames) { | 27 int CurrentMediaTimestampInDays() { |
30 clock_.WroteSilence(frames, delay_frames); | 28 return clock_.current_media_timestamp().InDays(); |
31 } | 29 } |
32 | 30 |
33 int CurrentMediaTimestampInMilliseconds() { | 31 int CurrentMediaTimestampInMilliseconds() { |
34 return CurrentMediaTimestampSinceLastWritingInMilliseconds(0); | 32 return clock_.current_media_timestamp().InMilliseconds(); |
35 } | 33 } |
36 | 34 |
37 int CurrentMediaTimestampSinceLastWritingInMilliseconds(int milliseconds) { | 35 int CurrentMediaTimestampSinceLastWritingInMilliseconds(int milliseconds) { |
38 return clock_.CurrentMediaTimestamp(base::TimeDelta::FromMilliseconds( | 36 return clock_.CurrentMediaTimestampSinceWriting( |
39 milliseconds)).InMilliseconds(); | 37 base::TimeDelta::FromMilliseconds(milliseconds)) |
40 } | 38 .InMilliseconds(); |
41 | 39 } |
42 int LastEndpointTimestampInMilliseconds() { | 40 |
43 return clock_.last_endpoint_timestamp().InMilliseconds(); | 41 int ContiguousAudioDataBufferedInDays() { |
| 42 return clock_.contiguous_audio_data_buffered().InDays(); |
| 43 } |
| 44 |
| 45 int ContiguousAudioDataBufferedInMilliseconds() { |
| 46 return clock_.contiguous_audio_data_buffered().InMilliseconds(); |
| 47 } |
| 48 |
| 49 int ContiguousAudioDataBufferedAtSameRateInMilliseconds() { |
| 50 return clock_.contiguous_audio_data_buffered_at_same_rate() |
| 51 .InMilliseconds(); |
44 } | 52 } |
45 | 53 |
46 const int sample_rate_; | 54 const int sample_rate_; |
47 AudioTimestampHelper timestamp_helper_; | |
48 AudioClock clock_; | 55 AudioClock clock_; |
49 | 56 |
50 private: | 57 private: |
51 DISALLOW_COPY_AND_ASSIGN(AudioClockTest); | 58 DISALLOW_COPY_AND_ASSIGN(AudioClockTest); |
52 }; | 59 }; |
53 | 60 |
54 TEST_F(AudioClockTest, TimestampsStartAtNoTimestamp) { | 61 TEST_F(AudioClockTest, CurrentMediaTimestampStartsAtStartTimestamp) { |
55 EXPECT_EQ(kNoTimestamp(), clock_.CurrentMediaTimestamp(base::TimeDelta())); | 62 base::TimeDelta expected = base::TimeDelta::FromSeconds(123); |
56 EXPECT_EQ(kNoTimestamp(), clock_.last_endpoint_timestamp()); | 63 AudioClock clock(expected, sample_rate_); |
| 64 |
| 65 EXPECT_EQ(expected, clock.current_media_timestamp()); |
| 66 } |
| 67 |
| 68 TEST_F(AudioClockTest, |
| 69 CurrentMediaTimestampSinceWritingStartsAtStartTimestamp) { |
| 70 base::TimeDelta expected = base::TimeDelta::FromSeconds(123); |
| 71 AudioClock clock(expected, sample_rate_); |
| 72 |
| 73 base::TimeDelta time_since_writing = base::TimeDelta::FromSeconds(456); |
| 74 EXPECT_EQ(expected, |
| 75 clock.CurrentMediaTimestampSinceWriting(time_since_writing)); |
| 76 } |
| 77 |
| 78 TEST_F(AudioClockTest, ContiguousAudioDataBufferedStartsAtZero) { |
| 79 EXPECT_EQ(base::TimeDelta(), clock_.contiguous_audio_data_buffered()); |
| 80 } |
| 81 |
| 82 TEST_F(AudioClockTest, ContiguousAudioDataBufferedAtSameRateStartsAtZero) { |
| 83 EXPECT_EQ(base::TimeDelta(), |
| 84 clock_.contiguous_audio_data_buffered_at_same_rate()); |
| 85 } |
| 86 |
| 87 TEST_F(AudioClockTest, AudioDataBufferedStartsAtFalse) { |
| 88 EXPECT_FALSE(clock_.audio_data_buffered()); |
57 } | 89 } |
58 | 90 |
59 TEST_F(AudioClockTest, Playback) { | 91 TEST_F(AudioClockTest, Playback) { |
60 // The first time we write data we should expect a negative time matching the | 92 // The first time we write data we should still expect our start timestamp |
61 // current delay. | 93 // due to delay. |
62 WroteAudio(10, 20, 1.0); | 94 WroteAudio(10, 10, 20, 1.0); |
63 EXPECT_EQ(-2000, CurrentMediaTimestampInMilliseconds()); | 95 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
64 EXPECT_EQ(1000, LastEndpointTimestampInMilliseconds()); | 96 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
65 | 97 EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
66 // The media time should keep advancing as we write data. | 98 EXPECT_TRUE(clock_.audio_data_buffered()); |
67 WroteAudio(10, 20, 1.0); | 99 |
68 EXPECT_EQ(-1000, CurrentMediaTimestampInMilliseconds()); | 100 // The media time should remain at start timestamp as we write data. |
69 EXPECT_EQ(2000, LastEndpointTimestampInMilliseconds()); | 101 WroteAudio(10, 10, 20, 1.0); |
70 | 102 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
71 WroteAudio(10, 20, 1.0); | 103 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
72 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | 104 EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
73 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | 105 |
74 | 106 WroteAudio(10, 10, 20, 1.0); |
75 WroteAudio(10, 20, 1.0); | 107 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
76 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | 108 EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds()); |
77 EXPECT_EQ(4000, LastEndpointTimestampInMilliseconds()); | 109 EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
78 | 110 |
79 // Introduce a rate change to slow down time. Current time will keep advancing | 111 // The media time should now start advanced now that delay has been covered. |
80 // by one second until it hits the slowed down audio. | 112 WroteAudio(10, 10, 20, 1.0); |
81 WroteAudio(10, 20, 0.5); | 113 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); |
| 114 EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds()); |
| 115 EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
| 116 |
| 117 WroteAudio(10, 10, 20, 1.0); |
82 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); | 118 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); |
83 EXPECT_EQ(4500, LastEndpointTimestampInMilliseconds()); | 119 EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds()); |
84 | 120 EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
85 WroteAudio(10, 20, 0.5); | 121 |
| 122 // Introduce a rate change to slow down time: |
| 123 // - Current time will advance by one second until it hits rate change |
| 124 // - Contiguous audio data will start shrinking immediately |
| 125 WroteAudio(10, 10, 20, 0.5); |
86 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | 126 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); |
87 EXPECT_EQ(5000, LastEndpointTimestampInMilliseconds()); | 127 EXPECT_EQ(2500, ContiguousAudioDataBufferedInMilliseconds()); |
88 | 128 EXPECT_EQ(2000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
89 WroteAudio(10, 20, 0.5); | 129 |
| 130 WroteAudio(10, 10, 20, 0.5); |
90 EXPECT_EQ(4000, CurrentMediaTimestampInMilliseconds()); | 131 EXPECT_EQ(4000, CurrentMediaTimestampInMilliseconds()); |
91 EXPECT_EQ(5500, LastEndpointTimestampInMilliseconds()); | 132 EXPECT_EQ(2000, ContiguousAudioDataBufferedInMilliseconds()); |
92 | 133 EXPECT_EQ(1000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
93 WroteAudio(10, 20, 0.5); | 134 |
94 EXPECT_EQ(4500, CurrentMediaTimestampInMilliseconds()); | 135 WroteAudio(10, 10, 20, 0.5); |
95 EXPECT_EQ(6000, LastEndpointTimestampInMilliseconds()); | |
96 | |
97 // Introduce a rate change to speed up time. Current time will keep advancing | |
98 // by half a second until it hits the the sped up audio. | |
99 WroteAudio(10, 20, 2); | |
100 EXPECT_EQ(5000, CurrentMediaTimestampInMilliseconds()); | 136 EXPECT_EQ(5000, CurrentMediaTimestampInMilliseconds()); |
101 EXPECT_EQ(8000, LastEndpointTimestampInMilliseconds()); | 137 EXPECT_EQ(1500, ContiguousAudioDataBufferedInMilliseconds()); |
102 | 138 EXPECT_EQ(1500, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
103 WroteAudio(10, 20, 2); | 139 |
| 140 WroteAudio(10, 10, 20, 0.5); |
104 EXPECT_EQ(5500, CurrentMediaTimestampInMilliseconds()); | 141 EXPECT_EQ(5500, CurrentMediaTimestampInMilliseconds()); |
105 EXPECT_EQ(10000, LastEndpointTimestampInMilliseconds()); | 142 EXPECT_EQ(1500, ContiguousAudioDataBufferedInMilliseconds()); |
106 | 143 EXPECT_EQ(1500, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
107 WroteAudio(10, 20, 2); | 144 |
| 145 // Introduce a rate change to speed up time: |
| 146 // - Current time will advance by half a second until it hits rate change |
| 147 // - Contiguous audio data will start growing immediately |
| 148 WroteAudio(10, 10, 20, 2); |
108 EXPECT_EQ(6000, CurrentMediaTimestampInMilliseconds()); | 149 EXPECT_EQ(6000, CurrentMediaTimestampInMilliseconds()); |
109 EXPECT_EQ(12000, LastEndpointTimestampInMilliseconds()); | 150 EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds()); |
110 | 151 EXPECT_EQ(1000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
111 WroteAudio(10, 20, 2); | 152 |
112 EXPECT_EQ(8000, CurrentMediaTimestampInMilliseconds()); | 153 WroteAudio(10, 10, 20, 2); |
113 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | 154 EXPECT_EQ(6500, CurrentMediaTimestampInMilliseconds()); |
114 | 155 EXPECT_EQ(4500, ContiguousAudioDataBufferedInMilliseconds()); |
115 // Write silence to simulate reaching end of stream. | 156 EXPECT_EQ(500, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
116 WroteSilence(10, 20); | 157 |
117 EXPECT_EQ(10000, CurrentMediaTimestampInMilliseconds()); | 158 WroteAudio(10, 10, 20, 2); |
118 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | 159 EXPECT_EQ(7000, CurrentMediaTimestampInMilliseconds()); |
119 | 160 EXPECT_EQ(6000, ContiguousAudioDataBufferedInMilliseconds()); |
120 WroteSilence(10, 20); | 161 EXPECT_EQ(6000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
121 EXPECT_EQ(12000, CurrentMediaTimestampInMilliseconds()); | 162 |
122 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | 163 WroteAudio(10, 10, 20, 2); |
123 | 164 EXPECT_EQ(9000, CurrentMediaTimestampInMilliseconds()); |
124 WroteSilence(10, 20); | 165 EXPECT_EQ(6000, ContiguousAudioDataBufferedInMilliseconds()); |
125 EXPECT_EQ(14000, CurrentMediaTimestampInMilliseconds()); | 166 EXPECT_EQ(6000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
126 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | 167 |
| 168 // Write silence to simulate reaching end of stream: |
| 169 // - Current time will advance by half a second until it hits silence |
| 170 // - Contiguous audio data will start shrinking towards zero |
| 171 WroteAudio(0, 10, 20, 2); |
| 172 EXPECT_EQ(11000, CurrentMediaTimestampInMilliseconds()); |
| 173 EXPECT_EQ(4000, ContiguousAudioDataBufferedInMilliseconds()); |
| 174 EXPECT_EQ(4000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
| 175 |
| 176 WroteAudio(0, 10, 20, 2); |
| 177 EXPECT_EQ(13000, CurrentMediaTimestampInMilliseconds()); |
| 178 EXPECT_EQ(2000, ContiguousAudioDataBufferedInMilliseconds()); |
| 179 EXPECT_EQ(2000, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
| 180 EXPECT_TRUE(clock_.audio_data_buffered()); // Still audio data buffered. |
| 181 |
| 182 WroteAudio(0, 10, 20, 2); |
| 183 EXPECT_EQ(15000, CurrentMediaTimestampInMilliseconds()); |
| 184 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
| 185 EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
| 186 EXPECT_FALSE(clock_.audio_data_buffered()); // No more audio data buffered. |
127 | 187 |
128 // At this point media time should stop increasing. | 188 // At this point media time should stop increasing. |
129 WroteSilence(10, 20); | 189 WroteAudio(0, 10, 20, 2); |
130 EXPECT_EQ(14000, CurrentMediaTimestampInMilliseconds()); | 190 EXPECT_EQ(15000, CurrentMediaTimestampInMilliseconds()); |
131 EXPECT_EQ(14000, LastEndpointTimestampInMilliseconds()); | 191 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
| 192 EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds()); |
| 193 EXPECT_FALSE(clock_.audio_data_buffered()); |
132 } | 194 } |
133 | 195 |
134 TEST_F(AudioClockTest, AlternatingAudioAndSilence) { | 196 TEST_F(AudioClockTest, AlternatingAudioAndSilence) { |
135 // Buffer #1: [0, 1000) | 197 // Buffer #1: [0, 1000) |
136 WroteAudio(10, 20, 1.0); | 198 WroteAudio(10, 10, 20, 1.0); |
137 EXPECT_EQ(-2000, CurrentMediaTimestampInMilliseconds()); | 199 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
| 200 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
138 | 201 |
139 // Buffer #2: 1000ms of silence | 202 // Buffer #2: 1000ms of silence |
140 WroteSilence(10, 20); | 203 WroteAudio(0, 10, 20, 1.0); |
141 EXPECT_EQ(-1000, CurrentMediaTimestampInMilliseconds()); | 204 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
142 | 205 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
143 // Buffer #3: [1000, 2000), buffer #1 is at front | 206 |
144 WroteAudio(10, 20, 1.0); | 207 // Buffer #3: [1000, 2000): |
145 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | 208 // - Buffer #1 is at front with 1000ms of contiguous audio data |
146 | 209 WroteAudio(10, 10, 20, 1.0); |
147 // Buffer #4: 1000ms of silence, time shouldn't advance | 210 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
148 WroteSilence(10, 20); | 211 EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds()); |
149 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | 212 |
150 | 213 // Buffer #4: 1000ms of silence |
151 // Buffer #5: [2000, 3000), buffer #3 is at front | 214 // - Buffer #1 has been played out |
152 WroteAudio(10, 20, 1.0); | 215 // - Buffer #2 of silence leaves us with 0ms of contiguous audio data |
153 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | 216 WroteAudio(0, 10, 20, 1.0); |
| 217 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); |
| 218 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
| 219 |
| 220 // Buffer #5: [2000, 3000): |
| 221 // - Buffer #3 is at front with 1000ms of contiguous audio data |
| 222 WroteAudio(10, 10, 20, 1.0); |
| 223 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); |
| 224 EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds()); |
154 } | 225 } |
155 | 226 |
156 TEST_F(AudioClockTest, ZeroDelay) { | 227 TEST_F(AudioClockTest, ZeroDelay) { |
157 // The first time we write data we should expect the first timestamp | 228 // The first time we write data we should expect the first timestamp |
158 // immediately. | 229 // immediately. |
159 WroteAudio(10, 0, 1.0); | 230 WroteAudio(10, 10, 0, 1.0); |
160 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); | 231 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
161 EXPECT_EQ(1000, LastEndpointTimestampInMilliseconds()); | 232 EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds()); |
162 | 233 |
163 // Ditto for all subsequent buffers. | 234 // Ditto for all subsequent buffers. |
164 WroteAudio(10, 0, 1.0); | 235 WroteAudio(10, 10, 0, 1.0); |
165 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); | 236 EXPECT_EQ(1000, CurrentMediaTimestampInMilliseconds()); |
166 EXPECT_EQ(2000, LastEndpointTimestampInMilliseconds()); | 237 EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds()); |
167 | 238 |
168 WroteAudio(10, 0, 1.0); | 239 WroteAudio(10, 10, 0, 1.0); |
169 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); | 240 EXPECT_EQ(2000, CurrentMediaTimestampInMilliseconds()); |
170 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | 241 EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds()); |
171 | 242 |
172 // Ditto for silence. | 243 // Ditto for silence. |
173 WroteSilence(10, 0); | 244 WroteAudio(0, 10, 0, 1.0); |
174 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | 245 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); |
175 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | 246 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
176 | 247 |
177 WroteSilence(10, 0); | 248 WroteAudio(0, 10, 0, 1.0); |
178 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); | 249 EXPECT_EQ(3000, CurrentMediaTimestampInMilliseconds()); |
179 EXPECT_EQ(3000, LastEndpointTimestampInMilliseconds()); | 250 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
180 } | 251 } |
181 | 252 |
182 TEST_F(AudioClockTest, CurrentMediaTimestampSinceLastWriting) { | 253 TEST_F(AudioClockTest, CurrentMediaTimestampSinceLastWriting) { |
183 // Construct an audio clock with the following representation: | 254 // Construct an audio clock with the following representation: |
184 // | 255 // |
185 // +-------------------+----------------+------------------+----------------+ | 256 // +-------------------+----------------+------------------+----------------+ |
186 // | 10 frames silence | 10 frames @ 1x | 10 frames @ 0.5x | 10 frames @ 2x | | 257 // | 10 frames silence | 10 frames @ 1x | 10 frames @ 0.5x | 10 frames @ 2x | |
187 // +-------------------+----------------+------------------+----------------+ | 258 // +-------------------+----------------+------------------+----------------+ |
188 // Media timestamp: 0 1000 1500 3500 | 259 // Media timestamp: 0 1000 1500 3500 |
189 // Wall clock time: 2000 3000 4000 5000 | 260 // Wall clock time: 2000 3000 4000 5000 |
190 WroteAudio(10, 40, 1.0); | 261 WroteAudio(10, 10, 40, 1.0); |
191 WroteAudio(10, 40, 0.5); | 262 WroteAudio(10, 10, 40, 0.5); |
192 WroteAudio(10, 40, 2.0); | 263 WroteAudio(10, 10, 40, 2.0); |
193 EXPECT_EQ(-2000, CurrentMediaTimestampInMilliseconds()); | 264 EXPECT_EQ(0, CurrentMediaTimestampInMilliseconds()); |
194 EXPECT_EQ(3500, LastEndpointTimestampInMilliseconds()); | 265 EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds()); |
195 | 266 |
196 // Simulate passing 2000ms of initial delay in the audio hardware. | 267 // Simulate passing 2000ms of initial delay in the audio hardware. |
197 EXPECT_EQ(-2000, CurrentMediaTimestampSinceLastWritingInMilliseconds(0)); | 268 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(0)); |
198 EXPECT_EQ(-1500, CurrentMediaTimestampSinceLastWritingInMilliseconds(500)); | 269 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(500)); |
199 EXPECT_EQ(-1000, CurrentMediaTimestampSinceLastWritingInMilliseconds(1000)); | 270 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(1000)); |
200 EXPECT_EQ(-500, CurrentMediaTimestampSinceLastWritingInMilliseconds(1500)); | 271 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(1500)); |
201 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(2000)); | 272 EXPECT_EQ(0, CurrentMediaTimestampSinceLastWritingInMilliseconds(2000)); |
202 | 273 |
203 // New we should see the 1.0x buffer. | 274 // Now we should see the 1.0x buffer. |
204 EXPECT_EQ(500, CurrentMediaTimestampSinceLastWritingInMilliseconds(2500)); | 275 EXPECT_EQ(500, CurrentMediaTimestampSinceLastWritingInMilliseconds(2500)); |
205 EXPECT_EQ(1000, CurrentMediaTimestampSinceLastWritingInMilliseconds(3000)); | 276 EXPECT_EQ(1000, CurrentMediaTimestampSinceLastWritingInMilliseconds(3000)); |
206 | 277 |
207 // Now we should see the 0.5x buffer. | 278 // Now we should see the 0.5x buffer. |
208 EXPECT_EQ(1250, CurrentMediaTimestampSinceLastWritingInMilliseconds(3500)); | 279 EXPECT_EQ(1250, CurrentMediaTimestampSinceLastWritingInMilliseconds(3500)); |
209 EXPECT_EQ(1500, CurrentMediaTimestampSinceLastWritingInMilliseconds(4000)); | 280 EXPECT_EQ(1500, CurrentMediaTimestampSinceLastWritingInMilliseconds(4000)); |
210 | 281 |
211 // Now we should see the 2.0x buffer. | 282 // Now we should see the 2.0x buffer. |
212 EXPECT_EQ(2500, CurrentMediaTimestampSinceLastWritingInMilliseconds(4500)); | 283 EXPECT_EQ(2500, CurrentMediaTimestampSinceLastWritingInMilliseconds(4500)); |
213 EXPECT_EQ(3500, CurrentMediaTimestampSinceLastWritingInMilliseconds(5000)); | 284 EXPECT_EQ(3500, CurrentMediaTimestampSinceLastWritingInMilliseconds(5000)); |
214 | 285 |
215 // Times beyond the known length of the audio clock should return the last | 286 // Times beyond the known length of the audio clock should return the last |
216 // value we know of. | 287 // media timestamp we know of. |
217 EXPECT_EQ(LastEndpointTimestampInMilliseconds(), | 288 EXPECT_EQ(3500, CurrentMediaTimestampSinceLastWritingInMilliseconds(5001)); |
218 CurrentMediaTimestampSinceLastWritingInMilliseconds(5001)); | 289 EXPECT_EQ(3500, CurrentMediaTimestampSinceLastWritingInMilliseconds(6000)); |
219 EXPECT_EQ(LastEndpointTimestampInMilliseconds(), | 290 } |
220 CurrentMediaTimestampSinceLastWritingInMilliseconds(6000)); | 291 |
| 292 TEST_F(AudioClockTest, SupportsYearsWorthOfAudioData) { |
| 293 // Use number of frames that would be likely to overflow 32-bit integer math. |
| 294 const int huge_amount_of_frames = std::numeric_limits<int>::max(); |
| 295 const base::TimeDelta huge = |
| 296 base::TimeDelta::FromSeconds(huge_amount_of_frames / sample_rate_); |
| 297 EXPECT_EQ(2485, huge.InDays()); // Just to give some context on how big... |
| 298 |
| 299 // Use zero delay to test calculation of current timestamp. |
| 300 WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0); |
| 301 EXPECT_EQ(0, CurrentMediaTimestampInDays()); |
| 302 EXPECT_EQ(2485, ContiguousAudioDataBufferedInDays()); |
| 303 |
| 304 WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0); |
| 305 EXPECT_EQ(huge.InDays(), CurrentMediaTimestampInDays()); |
| 306 EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays()); |
| 307 |
| 308 WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0); |
| 309 EXPECT_EQ((huge * 2).InDays(), CurrentMediaTimestampInDays()); |
| 310 EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays()); |
| 311 |
| 312 WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0); |
| 313 EXPECT_EQ((huge * 3).InDays(), CurrentMediaTimestampInDays()); |
| 314 EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays()); |
| 315 |
| 316 // Use huge delay to test calculation of buffered data. |
| 317 WroteAudio( |
| 318 huge_amount_of_frames, huge_amount_of_frames, huge_amount_of_frames, 1.0); |
| 319 EXPECT_EQ((huge * 3).InDays(), CurrentMediaTimestampInDays()); |
| 320 EXPECT_EQ((huge * 2).InDays(), ContiguousAudioDataBufferedInDays()); |
221 } | 321 } |
222 | 322 |
223 } // namespace media | 323 } // namespace media |
OLD | NEW |