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)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/cras/audio_manager_cras.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/audio/fake_audio_log_factory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// cras_util.h defines custom min/max macros which break compilation, so ensure 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// it's not included until last. #if avoids presubmit errors. 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_CRAS) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/audio/cras/cras_input.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Ge; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockAudioInputCallback : public AudioInputStream::AudioInputCallback { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MOCK_METHOD4(OnData, 326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void(AudioInputStream*, const AudioBus*, uint32, double)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnError, void(AudioInputStream*)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockAudioManagerCrasInput : public AudioManagerCras { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockAudioManagerCrasInput() : AudioManagerCras(&fake_audio_log_factory_) {} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to override this function in order to skip checking the number 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of active output streams. It is because the number of active streams 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is managed inside MakeAudioInputStream, and we don't use 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MakeAudioInputStream to create the stream in the tests. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReleaseInputStream(AudioInputStream* stream) OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete stream; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeAudioLogFactory fake_audio_log_factory_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrasInputStreamTest : public testing::Test { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStreamTest() { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_manager_.reset(new StrictMock<MockAudioManagerCrasInput>()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CrasInputStreamTest() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStream* CreateStream(ChannelLayout layout) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateStream(layout, kTestFramesPerPacket); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStream* CreateStream(ChannelLayout layout, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 samples_per_packet) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters params(kTestFormat, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSampleRate, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) samples_per_packet); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return new CrasInputStream(params, mock_manager_.get(), 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AudioManagerBase::kDefaultDeviceId); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CaptureSomeFrames(const AudioParameters ¶ms, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int duration_ms) { 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CrasInputStream* test_stream = new CrasInputStream( 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, mock_manager_.get(), AudioManagerBase::kDefaultDeviceId); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_stream->Open()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow 8 frames variance for SRC in the callback. Different numbers of 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // samples can be provided when doing non-integer SRC. For example 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // converting from 192k to 44.1k is a ratio of 4.35 to 1. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockAudioInputCallback mock_callback; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent event(false, false); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_CALL(mock_callback, OnData(test_stream, _, _, _)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Start(&mock_callback); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for samples to be captured. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Stop(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const unsigned int kTestBitsPerSample; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const unsigned int kTestCaptureDurationMs; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const ChannelLayout kTestChannelLayout; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const AudioParameters::Format kTestFormat; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kTestFramesPerPacket; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kTestSampleRate; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<StrictMock<MockAudioManagerCrasInput> > mock_manager_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrasInputStreamTest); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned int CrasInputStreamTest::kTestBitsPerSample = 16; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned int CrasInputStreamTest::kTestCaptureDurationMs = 250; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ChannelLayout CrasInputStreamTest::kTestChannelLayout = 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHANNEL_LAYOUT_STEREO; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AudioParameters::Format CrasInputStreamTest::kTestFormat = 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 CrasInputStreamTest::kTestFramesPerPacket = 1000; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int CrasInputStreamTest::kTestSampleRate = 44100; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, OpenMono) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStream* test_stream = CreateStream(CHANNEL_LAYOUT_MONO); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_stream->Open()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, OpenStereo) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStream* test_stream = CreateStream(CHANNEL_LAYOUT_STEREO); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_stream->Open()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, BadBitsPerSample) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters bad_bps_params(kTestFormat, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestChannelLayout, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSampleRate, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample - 1, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestFramesPerPacket); 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CrasInputStream* test_stream = new CrasInputStream( 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bad_bps_params, mock_manager_.get(), AudioManagerBase::kDefaultDeviceId); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_stream->Open()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, BadFormat) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters bad_format_params(AudioParameters::AUDIO_LAST_FORMAT, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestChannelLayout, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSampleRate, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestFramesPerPacket); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CrasInputStream* test_stream = new CrasInputStream( 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bad_format_params, mock_manager_.get(), 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AudioManagerBase::kDefaultDeviceId); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_stream->Open()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, BadSampleRate) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters bad_rate_params(kTestFormat, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestChannelLayout, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestFramesPerPacket); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CrasInputStream* test_stream = new CrasInputStream( 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bad_rate_params, mock_manager_.get(), AudioManagerBase::kDefaultDeviceId); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_stream->Open()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, SetGetVolume) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrasInputStream* test_stream = CreateStream(CHANNEL_LAYOUT_MONO); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_stream->Open()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double max_volume = test_stream->GetMaxVolume(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(max_volume, 1.0); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->SetVolume(max_volume / 2); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double new_volume = test_stream->GetVolume(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(new_volume, 0.0); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(new_volume, max_volume); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stream->Close(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CrasInputStreamTest, CaptureFrames) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned int rates[] = 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {8000, 16000, 22050, 32000, 44100, 48000, 96000, 192000}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ARRAY_SIZE(rates); i++) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(testing::Message() << "Mono " << rates[i] << "Hz"); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters params_mono(kTestFormat, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHANNEL_LAYOUT_MONO, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rates[i], 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestFramesPerPacket); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptureSomeFrames(params_mono, kTestCaptureDurationMs); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ARRAY_SIZE(rates); i++) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(testing::Message() << "Stereo " << rates[i] << "Hz"); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters params_stereo(kTestFormat, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHANNEL_LAYOUT_STEREO, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rates[i], 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestBitsPerSample, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestFramesPerPacket); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptureSomeFrames(params_stereo, kTestCaptureDurationMs); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 216