17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/audio_buffer.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/audio_bus.h"
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/test_helpers.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace media {
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const int kSampleRate = 48000;
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void VerifyBusWithOffset(AudioBus* bus,
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                int offset,
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                int frames,
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                float start,
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                float start_offset,
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                float increment) {
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (int ch = 0; ch < bus->channels(); ++ch) {
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const float v = start_offset + start + ch * bus->frames() * increment;
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (int i = offset; i < offset + frames; ++i) {
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ASSERT_FLOAT_EQ(v + i * increment, bus->channel(ch)[i]) << "i=" << i
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                              << ", ch=" << ch;
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void VerifyBus(AudioBus* bus, int frames, float start, float increment) {
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus, 0, frames, start, 0, increment);
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void TrimRangeTest(SampleFormat sample_format) {
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int frames = kSampleRate / 10;
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta timestamp = base::TimeDelta();
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(sample_format,
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             channel_layout,
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             channels,
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             kSampleRate,
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             0,
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             1,
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             frames,
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             timestamp);
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames, buffer->frame_count());
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp, buffer->timestamp());
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration, buffer->duration());
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verify all frames before trimming.
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(frames, 0, 0, bus.get());
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 0, 1);
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim 10ms of frames from the middle of the buffer.
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int trim_start = frames / 2;
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int trim_length = kSampleRate / 100;
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta trim_duration = base::TimeDelta::FromMilliseconds(10);
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimRange(trim_start, trim_start + trim_length);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - trim_length, buffer->frame_count());
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp, buffer->timestamp());
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - trim_duration, buffer->duration());
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, 0, 1);
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      0,
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim 10ms of frames from the start, which just adjusts the buffer's
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // internal start offset.
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimStart(trim_length);
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  trim_start -= trim_length;
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 2 * trim_length, buffer->frame_count());
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 2 * trim_duration, buffer->duration());
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, trim_length, 1);
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim 10ms of frames from the end, which just adjusts the buffer's frame
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // count.
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimEnd(trim_length);
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 3 * trim_length, buffer->frame_count());
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 3 * trim_duration, buffer->duration());
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, trim_length, 1);
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim another 10ms from the inner portion of the buffer.
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimRange(trim_start, trim_start + trim_length);
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 4 * trim_length, buffer->frame_count());
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 4 * trim_duration, buffer->duration());
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, trim_length, 1);
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length * 2,
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off the end using TrimRange() to ensure end index is exclusive.
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimRange(buffer->frame_count() - trim_length, buffer->frame_count());
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 5 * trim_length, buffer->frame_count());
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 5 * trim_duration, buffer->duration());
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, trim_length, 1);
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length,
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length * 2,
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off the start using TrimRange() to ensure start index is inclusive.
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimRange(0, trim_length);
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  trim_start -= trim_length;
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 6 * trim_length, buffer->frame_count());
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 6 * trim_duration, buffer->duration());
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), trim_start, 2 * trim_length, 1);
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBusWithOffset(bus.get(),
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_start,
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      buffer->frame_count() - trim_start,
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length * 2,
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      trim_length * 2,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      1);
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, CopyFrom) {
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_MONO;
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<AudioBuffer> original_buffer =
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      MakeAudioBuffer<uint8>(kSampleFormatU8,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             kChannelLayout,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             ChannelLayoutToChannelCount(kChannelLayout),
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             kSampleRate,
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             1,
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             1,
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             kSampleRate / 100,
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             base::TimeDelta());
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<AudioBuffer> new_buffer =
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      AudioBuffer::CopyFrom(kSampleFormatU8,
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            original_buffer->channel_layout(),
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            original_buffer->channel_count(),
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            original_buffer->sample_rate(),
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            original_buffer->frame_count(),
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            &original_buffer->channel_data()[0],
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            original_buffer->timestamp());
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->frame_count(), new_buffer->frame_count());
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->timestamp(), new_buffer->timestamp());
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->duration(), new_buffer->duration());
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->sample_rate(), new_buffer->sample_rate());
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->channel_count(), new_buffer->channel_count());
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(original_buffer->channel_layout(), new_buffer->channel_layout());
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(original_buffer->end_of_stream());
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, CreateEOSBuffer) {
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEOSBuffer();
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(buffer->end_of_stream());
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, FrameSize) {
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8 kTestData[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              27, 28, 29, 30, 31 };
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337);
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8* const data[] = { kTestData };
19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer =
19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      AudioBuffer::CopyFrom(kSampleFormatU8,
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            CHANNEL_LAYOUT_STEREO,
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            2,
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            kSampleRate,
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            16,
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                            data,
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            kTimestamp);
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(16, buffer->frame_count());  // 2 channels of 8-bit data
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  buffer = AudioBuffer::CopyFrom(kSampleFormatF32,
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 CHANNEL_LAYOUT_4_0,
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 4,
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 kSampleRate,
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 2,
21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 data,
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 kTimestamp);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2, buffer->frame_count());  // now 4 channels of 32-bit data
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadU8) {
21623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int frames = 10;
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8,
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             channel_layout,
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                             channels,
22323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             kSampleRate,
22423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             128,
22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1,
22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             frames,
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             start_time);
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(frames, 0, 0, bus.get());
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f);
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Now read the same data one frame at a time.
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (int i = 0; i < frames; ++i)
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    buffer->ReadFrames(1, i, i, bus.get());
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f);
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadS16) {
24023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
24123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int frames = 10;
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int16>(kSampleFormatS16,
24523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             channel_layout,
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                             channels,
24723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             kSampleRate,
24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1,
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1,
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             frames,
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             start_time);
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(frames, 0, 0, bus.get());
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now read the same data one frame at a time.
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (int i = 0; i < frames; ++i)
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    buffer->ReadFrames(1, i, i, bus.get());
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadS32) {
26423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int frames = 20;
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int32>(kSampleFormatS32,
26923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             channel_layout,
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                             channels,
27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             kSampleRate,
27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1,
27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1,
27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             frames,
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             start_time);
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(frames, 0, 0, bus.get());
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint32max, 1.0f / kint32max);
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Read second 10 frames.
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(10, 10, 0, bus.get());
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), 10, 11.0f / kint32max, 1.0f / kint32max);
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadF32) {
28723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
28823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int frames = 20;
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatF32,
29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             channel_layout,
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                             channels,
29423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             kSampleRate,
29523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1.0f,
29623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             1.0f,
29723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             frames,
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             start_time);
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(10, 0, 0, bus.get());
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), 10, 1, 1);
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Read second 10 frames.
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(10, 10, 0, bus.get());
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), 10, 11, 1);
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadS16Planar) {
31023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int frames = 20;
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<AudioBuffer> buffer =
31523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MakeAudioBuffer<int16>(kSampleFormatPlanarS16,
31623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             channel_layout,
317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             channels,
31823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             kSampleRate,
31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             1,
32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             1,
32123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             frames,
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             start_time);
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(10, 0, 0, bus.get());
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), 10, 1.0f / kint16max, 1.0f / kint16max);
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Read all the frames backwards, one by one. ch[0] should be 20, 19, ...
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (int i = frames - 1; i >= 0; --i)
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    buffer->ReadFrames(1, i, i, bus.get());
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Read 0 frames with different offsets. Existing data in AudioBus should be
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // unchanged.
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(0, 0, 0, bus.get());
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(0, 0, 10, bus.get());
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(0, 10, 0, bus.get());
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(AudioBufferTest, ReadF32Planar) {
34423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
34523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int frames = 100;
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::TimeDelta start_time;
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<AudioBuffer> buffer =
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      MakeAudioBuffer<float>(kSampleFormatPlanarF32,
35023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             channel_layout,
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             channels,
35223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             kSampleRate,
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             1.0f,
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             1.0f,
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             frames,
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             start_time);
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Read all 100 frames from the buffer. F32 is planar, so ch[0] should be 1,
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // 2, 3, 4, ..., ch[1] should be 101, 102, 103, ..., and so on for all 4
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // channels.
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(frames, 0, 0, bus.get());
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 1, 1);
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now read 20 frames from the middle of the buffer.
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bus->Zero();
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  buffer->ReadFrames(20, 50, 0, bus.get());
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), 20, 51, 1);
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(AudioBufferTest, EmptyBuffer) {
37223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
37323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int frames = kSampleRate / 100;
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::TimeDelta start_time;
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer(
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      channel_layout, channels, kSampleRate, frames, start_time);
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(frames, buffer->frame_count());
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(start_time, buffer->timestamp());
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMilliseconds(10), buffer->duration());
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(buffer->end_of_stream());
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Read all 100 frames from the buffer. All data should be 0.
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buffer->ReadFrames(frames, 0, 0, bus.get());
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), frames, 0, 0);
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(AudioBufferTest, Trim) {
39023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
39123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const int channels = ChannelLayoutToChannelCount(channel_layout);
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int frames = kSampleRate / 10;
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::TimeDelta start_time;
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<AudioBuffer> buffer =
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      MakeAudioBuffer<float>(kSampleFormatPlanarF32,
39723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             channel_layout,
398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             channels,
39923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             kSampleRate,
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             0.0f,
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             1.0f,
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             frames,
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             start_time);
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(frames, buffer->frame_count());
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(start_time, buffer->timestamp());
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration, buffer->duration());
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int ten_ms_of_frames = kSampleRate / 100;
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta ten_ms = base::TimeDelta::FromMilliseconds(10);
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), buffer->frame_count(), 0.0f, 1.0f);
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off 10ms of frames from the start.
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimStart(ten_ms_of_frames);
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(start_time + ten_ms, buffer->timestamp());
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - ten_ms_of_frames, buffer->frame_count());
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - ten_ms, buffer->duration());
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f);
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off 10ms of frames from the end.
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimEnd(ten_ms_of_frames);
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(start_time + ten_ms, buffer->timestamp());
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 2 * ten_ms_of_frames, buffer->frame_count());
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 2 * ten_ms, buffer->duration());
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f);
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off 40ms more from the start.
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimStart(4 * ten_ms_of_frames);
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp());
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(frames - 6 * ten_ms_of_frames, buffer->frame_count());
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(duration - 6 * ten_ms, buffer->duration());
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyBus(bus.get(), buffer->frame_count(), 5 * ten_ms_of_frames, 1.0f);
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Trim off the final 40ms from the end.
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  buffer->TrimEnd(4 * ten_ms_of_frames);
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, buffer->frame_count());
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp());
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::TimeDelta(), buffer->duration());
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(AudioBufferTest, TrimRangePlanar) {
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TrimRangeTest(kSampleFormatPlanarF32);
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(AudioBufferTest, TrimRangeInterleaved) {
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TrimRangeTest(kSampleFormatF32);
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace media
455