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