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 "base/basictypes.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/run_loop.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_io.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager_base.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class allows to find out if the callbacks are occurring as
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected and if any error has been reported.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInputCallback : public AudioInputStream::AudioInputCallback {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit TestInputCallback()
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : callback_count_(0),
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        had_error_(0) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnData(AudioInputStream* stream,
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                      const AudioBus* source,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      uint32 hardware_delay_bytes,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      double volume) OVERRIDE {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++callback_count_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnError(AudioInputStream* stream) OVERRIDE {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++had_error_;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns how many times OnData() has been called.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_count() const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return callback_count_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns how many times the OnError callback was called.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int had_error() const {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return had_error_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_count_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int had_error_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AudioInputTest : public testing::Test {
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  public:
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   AudioInputTest() :
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      message_loop_(base::MessageLoop::TYPE_UI),
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      audio_manager_(AudioManager::CreateForTesting()),
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      audio_input_stream_(NULL) {
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Wait for the AudioManager to finish any initialization on the audio loop.
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop().RunUntilIdle();
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~AudioInputTest() {
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop().RunUntilIdle();
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AudioManager* audio_manager() { return audio_manager_.get(); }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool CanRunAudioTests() {
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool has_input = audio_manager()->HasAudioInputDevices();
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOG_IF(WARNING, !has_input) << "No input devices detected";
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return has_input;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void MakeAudioInputStreamOnAudioThread() {
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputTest::MakeAudioInputStream,
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CloseAudioInputStreamOnAudioThread() {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputStream::Close,
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(audio_input_stream_)));
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_ = NULL;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenAndCloseAudioInputStreamOnAudioThread() {
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputTest::OpenAndClose,
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenStopAndCloseAudioInputStreamOnAudioThread() {
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputTest::OpenStopAndClose,
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenAndStartAudioInputStreamOnAudioThread(
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      AudioInputStream::AudioInputCallback* sink) {
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputTest::OpenAndStart,
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this),
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   sink));
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void StopAndCloseAudioInputStreamOnAudioThread() {
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunOnAudioThread(
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AudioInputTest::StopAndClose,
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void MakeAudioInputStream() {
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AudioParameters params = audio_manager()->GetInputStreamParameters(
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AudioManagerBase::kDefaultDeviceId);
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_ = audio_manager()->MakeAudioInputStream(params,
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AudioManagerBase::kDefaultDeviceId);
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(audio_input_stream_);
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenAndClose() {
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(audio_input_stream_->Open());
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Close();
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_ = NULL;
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenAndStart(AudioInputStream::AudioInputCallback* sink) {
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(audio_input_stream_->Open());
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Start(sink);
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OpenStopAndClose() {
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(audio_input_stream_->Open());
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Stop();
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Close();
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_ = NULL;
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void StopAndClose() {
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Stop();
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_->Close();
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    audio_input_stream_ = NULL;
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Synchronously runs the provided callback/closure on the audio thread.
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RunOnAudioThread(const base::Closure& closure) {
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!audio_manager()->GetTaskRunner()->BelongsToCurrentThread()) {
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WaitableEvent event(false, false);
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      audio_manager()->GetTaskRunner()->PostTask(
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          FROM_HERE,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&AudioInputTest::RunOnAudioThreadImpl,
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     base::Unretained(this),
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     closure,
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     &event));
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      event.Wait();
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else {
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      closure.Run();
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RunOnAudioThreadImpl(const base::Closure& closure,
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            base::WaitableEvent* event) {
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    closure.Run();
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    event->Signal();
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::MessageLoop message_loop_;
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AudioManager> audio_manager_;
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AudioInputStream* audio_input_stream_;
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioInputTest);
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test create and close of an AudioInputStream without recording audio.
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AudioInputTest, CreateAndClose) {
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CanRunAudioTests())
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MakeAudioInputStreamOnAudioThread();
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CloseAudioInputStreamOnAudioThread();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This test is failing on ARM linux: http://crbug.com/238490
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_OpenAndClose DISABLED_OpenAndClose
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_OpenAndClose OpenAndClose
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test create, open and close of an AudioInputStream without recording audio.
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AudioInputTest, MAYBE_OpenAndClose) {
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CanRunAudioTests())
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MakeAudioInputStreamOnAudioThread();
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OpenAndCloseAudioInputStreamOnAudioThread();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This test is failing on ARM linux: http://crbug.com/238490
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_OpenStopAndClose DISABLED_OpenStopAndClose
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_OpenStopAndClose OpenStopAndClose
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test create, open, stop and close of an AudioInputStream without recording.
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AudioInputTest, MAYBE_OpenStopAndClose) {
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CanRunAudioTests())
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MakeAudioInputStreamOnAudioThread();
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OpenStopAndCloseAudioInputStreamOnAudioThread();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This test is failing on ARM linux: http://crbug.com/238490
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_Record DISABLED_Record
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_Record Record
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a normal recording sequence using an AudioInputStream.
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Very simple test which starts capturing during half a second and verifies
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// that recording starts.
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AudioInputTest, MAYBE_Record) {
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CanRunAudioTests())
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MakeAudioInputStreamOnAudioThread();
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestInputCallback test_callback;
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OpenAndStartAudioInputStreamOnAudioThread(&test_callback);
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  message_loop_.PostDelayedTask(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(500));
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  message_loop_.Run();
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_GE(test_callback.callback_count(), 2);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_callback.had_error());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  StopAndCloseAudioInputStreamOnAudioThread();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
244