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