15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The format of these tests are to enqueue a known amount of data and then
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request the exact amount we expect in order to dequeue the known amount of
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data.  This ensures that for any rate we are consuming input data at the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correct rate.  We always pass in a very large destination buffer with the
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expectation that FillBuffer() will fill as much as it can but no more.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/audio_buffer.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/audio_bus.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/buffers.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/channel_layout.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/test_helpers.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/audio_renderer_algorithm.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const int kFrameSize = 250;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int kSamplesPerSecond = 3000;
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const SampleFormat kSampleFormat = kSampleFormatS16;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioRendererAlgorithmTest : public testing::Test {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioRendererAlgorithmTest()
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : frames_enqueued_(0),
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        channels_(0),
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        sample_format_(kUnknownSampleFormat),
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        bytes_per_sample_(0) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AudioRendererAlgorithmTest() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize() {
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS16, 3000);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Initialize(ChannelLayout channel_layout,
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  SampleFormat sample_format,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int samples_per_second) {
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    channels_ = ChannelLayoutToChannelCount(channel_layout);
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    sample_format_ = sample_format;
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bytes_per_sample_ = SampleFormatToBytesPerChannel(sample_format);
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    AudioParameters params(media::AudioParameters::AUDIO_PCM_LINEAR,
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           channel_layout,
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           samples_per_second,
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           bytes_per_sample_ * 8,
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           samples_per_second / 100);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    algorithm_.Initialize(1, params);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillAlgorithmQueue();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FillAlgorithmQueue() {
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // The value of the data is meaningless; we just want non-zero data to
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // differentiate it from muted data.
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_refptr<AudioBuffer> buffer;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (!algorithm_.IsQueueFull()) {
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      switch (sample_format_) {
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        case kSampleFormatU8:
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          buffer = MakeInterleavedAudioBuffer<uint8>(sample_format_,
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     channels_,
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kFrameSize,
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp(),
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp());
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          break;
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        case kSampleFormatS16:
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          buffer = MakeInterleavedAudioBuffer<int16>(sample_format_,
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     channels_,
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kFrameSize,
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp(),
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp());
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          break;
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        case kSampleFormatS32:
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          buffer = MakeInterleavedAudioBuffer<int32>(sample_format_,
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     channels_,
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     1,
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kFrameSize,
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp(),
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                     kNoTimestamp());
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          break;
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        default:
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          NOTREACHED() << "Unrecognized format " << sample_format_;
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      algorithm_.EnqueueBuffer(buffer);
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      frames_enqueued_ += kFrameSize;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CheckFakeData(AudioBus* audio_data, int frames_written) {
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Check each channel individually.
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (int ch = 0; ch < channels_; ++ch) {
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bool all_zero = true;
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for (int i = 0; i < frames_written && all_zero; ++i)
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        all_zero = audio_data->channel(ch)[i] == 0.0f;
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_EQ(algorithm_.is_muted(), all_zero) << " for channel " << ch;
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int ComputeConsumedFrames(int initial_frames_enqueued,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            int initial_frames_buffered) {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int frame_delta = frames_enqueued_ - initial_frames_enqueued;
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int buffered_delta = algorithm_.frames_buffered() - initial_frames_buffered;
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int consumed = frame_delta - buffered_delta;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK_GE(consumed, 0);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consumed;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestPlaybackRate(double playback_rate) {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int kDefaultBufferSize = algorithm_.samples_per_second() / 100;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kDefaultFramesRequested = 2 * algorithm_.samples_per_second();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    TestPlaybackRate(
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        playback_rate, kDefaultBufferSize, kDefaultFramesRequested);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestPlaybackRate(double playback_rate,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int buffer_size_in_frames,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int total_frames_requested) {
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int initial_frames_enqueued = frames_enqueued_;
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int initial_frames_buffered = algorithm_.frames_buffered();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    algorithm_.SetPlaybackRate(static_cast<float>(playback_rate));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<AudioBus> bus =
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AudioBus::Create(channels_, buffer_size_in_frames);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (playback_rate == 0.0) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int frames_written =
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          algorithm_.FillBuffer(bus.get(), buffer_size_in_frames);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, frames_written);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int frames_remaining = total_frames_requested;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (frames_remaining > 0) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int frames_requested = std::min(buffer_size_in_frames, frames_remaining);
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int frames_written = algorithm_.FillBuffer(bus.get(), frames_requested);
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_GT(frames_written, 0) << "Requested: " << frames_requested
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   << ", playing at " << playback_rate;
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CheckFakeData(bus.get(), frames_written);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frames_remaining -= frames_written;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillAlgorithmQueue();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int frames_consumed =
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ComputeConsumedFrames(initial_frames_enqueued, initial_frames_buffered);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If playing back at normal speed, we should always get back the same
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // number of bytes requested.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (playback_rate == 1.0) {
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(total_frames_requested, frames_consumed);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Otherwise, allow |kMaxAcceptableDelta| difference between the target and
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // actual playback rate.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When |kSamplesPerSecond| and |total_frames_requested| are reasonably
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // large, one can expect less than a 1% difference in most cases. In our
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current implementation, sped up playback is less accurate than slowed
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // down playback, and for playback_rate > 1, playback rate generally gets
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // less and less accurate the farther it drifts from 1 (though this is
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // nonlinear).
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    double actual_playback_rate =
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        1.0 * frames_consumed / total_frames_requested;
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_NEAR(playback_rate, actual_playback_rate, playback_rate / 100.0);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioRendererAlgorithm algorithm_;
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int frames_enqueued_;
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int channels_;
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SampleFormat sample_format_;
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int bytes_per_sample_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_NormalRate) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_NearlyNormalFasterRate) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestPlaybackRate(1.0001);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_NearlyNormalSlowerRate) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestPlaybackRate(0.9999);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_OneAndAQuarterRate) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.25);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_OneAndAHalfRate) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.5);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_DoubleRate) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(2.0);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_EightTimesRate) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(8.0);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_ThreeQuartersRate) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.75);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_HalfRate) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_QuarterRate) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.25);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_Pause) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.0);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_SlowDown) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(4.5);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(3.0);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(2.0);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.25);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_SpeedUp) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.25);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(2.0);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(3.0);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(4.5);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_JumpAroundSpeeds) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(2.1);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.9);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.6);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.4);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.3);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_SmallBufferSize) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Initialize();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kBufferSizeInFrames = 1;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kFramesRequested = 2 * kSamplesPerSecond;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0, kBufferSizeInFrames, kFramesRequested);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5, kBufferSizeInFrames, kFramesRequested);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.5, kBufferSizeInFrames, kFramesRequested);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_LargeBufferSize) {
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS16, 44100);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestPlaybackRate(1.0);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestPlaybackRate(0.5);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestPlaybackRate(1.5);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_LowerQualityAudio) {
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Initialize(CHANNEL_LAYOUT_MONO, kSampleFormatU8, kSamplesPerSecond);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.5);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AudioRendererAlgorithmTest, FillBuffer_HigherQualityAudio) {
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS32, kSamplesPerSecond);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.0);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(0.5);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPlaybackRate(1.5);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
301