1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/basictypes.h"
6 #include "base/environment.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/threading/platform_thread.h"
10 #include "media/audio/audio_io.h"
11 #include "media/audio/audio_manager_base.h"
12 #include "testing/gtest/include/gtest/gtest.h"
16 static const int kSamplingRate = 8000;
17 static const int kSamplesPerPacket = kSamplingRate / 20;
19 // This class allows to find out if the callbacks are occurring as
20 // expected and if any error has been reported.
21 class TestInputCallback : public AudioInputStream::AudioInputCallback {
23 explicit TestInputCallback(int max_data_bytes)
26 max_data_bytes_(max_data_bytes) {
28 virtual void OnData(AudioInputStream* stream,
31 uint32 hardware_delay_bytes,
32 double volume) OVERRIDE {
34 // Read the first byte to make sure memory is good.
36 ASSERT_LE(static_cast<int>(size), max_data_bytes_);
41 virtual void OnError(AudioInputStream* stream) OVERRIDE {
44 // Returns how many times OnData() has been called.
45 int callback_count() const {
46 return callback_count_;
48 // Returns how many times the OnError callback was called.
49 int had_error() const {
59 static bool CanRunAudioTests(AudioManager* audio_man) {
60 bool has_input = audio_man->HasAudioInputDevices();
63 LOG(WARNING) << "No input devices detected";
68 static AudioInputStream* CreateTestAudioInputStream(AudioManager* audio_man) {
69 AudioInputStream* ais = audio_man->MakeAudioInputStream(
70 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
71 kSamplingRate, 16, kSamplesPerPacket),
72 AudioManagerBase::kDefaultDeviceId);
73 EXPECT_TRUE(NULL != ais);
77 // Test that AudioInputStream rejects out of range parameters.
78 TEST(AudioInputTest, SanityOnMakeParams) {
79 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
80 if (!CanRunAudioTests(audio_man.get()))
83 AudioParameters::Format fmt = AudioParameters::AUDIO_PCM_LINEAR;
84 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
85 AudioParameters(fmt, CHANNEL_LAYOUT_7_1, 8000, 16,
86 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
87 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
88 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 1024 * 1024, 16,
89 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
90 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
91 AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 80,
92 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
93 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
94 AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 80,
95 1000 * kSamplesPerPacket),
96 AudioManagerBase::kDefaultDeviceId));
97 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
98 AudioParameters(fmt, CHANNEL_LAYOUT_UNSUPPORTED, 8000, 16,
99 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
100 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
101 AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, -8000, 16,
102 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
103 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
104 AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, -16,
105 kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
106 EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
107 AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 16, -1024),
108 AudioManagerBase::kDefaultDeviceId));
111 // Test create and close of an AudioInputStream without recording audio.
112 TEST(AudioInputTest, CreateAndClose) {
113 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
114 if (!CanRunAudioTests(audio_man.get()))
116 AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
120 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
121 // This test is failing on ARM linux: http://crbug.com/238490
122 #define MAYBE_OpenAndClose DISABLED_OpenAndClose
124 #define MAYBE_OpenAndClose OpenAndClose
126 // Test create, open and close of an AudioInputStream without recording audio.
127 TEST(AudioInputTest, MAYBE_OpenAndClose) {
128 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
129 if (!CanRunAudioTests(audio_man.get()))
131 AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
132 EXPECT_TRUE(ais->Open());
136 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
137 // This test is failing on ARM linux: http://crbug.com/238490
138 #define MAYBE_OpenStopAndClose DISABLED_OpenStopAndClose
140 #define MAYBE_OpenStopAndClose OpenStopAndClose
142 // Test create, open, stop and close of an AudioInputStream without recording.
143 TEST(AudioInputTest, MAYBE_OpenStopAndClose) {
144 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
145 if (!CanRunAudioTests(audio_man.get()))
147 AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
148 EXPECT_TRUE(ais->Open());
153 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
154 // This test is failing on ARM linux: http://crbug.com/238490
155 #define MAYBE_Record DISABLED_Record
157 #define MAYBE_Record Record
159 // Test a normal recording sequence using an AudioInputStream.
160 TEST(AudioInputTest, MAYBE_Record) {
161 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
162 if (!CanRunAudioTests(audio_man.get()))
164 base::MessageLoop message_loop;
165 AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
166 EXPECT_TRUE(ais->Open());
168 TestInputCallback test_callback(kSamplesPerPacket * 4);
169 ais->Start(&test_callback);
170 // Verify at least 500ms worth of audio was recorded, after giving sufficient
172 message_loop.PostDelayedTask(
174 base::MessageLoop::QuitClosure(),
175 base::TimeDelta::FromMilliseconds(690));
177 EXPECT_GE(test_callback.callback_count(), 1);
178 EXPECT_FALSE(test_callback.had_error());