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