15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/copresence/mediums/audio/audio_recorder.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/aligned_memory.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/run_loop.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/copresence/public/copresence_constants.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/copresence/test/audio_test_support.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/audio/audio_manager.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/audio/audio_manager_base.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/audio_bus.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestAudioInputStream : public media::AudioInputStream { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestAudioInputStream(const media::AudioParameters& params, 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<float*> channel_data, 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t samples) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : callback_(NULL), params_(params) { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) buffer_ = media::AudioBus::CreateWrapper(2); 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < channel_data.size(); ++i) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) buffer_->SetChannelData(i, channel_data[i]); 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) buffer_->set_frames(samples); 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~TestAudioInputStream() {} 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool Open() OVERRIDE { return true; } 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Start(AudioInputCallback* callback) OVERRIDE { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(callback); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback_ = callback; 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media::AudioManager::Get()->GetTaskRunner()->PostTask( 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&TestAudioInputStream::SimulateRecording, 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this))); 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Stop() OVERRIDE {} 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Close() OVERRIDE {} 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual double GetMaxVolume() OVERRIDE { return 1.0; } 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE {} 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual double GetVolume() OVERRIDE { return 1.0; } 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetAutomaticGainControl(bool enabled) OVERRIDE {} 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool GetAutomaticGainControl() OVERRIDE { return true; } 50ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch virtual bool IsMuted() OVERRIDE { return false; } 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SimulateRecording() { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int fpb = params_.frames_per_buffer(); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int i = 0; i < buffer_->frames() / fpb; ++i) { 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<media::AudioBus> source = media::AudioBus::Create(2, fpb); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) buffer_->CopyPartialFramesTo(i * fpb, fpb, 0, source.get()); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback_->OnData(this, source.get(), fpb, 1.0); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AudioInputCallback* callback_; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media::AudioParameters params_; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<media::AudioBus> buffer_; 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestAudioInputStream); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace copresence { 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AudioRecorderTest : public testing::Test { 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AudioRecorderTest() : total_samples_(0), recorder_(NULL) { 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!media::AudioManager::Get()) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media::AudioManager::CreateForTesting(); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~AudioRecorderTest() { 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < channel_data_.size(); ++i) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::AlignedFree(channel_data_[i]); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CreateSimpleRecorder() { 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_ = new AudioRecorder( 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&AudioRecorderTest::DecodeSamples, base::Unretained(this))); 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Initialize(); 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CreateRecorder(size_t channels, 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t sample_rate, 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t bits_per_sample, 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t samples) { 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kDefaultChannelLayout, 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channels, 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sample_rate, 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bits_per_sample, 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4096); 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_data_.clear(); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_data_.push_back(GenerateSamples(0x1337, samples)); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_data_.push_back(GenerateSamples(0x7331, samples)); 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) total_samples_ = samples; 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_ = new AudioRecorder( 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&AudioRecorderTest::DecodeSamples, base::Unretained(this))); 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->set_input_stream_for_testing( 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new TestAudioInputStream(params_, channel_data_, samples)); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->set_params_for_testing(new media::AudioParameters(params_)); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Initialize(); 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DeleteRecorder() { 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!recorder_) 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Finalize(); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_ = NULL; 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RecordAndVerifySamples() { 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) received_samples_.clear(); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop_.reset(new base::RunLoop()); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop_->Run(); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DecodeSamples(const std::string& samples) { 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) received_samples_ += samples; 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We expect one less decode than our total samples would ideally have 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // triggered since we process data in 4k chunks. So our sample processing 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // will never rarely be perfectly aligned with 0.5s worth of samples, hence 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // we will almost always run with a buffer of leftover samples that will 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // not get sent to this callback since the recorder will be waiting for 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // more data. 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const size_t decode_buffer = params_.sample_rate() / 2; // 0.5s 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const size_t expected_samples = 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (total_samples_ / decode_buffer - 1) * decode_buffer; 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const size_t expected_samples_size = 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expected_samples * sizeof(float) * params_.channels(); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (received_samples_.size() == expected_samples_size) { 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) VerifySamples(); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop_->Quit(); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void VerifySamples() { 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int differences = 0; 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float* buffer_view = 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) reinterpret_cast<float*>(string_as_array(&received_samples_)); 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int channels = params_.channels(); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int frames = 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) received_samples_.size() / sizeof(float) / params_.channels(); 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int ch = 0; ch < channels; ++ch) { 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int si = 0, di = ch; si < frames; ++si, di += channels) 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) differences += (buffer_view[di] != channel_data_[ch][si]); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, differences); 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float* GenerateSamples(int random_seed, size_t size) { 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float* samples = static_cast<float*>(base::AlignedAlloc( 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size * sizeof(float), media::AudioBus::kChannelAlignment)); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PopulateSamples(0x1337, size, samples); 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return samples; 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool IsRecording() { 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->FlushAudioLoopForTesting(); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return recorder_->is_recording_; 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<float*> channel_data_; 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media::AudioParameters params_; 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t total_samples_; 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AudioRecorder* recorder_; 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string received_samples_; 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<base::RunLoop> run_loop_; 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// TODO(rkc): These tests are broken on all platforms. 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// On Windows and Mac, we cannot use non-OS params. The tests need to be 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// rewritten to use the params provided to us by the audio manager 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// rather than setting our own params. 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// On Linux, there is a memory leak in the audio code during initialization. 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_BasicRecordAndStop DISABLED_BasicRecordAndStop 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_OutOfOrderRecordAndStopMultiple DISABLED_OutOfOrderRecordAndStopMultiple 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_RecordingEndToEnd DISABLED_RecordingEndToEnd 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AudioRecorderTest, MAYBE_BasicRecordAndStop) { 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateSimpleRecorder(); 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsRecording()); 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsRecording()); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsRecording()); 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsRecording()); 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsRecording()); 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsRecording()); 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AudioRecorderTest, MAYBE_OutOfOrderRecordAndStopMultiple) { 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateSimpleRecorder(); 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsRecording()); 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Record(); 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsRecording()); 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recorder_->Stop(); 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsRecording()); 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AudioRecorderTest, MAYBE_RecordingEndToEnd) { 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int kNumSamples = 48000 * 3; 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateRecorder( 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kDefaultChannels, kDefaultSampleRate, kDefaultBitsPerSample, kNumSamples); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RecordAndVerifySamples(); 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeleteRecorder(); 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(rkc): Add tests with recording different sample rates. 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace copresence 254