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