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