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