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