1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h" 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/audio_buffer.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/audio_buffer_queue.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/audio_bus.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/buffers.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/test_helpers.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace media { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const int kSampleRate = 44100; 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void VerifyBus(AudioBus* bus, 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int offset, 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int frames, 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int buffer_size, 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) float start, 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) float increment) { 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int ch = 0; ch < bus->channels(); ++ch) { 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const float v = start + ch * buffer_size * increment; 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int i = offset; i < offset + frames; ++i) { 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FLOAT_EQ(v + (i - offset) * increment, bus->channel(ch)[i]) 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << "i=" << i << ", ch=" << ch; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)template <typename T> 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)static scoped_refptr<AudioBuffer> MakeTestBuffer(SampleFormat format, 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChannelLayout channel_layout, 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) T start, 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) T step, 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int frames) { 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return MakeAudioBuffer<T>(format, 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) channel_layout, 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChannelLayoutToChannelCount(channel_layout), 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleRate, 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) start, 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) step, 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) frames, 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNoTimestamp()); 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(AudioBufferQueueTest, AppendAndClear) { 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer.frames()); 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(8, buffer.frames()); 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.Clear(); 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer.frames()); 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 20, 1, 8)); 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(8, buffer.frames()); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, MultipleAppend) { 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(8, buffer.frames()); 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(16, buffer.frames()); 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(24, buffer.frames()); 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(32, buffer.frames()); 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 10, 1, 8)); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(40, buffer.frames()); 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, IteratorCheck) { 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO; 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // iterator is pointing to the correct position. 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 10.0f, 1.0f, 8)); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(8, buffer.frames()); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(4, buffer.frames()); 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, bus->frames(), 10, 1); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 20.0f, 1.0f, 8)); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(12, buffer.frames()); 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 30.0f, 1.0f, 8)); 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(20, buffer.frames()); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(16); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer.frames()); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, bus->frames(), 34, 1); 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 40.0f, 1.0f, 8)); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(8, buffer.frames()); 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 50.0f, 1.0f, 8)); 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(16, buffer.frames()); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get())); 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, bus->frames(), 40, 1); 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Read off the end of the buffer. 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(12, buffer.frames()); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(8); 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(4, buffer.ReadFrames(100, 0, bus.get())); 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, bus->frames(), 54, 1); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, Seek) { 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 6 frames of data. 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(6, buffer.frames()); 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Seek past 2 frames. 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(2); 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(4, buffer.frames()); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Seek to end of data. 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(4); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer.frames()); 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // At end, seek now fails unless 0 specified. 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(0); 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadF32) { 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 76 frames of data. 15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 1.0f, 1.0f, 6)); 15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 13.0f, 1.0f, 10)); 16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 33.0f, 1.0f, 60)); 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(76, buffer.frames()); 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 3 frames from the buffer. 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(3, buffer.ReadFrames(3, 0, bus.get())); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(73, buffer.frames()); 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 3, 6, 1, 1); 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Now read 5 frames, which will span buffers. Append the data into AudioBus. 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(5, buffer.ReadFrames(5, 3, bus.get())); 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(68, buffer.frames()); 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 6, 6, 1, 1); 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 6, 2, 10, 13, 1); 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Now skip into the third buffer. 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer.SeekFrames(20); 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(48, buffer.frames()); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Now read 2 frames, which are in the third buffer. 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 2, 60, 45, 1); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadU8) { 18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; 18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int frames = 4; 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 4 frames of data. 19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MakeTestBuffer<uint8>(kSampleFormatU8, channel_layout, 128, 1, frames)); 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read all 4 frames from the buffer. 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames); 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer.frames()); 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, frames, bus->frames(), 0, 1.0f / 127.0f); 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadS16) { 20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 24 frames of data. 20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 1, 1, 4)); 21123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 21223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<int16>(kSampleFormatS16, channel_layout, 9, 1, 20)); 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(24, buffer.frames()); 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 6 frames from the buffer. 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int frames = 6; 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AudioBus> bus = AudioBus::Create(channels, buffer.frames()); 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.ReadFrames(frames, 0, bus.get())); 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(18, buffer.frames()); 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint16max, 1.0f / kint16max); 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadS32) { 22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 24 frames of data. 23023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 23123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 1, 1, 4)); 23223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<int32>(kSampleFormatS32, channel_layout, 9, 1, 20)); 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(24, buffer.frames()); 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 6 frames from the buffer. 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(18, buffer.frames()); 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint32max, 1.0f / kint32max); 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 4, 2, 20, 9.0f / kint32max, 1.0f / kint32max); 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Read the next 2 frames. 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get())); 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(16, buffer.frames()); 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 2, 20, 11.0f / kint32max, 1.0f / kint32max); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadF32Planar) { 25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 14 frames of data. 25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 25623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatPlanarF32, channel_layout, 1.0f, 1.0f, 4)); 25723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatPlanarF32, channel_layout, 50.0f, 1.0f, 10)); 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(14, buffer.frames()); 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 6 frames from the buffer. 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(8, buffer.frames()); 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, 4, 1, 1); 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 4, 2, 10, 50, 1); 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadS16Planar) { 27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 24 frames of data. 27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<int16>(kSampleFormatPlanarS16, channel_layout, 1, 1, 4)); 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) buffer.Append( 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MakeTestBuffer<int16>(kSampleFormatPlanarS16, channel_layout, 5, 1, 20)); 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(24, buffer.frames()); 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 6 frames from the buffer. 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get())); 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(18, buffer.frames()); 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 4, 4, 1.0f / kint16max, 1.0f / kint16max); 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 4, 2, 20, 5.0f / kint16max, 1.0f / kint16max); 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, ReadManyChannels) { 29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_OCTAGONAL; 29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 76 frames of data. 29523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append( 29623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MakeTestBuffer<float>(kSampleFormatF32, channel_layout, 0.0f, 1.0f, 6)); 29723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 29823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 6.0f * channels, 1.0f, 10)); 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kSampleFormatF32, channel_layout, 16.0f * channels, 1.0f, 60)); 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(76, buffer.frames()); 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read 3 frames from the buffer. 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100); 3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus.get())); 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(46, buffer.frames()); 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 0, 6, 6, 0, 1); 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 6, 10, 10, 6 * channels, 1); 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus.get(), 16, 14, 60, 16 * channels, 1); 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(AudioBufferQueueTest, Peek) { 31323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0; 31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int channels = ChannelLayoutToChannelCount(channel_layout); 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue buffer; 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add 60 frames of data. 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int frames = 60; 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) buffer.Append(MakeTestBuffer<float>( 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSampleFormatF32, channel_layout, 0.0f, 1.0f, frames)); 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.frames()); 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Peek at the first 30 frames. 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, frames); 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.frames()); 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.PeekFrames(60, 0, 0, bus1.get())); 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); 328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(frames, buffer.frames()); 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus1.get(), 0, 30, bus1->frames(), 0, 1); 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Now read the next 30 frames (which should be the same as those peeked at). 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, frames); 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus2.get())); 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus2.get(), 0, 30, bus2->frames(), 0, 1); 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Peek 10 frames forward 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bus1->Zero(); 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(5, buffer.PeekFrames(5, 10, 0, bus1.get())); 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VerifyBus(bus1.get(), 0, 5, bus1->frames(), 40, 1); 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Peek to the end of the buffer. 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(30, buffer.frames()); 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(30, buffer.PeekFrames(60, 0, 0, bus1.get())); 3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get())); 345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace media 348