1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/stringprintf.h"
9 #include "base/time/time.h"
10 #include "media/base/audio_buffer.h"
11 #include "media/base/audio_buffer_queue.h"
12 #include "media/base/audio_bus.h"
13 #include "media/base/buffers.h"
14 #include "media/base/test_helpers.h"
15 #include "testing/gtest/include/gtest/gtest.h"
19 static void VerifyResult(float* channel_data
,
23 for (int i
= 0; i
< frames
; ++i
) {
24 SCOPED_TRACE(base::StringPrintf(
25 "i=%d/%d start=%f, increment=%f", i
, frames
, start
, increment
));
26 ASSERT_EQ(start
, channel_data
[i
]);
31 TEST(AudioBufferQueueTest
, AppendAndClear
) {
32 const int channels
= 1;
34 const base::TimeDelta kNoTime
= kNoTimestamp();
35 AudioBufferQueue buffer
;
36 EXPECT_EQ(0, buffer
.frames());
37 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
38 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
39 EXPECT_EQ(frames
, buffer
.frames());
41 EXPECT_EQ(0, buffer
.frames());
42 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
43 kSampleFormatU8
, channels
, 20, 1, frames
, kNoTime
, kNoTime
));
44 EXPECT_EQ(frames
, buffer
.frames());
47 TEST(AudioBufferQueueTest
, MultipleAppend
) {
48 const int channels
= 1;
50 const base::TimeDelta kNoTime
= kNoTimestamp();
51 AudioBufferQueue buffer
;
53 // Append 40 frames in 5 buffers.
54 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
55 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
56 EXPECT_EQ(8, buffer
.frames());
57 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
58 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
59 EXPECT_EQ(16, buffer
.frames());
60 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
61 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
62 EXPECT_EQ(24, buffer
.frames());
63 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
64 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
65 EXPECT_EQ(32, buffer
.frames());
66 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
67 kSampleFormatU8
, channels
, 10, 1, frames
, kNoTime
, kNoTime
));
68 EXPECT_EQ(40, buffer
.frames());
71 TEST(AudioBufferQueueTest
, IteratorCheck
) {
72 const int channels
= 1;
74 const base::TimeDelta kNoTime
= kNoTimestamp();
75 AudioBufferQueue buffer
;
76 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
78 // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the
79 // iterator is pointing to the correct position.
80 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
81 kSampleFormatF32
, channels
, 10.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
82 EXPECT_EQ(8, buffer
.frames());
84 EXPECT_EQ(4, buffer
.ReadFrames(4, 0, bus
.get()));
85 EXPECT_EQ(4, buffer
.frames());
86 VerifyResult(bus
->channel(0), 4, 10.0f
, 1.0f
);
88 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
89 kSampleFormatF32
, channels
, 20.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
90 EXPECT_EQ(12, buffer
.frames());
91 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
92 kSampleFormatF32
, channels
, 30.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
93 EXPECT_EQ(20, buffer
.frames());
95 buffer
.SeekFrames(16);
96 EXPECT_EQ(4, buffer
.ReadFrames(4, 0, bus
.get()));
97 EXPECT_EQ(0, buffer
.frames());
98 VerifyResult(bus
->channel(0), 4, 34.0f
, 1.0f
);
100 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
101 kSampleFormatF32
, channels
, 40.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
102 EXPECT_EQ(8, buffer
.frames());
103 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
104 kSampleFormatF32
, channels
, 50.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
105 EXPECT_EQ(16, buffer
.frames());
107 EXPECT_EQ(4, buffer
.ReadFrames(4, 0, bus
.get()));
108 VerifyResult(bus
->channel(0), 4, 40.0f
, 1.0f
);
110 // Read off the end of the buffer.
111 EXPECT_EQ(12, buffer
.frames());
112 buffer
.SeekFrames(8);
113 EXPECT_EQ(4, buffer
.ReadFrames(100, 0, bus
.get()));
114 VerifyResult(bus
->channel(0), 4, 54.0f
, 1.0f
);
117 TEST(AudioBufferQueueTest
, Seek
) {
118 const int channels
= 2;
119 const int frames
= 6;
120 const base::TimeDelta kNoTime
= kNoTimestamp();
121 AudioBufferQueue buffer
;
123 // Add 6 frames of data.
124 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
125 kSampleFormatF32
, channels
, 1.0f
, 1.0f
, frames
, kNoTime
, kNoTime
));
126 EXPECT_EQ(6, buffer
.frames());
128 // Seek past 2 frames.
129 buffer
.SeekFrames(2);
130 EXPECT_EQ(4, buffer
.frames());
132 // Seek to end of data.
133 buffer
.SeekFrames(4);
134 EXPECT_EQ(0, buffer
.frames());
136 // At end, seek now fails unless 0 specified.
137 buffer
.SeekFrames(0);
140 TEST(AudioBufferQueueTest
, ReadF32
) {
141 const int channels
= 2;
142 const base::TimeDelta kNoTime
= kNoTimestamp();
143 AudioBufferQueue buffer
;
145 // Add 76 frames of data.
146 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
147 kSampleFormatF32
, channels
, 1.0f
, 1.0f
, 6, kNoTime
, kNoTime
));
148 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
149 kSampleFormatF32
, channels
, 13.0f
, 1.0f
, 10, kNoTime
, kNoTime
));
150 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
151 kSampleFormatF32
, channels
, 33.0f
, 1.0f
, 60, kNoTime
, kNoTime
));
152 EXPECT_EQ(76, buffer
.frames());
154 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
155 // 1, 3, 5, and ch[1] should be 2, 4, 6.
156 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
157 EXPECT_EQ(3, buffer
.ReadFrames(3, 0, bus
.get()));
158 EXPECT_EQ(73, buffer
.frames());
159 VerifyResult(bus
->channel(0), 3, 1.0f
, 2.0f
);
160 VerifyResult(bus
->channel(1), 3, 2.0f
, 2.0f
);
162 // Now read 5 frames, which will span buffers. Append the data into AudioBus.
163 EXPECT_EQ(5, buffer
.ReadFrames(5, 3, bus
.get()));
164 EXPECT_EQ(68, buffer
.frames());
165 VerifyResult(bus
->channel(0), 8, 1.0f
, 2.0f
);
166 VerifyResult(bus
->channel(1), 8, 2.0f
, 2.0f
);
168 // Now skip into the third buffer.
169 buffer
.SeekFrames(20);
170 EXPECT_EQ(48, buffer
.frames());
172 // Now read 2 frames, which are in the third buffer.
173 EXPECT_EQ(2, buffer
.ReadFrames(2, 0, bus
.get()));
174 VerifyResult(bus
->channel(0), 2, 57.0f
, 2.0f
);
175 VerifyResult(bus
->channel(1), 2, 58.0f
, 2.0f
);
178 TEST(AudioBufferQueueTest
, ReadU8
) {
179 const int channels
= 4;
180 const int frames
= 4;
181 const base::TimeDelta kNoTime
= kNoTimestamp();
182 AudioBufferQueue buffer
;
184 // Add 4 frames of data.
185 buffer
.Append(MakeInterleavedAudioBuffer
<uint8
>(
186 kSampleFormatU8
, channels
, 128, 1, frames
, kNoTime
, kNoTime
));
188 // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be
189 // 128, 132, 136, 140, other channels similar. However, values are converted
190 // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer
191 // value should be 0.0, then 1/127, 2/127, etc.
192 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
193 EXPECT_EQ(4, buffer
.ReadFrames(4, 0, bus
.get()));
194 EXPECT_EQ(0, buffer
.frames());
195 VerifyResult(bus
->channel(0), 4, 0.0f
, 4.0f
/ 127.0f
);
196 VerifyResult(bus
->channel(1), 4, 1.0f
/ 127.0f
, 4.0f
/ 127.0f
);
197 VerifyResult(bus
->channel(2), 4, 2.0f
/ 127.0f
, 4.0f
/ 127.0f
);
198 VerifyResult(bus
->channel(3), 4, 3.0f
/ 127.0f
, 4.0f
/ 127.0f
);
201 TEST(AudioBufferQueueTest
, ReadS16
) {
202 const int channels
= 2;
203 const base::TimeDelta kNoTime
= kNoTimestamp();
204 AudioBufferQueue buffer
;
206 // Add 24 frames of data.
207 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
208 kSampleFormatS16
, channels
, 1, 1, 4, kNoTime
, kNoTime
));
209 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
210 kSampleFormatS16
, channels
, 9, 1, 20, kNoTime
, kNoTime
));
211 EXPECT_EQ(24, buffer
.frames());
213 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
214 // 1, 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12.
215 // Data is converted to float from -1.0 to 1.0 based on int16 range.
216 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
217 EXPECT_EQ(6, buffer
.ReadFrames(6, 0, bus
.get()));
218 EXPECT_EQ(18, buffer
.frames());
219 VerifyResult(bus
->channel(0), 6, 1.0f
/ kint16max
, 2.0f
/ kint16max
);
220 VerifyResult(bus
->channel(1), 6, 2.0f
/ kint16max
, 2.0f
/ kint16max
);
223 TEST(AudioBufferQueueTest
, ReadS32
) {
224 const int channels
= 2;
225 const base::TimeDelta kNoTime
= kNoTimestamp();
226 AudioBufferQueue buffer
;
228 // Add 24 frames of data.
229 buffer
.Append(MakeInterleavedAudioBuffer
<int32
>(
230 kSampleFormatS32
, channels
, 1, 1, 4, kNoTime
, kNoTime
));
231 buffer
.Append(MakeInterleavedAudioBuffer
<int32
>(
232 kSampleFormatS32
, channels
, 9, 1, 20, kNoTime
, kNoTime
));
233 EXPECT_EQ(24, buffer
.frames());
235 // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
236 // 1, 3, 5, 7, 100, 106, and ch[1] should be 2, 4, 6, 8, 103, 109.
237 // Data is converted to float from -1.0 to 1.0 based on int32 range.
238 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
239 EXPECT_EQ(6, buffer
.ReadFrames(6, 0, bus
.get()));
240 EXPECT_EQ(18, buffer
.frames());
241 VerifyResult(bus
->channel(0), 6, 1.0f
/ kint32max
, 2.0f
/ kint32max
);
242 VerifyResult(bus
->channel(1), 6, 2.0f
/ kint32max
, 2.0f
/ kint32max
);
244 // Read the next 2 frames.
245 EXPECT_EQ(2, buffer
.ReadFrames(2, 0, bus
.get()));
246 EXPECT_EQ(16, buffer
.frames());
247 VerifyResult(bus
->channel(0), 2, 13.0f
/ kint32max
, 2.0f
/ kint32max
);
248 VerifyResult(bus
->channel(1), 2, 14.0f
/ kint32max
, 2.0f
/ kint32max
);
251 TEST(AudioBufferQueueTest
, ReadF32Planar
) {
252 const int channels
= 2;
253 const base::TimeDelta kNoTime
= kNoTimestamp();
254 AudioBufferQueue buffer
;
256 // Add 14 frames of data.
257 buffer
.Append(MakePlanarAudioBuffer
<float>(
258 kSampleFormatPlanarF32
, channels
, 1.0f
, 1.0f
, 4, kNoTime
, kNoTime
));
259 buffer
.Append(MakePlanarAudioBuffer
<float>(
260 kSampleFormatPlanarF32
, channels
, 50.0f
, 1.0f
, 10, kNoTime
, kNoTime
));
261 EXPECT_EQ(14, buffer
.frames());
263 // Read 6 frames from the buffer. F32 is planar, so ch[0] should be
264 // 1, 2, 3, 4, 50, 51, and ch[1] should be 5, 6, 7, 8, 60, 61.
265 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
266 EXPECT_EQ(6, buffer
.ReadFrames(6, 0, bus
.get()));
267 EXPECT_EQ(8, buffer
.frames());
268 VerifyResult(bus
->channel(0), 4, 1.0f
, 1.0f
);
269 VerifyResult(bus
->channel(0) + 4, 2, 50.0f
, 1.0f
);
270 VerifyResult(bus
->channel(1), 4, 5.0f
, 1.0f
);
271 VerifyResult(bus
->channel(1) + 4, 2, 60.0f
, 1.0f
);
274 TEST(AudioBufferQueueTest
, ReadS16Planar
) {
275 const int channels
= 2;
276 const base::TimeDelta kNoTime
= kNoTimestamp();
277 AudioBufferQueue buffer
;
279 // Add 24 frames of data.
280 buffer
.Append(MakePlanarAudioBuffer
<int16
>(
281 kSampleFormatPlanarS16
, channels
, 1, 1, 4, kNoTime
, kNoTime
));
282 buffer
.Append(MakePlanarAudioBuffer
<int16
>(
283 kSampleFormatPlanarS16
, channels
, 100, 5, 20, kNoTime
, kNoTime
));
284 EXPECT_EQ(24, buffer
.frames());
286 // Read 6 frames from the buffer. Data is planar, so ch[0] should be
287 // 1, 2, 3, 4, 100, 105, and ch[1] should be 5, 6, 7, 8, 200, 205.
288 // Data is converted to float from -1.0 to 1.0 based on int16 range.
289 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
290 EXPECT_EQ(6, buffer
.ReadFrames(6, 0, bus
.get()));
291 EXPECT_EQ(18, buffer
.frames());
292 VerifyResult(bus
->channel(0), 4, 1.0f
/ kint16max
, 1.0f
/ kint16max
);
293 VerifyResult(bus
->channel(0) + 4, 2, 100.0f
/ kint16max
, 5.0f
/ kint16max
);
294 VerifyResult(bus
->channel(1), 4, 5.0f
/ kint16max
, 1.0f
/ kint16max
);
295 VerifyResult(bus
->channel(1) + 4, 2, 200.0f
/ kint16max
, 5.0f
/ kint16max
);
298 TEST(AudioBufferQueueTest
, ReadManyChannels
) {
299 const int channels
= 16;
300 const base::TimeDelta kNoTime
= kNoTimestamp();
301 AudioBufferQueue buffer
;
303 // Add 76 frames of data.
304 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
305 kSampleFormatF32
, channels
, 0.0f
, 1.0f
, 6, kNoTime
, kNoTime
));
306 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
307 kSampleFormatF32
, channels
, 6.0f
* channels
, 1.0f
, 10, kNoTime
, kNoTime
));
308 buffer
.Append(MakeInterleavedAudioBuffer
<float>(kSampleFormatF32
,
315 EXPECT_EQ(76, buffer
.frames());
317 // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
318 // 1, 17, 33, and ch[1] should be 2, 18, 34. Just check a few channels.
319 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
320 EXPECT_EQ(30, buffer
.ReadFrames(30, 0, bus
.get()));
321 EXPECT_EQ(46, buffer
.frames());
322 for (int i
= 0; i
< channels
; ++i
) {
323 VerifyResult(bus
->channel(i
), 30, static_cast<float>(i
), 16.0f
);
327 TEST(AudioBufferQueueTest
, Peek
) {
328 const int channels
= 4;
329 const base::TimeDelta kNoTime
= kNoTimestamp();
330 AudioBufferQueue buffer
;
332 // Add 60 frames of data.
333 buffer
.Append(MakeInterleavedAudioBuffer
<float>(
334 kSampleFormatF32
, channels
, 0.0f
, 1.0f
, 60, kNoTime
, kNoTime
));
335 EXPECT_EQ(60, buffer
.frames());
337 // Peek at the first 30 frames.
338 scoped_ptr
<AudioBus
> bus1
= AudioBus::Create(channels
, 100);
339 EXPECT_EQ(60, buffer
.frames());
340 EXPECT_EQ(60, buffer
.PeekFrames(100, 0, 0, bus1
.get()));
341 EXPECT_EQ(30, buffer
.PeekFrames(30, 0, 0, bus1
.get()));
342 EXPECT_EQ(60, buffer
.frames());
344 // Now read the next 30 frames (which should be the same as those peeked at).
345 scoped_ptr
<AudioBus
> bus2
= AudioBus::Create(channels
, 100);
346 EXPECT_EQ(30, buffer
.ReadFrames(30, 0, bus2
.get()));
347 for (int i
= 0; i
< channels
; ++i
) {
348 VerifyResult(bus1
->channel(i
),
350 static_cast<float>(i
),
351 static_cast<float>(channels
));
352 VerifyResult(bus2
->channel(i
),
354 static_cast<float>(i
),
355 static_cast<float>(channels
));
358 // Peek 10 frames forward
359 EXPECT_EQ(5, buffer
.PeekFrames(5, 10, 0, bus1
.get()));
360 for (int i
= 0; i
< channels
; ++i
) {
361 VerifyResult(bus1
->channel(i
),
363 static_cast<float>(i
+ 40 * channels
),
364 static_cast<float>(channels
));
367 // Peek to the end of the buffer.
368 EXPECT_EQ(30, buffer
.frames());
369 EXPECT_EQ(30, buffer
.PeekFrames(100, 0, 0, bus1
.get()));
370 EXPECT_EQ(30, buffer
.PeekFrames(30, 0, 0, bus1
.get()));
373 TEST(AudioBufferQueueTest
, Time
) {
374 const int channels
= 2;
375 const base::TimeDelta start_time1
;
376 const base::TimeDelta start_time2
= base::TimeDelta::FromSeconds(30);
377 const base::TimeDelta duration
= base::TimeDelta::FromSeconds(10);
378 AudioBufferQueue buffer
;
379 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
381 // Add two buffers (second one added later):
382 // first: start=0s, duration=10s
383 // second: start=30s, duration=10s
384 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
385 kSampleFormatS16
, channels
, 1, 1, 10, start_time1
, duration
));
386 EXPECT_EQ(10, buffer
.frames());
388 // Check starting time.
389 EXPECT_EQ(start_time1
, buffer
.current_time());
391 // Read 2 frames, should be 2s in (since duration is 1s per sample).
392 EXPECT_EQ(2, buffer
.ReadFrames(2, 0, bus
.get()));
393 EXPECT_EQ(start_time1
+ base::TimeDelta::FromSeconds(2),
394 buffer
.current_time());
397 buffer
.SeekFrames(2);
398 EXPECT_EQ(start_time1
+ base::TimeDelta::FromSeconds(4),
399 buffer
.current_time());
401 // Add second buffer for more data.
402 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
403 kSampleFormatS16
, channels
, 1, 1, 10, start_time2
, duration
));
404 EXPECT_EQ(16, buffer
.frames());
406 // Read until almost the end of buffer1.
407 EXPECT_EQ(5, buffer
.ReadFrames(5, 0, bus
.get()));
408 EXPECT_EQ(start_time1
+ base::TimeDelta::FromSeconds(9),
409 buffer
.current_time());
411 // Read 1 value, so time moved to buffer2.
412 EXPECT_EQ(1, buffer
.ReadFrames(1, 0, bus
.get()));
413 EXPECT_EQ(start_time2
, buffer
.current_time());
415 // Read all 10 frames in buffer2, timestamp should be last time from buffer2.
416 EXPECT_EQ(10, buffer
.ReadFrames(10, 0, bus
.get()));
417 EXPECT_EQ(start_time2
+ base::TimeDelta::FromSeconds(10),
418 buffer
.current_time());
420 // Try to read more frames (which don't exist), timestamp should remain.
421 EXPECT_EQ(0, buffer
.ReadFrames(5, 0, bus
.get()));
422 EXPECT_EQ(start_time2
+ base::TimeDelta::FromSeconds(10),
423 buffer
.current_time());
426 TEST(AudioBufferQueueTest
, NoTime
) {
427 const int channels
= 2;
428 const base::TimeDelta kNoTime
= kNoTimestamp();
429 AudioBufferQueue buffer
;
430 scoped_ptr
<AudioBus
> bus
= AudioBus::Create(channels
, 100);
432 // Add two buffers with no timestamps. Time should always be unknown.
433 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
434 kSampleFormatS16
, channels
, 1, 1, 10, kNoTime
, kNoTime
));
435 buffer
.Append(MakeInterleavedAudioBuffer
<int16
>(
436 kSampleFormatS16
, channels
, 1, 1, 10, kNoTime
, kNoTime
));
437 EXPECT_EQ(20, buffer
.frames());
439 // Check starting time.
440 EXPECT_EQ(kNoTime
, buffer
.current_time());
443 EXPECT_EQ(2, buffer
.ReadFrames(2, 0, bus
.get()));
444 EXPECT_EQ(kNoTime
, buffer
.current_time());
447 buffer
.SeekFrames(2);
448 EXPECT_EQ(kNoTime
, buffer
.current_time());
450 // Read until almost the end of buffer1.
451 EXPECT_EQ(5, buffer
.ReadFrames(5, 0, bus
.get()));
452 EXPECT_EQ(kNoTime
, buffer
.current_time());
454 // Read 1 value, so time moved to buffer2.
455 EXPECT_EQ(1, buffer
.ReadFrames(1, 0, bus
.get()));
456 EXPECT_EQ(kNoTime
, buffer
.current_time());
458 // Read all 10 frames in buffer2.
459 EXPECT_EQ(10, buffer
.ReadFrames(10, 0, bus
.get()));
460 EXPECT_EQ(kNoTime
, buffer
.current_time());
462 // Try to read more frames (which don't exist), timestamp should remain.
463 EXPECT_EQ(0, buffer
.ReadFrames(5, 0, bus
.get()));
464 EXPECT_EQ(kNoTime
, buffer
.current_time());