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.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
)
27 max_data_bytes_(max_data_bytes
) {
29 virtual void OnData(AudioInputStream
* stream
, const uint8
* data
,
30 uint32 size
, uint32 hardware_delay_bytes
, double volume
) {
32 // Read the first byte to make sure memory is good.
34 ASSERT_LE(static_cast<int>(size
), max_data_bytes_
);
39 virtual void OnClose(AudioInputStream
* stream
) {
42 virtual void OnError(AudioInputStream
* stream
, int code
) {
45 // Returns how many times OnData() has been called.
46 int callback_count() const {
47 return callback_count_
;
49 // Returns how many times the OnError callback was called.
50 int had_error() const {
54 void set_error(bool error
) {
55 had_error_
+= error
? 1 : 0;
57 // Returns how many times the OnClose callback was called.
58 int was_closed() const {
69 static bool CanRunAudioTests(AudioManager
* audio_man
) {
70 bool has_input
= audio_man
->HasAudioInputDevices();
73 LOG(WARNING
) << "No input devices detected";
78 static AudioInputStream
* CreateTestAudioInputStream(AudioManager
* audio_man
) {
79 AudioInputStream
* ais
= audio_man
->MakeAudioInputStream(
80 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR
, CHANNEL_LAYOUT_STEREO
,
81 kSamplingRate
, 16, kSamplesPerPacket
),
82 AudioManagerBase::kDefaultDeviceId
);
83 EXPECT_TRUE(NULL
!= ais
);
87 // Test that AudioInputStream rejects out of range parameters.
88 TEST(AudioInputTest
, SanityOnMakeParams
) {
89 scoped_ptr
<AudioManager
> audio_man(AudioManager::Create());
90 if (!CanRunAudioTests(audio_man
.get()))
93 AudioParameters::Format fmt
= AudioParameters::AUDIO_PCM_LINEAR
;
94 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
95 AudioParameters(fmt
, CHANNEL_LAYOUT_7_1
, 8000, 16,
96 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
97 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
98 AudioParameters(fmt
, CHANNEL_LAYOUT_MONO
, 1024 * 1024, 16,
99 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
100 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
101 AudioParameters(fmt
, CHANNEL_LAYOUT_STEREO
, 8000, 80,
102 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
103 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
104 AudioParameters(fmt
, CHANNEL_LAYOUT_STEREO
, 8000, 80,
105 1000 * kSamplesPerPacket
),
106 AudioManagerBase::kDefaultDeviceId
));
107 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
108 AudioParameters(fmt
, CHANNEL_LAYOUT_UNSUPPORTED
, 8000, 16,
109 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
110 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
111 AudioParameters(fmt
, CHANNEL_LAYOUT_STEREO
, -8000, 16,
112 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
113 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
114 AudioParameters(fmt
, CHANNEL_LAYOUT_STEREO
, 8000, -16,
115 kSamplesPerPacket
), AudioManagerBase::kDefaultDeviceId
));
116 EXPECT_TRUE(NULL
== audio_man
->MakeAudioInputStream(
117 AudioParameters(fmt
, CHANNEL_LAYOUT_STEREO
, 8000, 16, -1024),
118 AudioManagerBase::kDefaultDeviceId
));
121 // Test create and close of an AudioInputStream without recording audio.
122 TEST(AudioInputTest
, CreateAndClose
) {
123 scoped_ptr
<AudioManager
> audio_man(AudioManager::Create());
124 if (!CanRunAudioTests(audio_man
.get()))
126 AudioInputStream
* ais
= CreateTestAudioInputStream(audio_man
.get());
130 // Test create, open and close of an AudioInputStream without recording audio.
131 TEST(AudioInputTest
, OpenAndClose
) {
132 scoped_ptr
<AudioManager
> audio_man(AudioManager::Create());
133 if (!CanRunAudioTests(audio_man
.get()))
135 AudioInputStream
* ais
= CreateTestAudioInputStream(audio_man
.get());
136 EXPECT_TRUE(ais
->Open());
140 // Test create, open, stop and close of an AudioInputStream without recording.
141 TEST(AudioInputTest
, OpenStopAndClose
) {
142 scoped_ptr
<AudioManager
> audio_man(AudioManager::Create());
143 if (!CanRunAudioTests(audio_man
.get()))
145 AudioInputStream
* ais
= CreateTestAudioInputStream(audio_man
.get());
146 EXPECT_TRUE(ais
->Open());
151 // Test a normal recording sequence using an AudioInputStream.
152 TEST(AudioInputTest
, Record
) {
153 scoped_ptr
<AudioManager
> audio_man(AudioManager::Create());
154 if (!CanRunAudioTests(audio_man
.get()))
156 MessageLoop
message_loop(MessageLoop::TYPE_DEFAULT
);
157 AudioInputStream
* ais
= CreateTestAudioInputStream(audio_man
.get());
158 EXPECT_TRUE(ais
->Open());
160 TestInputCallback
test_callback(kSamplesPerPacket
* 4);
161 ais
->Start(&test_callback
);
162 // Verify at least 500ms worth of audio was recorded, after giving sufficient
164 message_loop
.PostDelayedTask(
166 MessageLoop::QuitClosure(),
167 base::TimeDelta::FromMilliseconds(590));
169 EXPECT_GE(test_callback
.callback_count(), 10);
170 EXPECT_FALSE(test_callback
.had_error());