OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/environment.h" | 7 #include "base/environment.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
11 #include "base/synchronization/waitable_event.h" | 11 #include "base/synchronization/waitable_event.h" |
12 #include "base/threading/platform_thread.h" | 12 #include "base/threading/platform_thread.h" |
13 #include "media/audio/audio_io.h" | 13 #include "media/audio/audio_io.h" |
14 #include "media/audio/audio_manager_base.h" | 14 #include "media/audio/audio_manager_base.h" |
| 15 #include "media/audio/audio_unittest_utils.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
17 namespace media { | 18 namespace media { |
18 | 19 |
19 // This class allows to find out if the callbacks are occurring as | 20 // This class allows to find out if the callbacks are occurring as |
20 // expected and if any error has been reported. | 21 // expected and if any error has been reported. |
21 class TestInputCallback : public AudioInputStream::AudioInputCallback { | 22 class TestInputCallback : public AudioInputStream::AudioInputCallback { |
22 public: | 23 public: |
23 explicit TestInputCallback() | 24 explicit TestInputCallback() |
24 : callback_count_(0), | 25 : callback_count_(0), |
(...skipping 16 matching lines...) Expand all Loading... |
41 } | 42 } |
42 | 43 |
43 private: | 44 private: |
44 int callback_count_; | 45 int callback_count_; |
45 int had_error_; | 46 int had_error_; |
46 }; | 47 }; |
47 | 48 |
48 class AudioInputTest : public testing::Test { | 49 class AudioInputTest : public testing::Test { |
49 public: | 50 public: |
50 AudioInputTest() : | 51 AudioInputTest() : |
51 message_loop_(base::MessageLoop::TYPE_UI), | 52 message_loop_(base::MessageLoop::TYPE_UI), |
52 audio_manager_(AudioManager::CreateForTesting()), | 53 audio_manager_(AudioManager::CreateForTesting()), |
53 audio_input_stream_(NULL) { | 54 audio_input_stream_(NULL) { |
54 // Wait for the AudioManager to finish any initialization on the audio loop. | 55 // Wait for the AudioManager to finish any initialization on the audio loop. |
55 base::RunLoop().RunUntilIdle(); | 56 base::RunLoop().RunUntilIdle(); |
56 } | 57 } |
57 | 58 |
58 ~AudioInputTest() override { base::RunLoop().RunUntilIdle(); } | 59 ~AudioInputTest() override { base::RunLoop().RunUntilIdle(); } |
59 | 60 |
60 protected: | 61 protected: |
61 AudioManager* audio_manager() { return audio_manager_.get(); } | 62 bool InputDevicesAvailable() { |
62 | 63 return audio_manager_->HasAudioInputDevices(); |
63 bool CanRunAudioTests() { | |
64 bool has_input = audio_manager()->HasAudioInputDevices(); | |
65 LOG_IF(WARNING, !has_input) << "No input devices detected"; | |
66 return has_input; | |
67 } | 64 } |
68 | 65 |
69 void MakeAudioInputStreamOnAudioThread() { | 66 void MakeAudioInputStreamOnAudioThread() { |
70 RunOnAudioThread( | 67 RunOnAudioThread( |
71 base::Bind(&AudioInputTest::MakeAudioInputStream, | 68 base::Bind(&AudioInputTest::MakeAudioInputStream, |
72 base::Unretained(this))); | 69 base::Unretained(this))); |
73 } | 70 } |
74 | 71 |
75 void CloseAudioInputStreamOnAudioThread() { | 72 void CloseAudioInputStreamOnAudioThread() { |
76 RunOnAudioThread( | 73 RunOnAudioThread( |
(...skipping 22 matching lines...) Expand all Loading... |
99 sink)); | 96 sink)); |
100 } | 97 } |
101 | 98 |
102 void StopAndCloseAudioInputStreamOnAudioThread() { | 99 void StopAndCloseAudioInputStreamOnAudioThread() { |
103 RunOnAudioThread( | 100 RunOnAudioThread( |
104 base::Bind(&AudioInputTest::StopAndClose, | 101 base::Bind(&AudioInputTest::StopAndClose, |
105 base::Unretained(this))); | 102 base::Unretained(this))); |
106 } | 103 } |
107 | 104 |
108 void MakeAudioInputStream() { | 105 void MakeAudioInputStream() { |
109 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 106 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
110 AudioParameters params = audio_manager()->GetInputStreamParameters( | 107 AudioParameters params = audio_manager_->GetInputStreamParameters( |
111 AudioManagerBase::kDefaultDeviceId); | 108 AudioManagerBase::kDefaultDeviceId); |
112 audio_input_stream_ = audio_manager()->MakeAudioInputStream(params, | 109 audio_input_stream_ = audio_manager_->MakeAudioInputStream(params, |
113 AudioManagerBase::kDefaultDeviceId); | 110 AudioManagerBase::kDefaultDeviceId); |
114 EXPECT_TRUE(audio_input_stream_); | 111 EXPECT_TRUE(audio_input_stream_); |
115 } | 112 } |
116 | 113 |
117 void OpenAndClose() { | 114 void OpenAndClose() { |
118 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 115 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
119 EXPECT_TRUE(audio_input_stream_->Open()); | 116 EXPECT_TRUE(audio_input_stream_->Open()); |
120 audio_input_stream_->Close(); | 117 audio_input_stream_->Close(); |
121 audio_input_stream_ = NULL; | 118 audio_input_stream_ = NULL; |
122 } | 119 } |
123 | 120 |
124 void OpenAndStart(AudioInputStream::AudioInputCallback* sink) { | 121 void OpenAndStart(AudioInputStream::AudioInputCallback* sink) { |
125 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 122 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
126 EXPECT_TRUE(audio_input_stream_->Open()); | 123 EXPECT_TRUE(audio_input_stream_->Open()); |
127 audio_input_stream_->Start(sink); | 124 audio_input_stream_->Start(sink); |
128 } | 125 } |
129 | 126 |
130 void OpenStopAndClose() { | 127 void OpenStopAndClose() { |
131 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 128 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
132 EXPECT_TRUE(audio_input_stream_->Open()); | 129 EXPECT_TRUE(audio_input_stream_->Open()); |
133 audio_input_stream_->Stop(); | 130 audio_input_stream_->Stop(); |
134 audio_input_stream_->Close(); | 131 audio_input_stream_->Close(); |
135 audio_input_stream_ = NULL; | 132 audio_input_stream_ = NULL; |
136 } | 133 } |
137 | 134 |
138 void StopAndClose() { | 135 void StopAndClose() { |
139 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 136 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
140 audio_input_stream_->Stop(); | 137 audio_input_stream_->Stop(); |
141 audio_input_stream_->Close(); | 138 audio_input_stream_->Close(); |
142 audio_input_stream_ = NULL; | 139 audio_input_stream_ = NULL; |
143 } | 140 } |
144 | 141 |
145 // Synchronously runs the provided callback/closure on the audio thread. | 142 // Synchronously runs the provided callback/closure on the audio thread. |
146 void RunOnAudioThread(const base::Closure& closure) { | 143 void RunOnAudioThread(const base::Closure& closure) { |
147 if (!audio_manager()->GetTaskRunner()->BelongsToCurrentThread()) { | 144 if (!audio_manager_->GetTaskRunner()->BelongsToCurrentThread()) { |
148 base::WaitableEvent event(false, false); | 145 base::WaitableEvent event(false, false); |
149 audio_manager()->GetTaskRunner()->PostTask( | 146 audio_manager_->GetTaskRunner()->PostTask( |
150 FROM_HERE, | 147 FROM_HERE, |
151 base::Bind(&AudioInputTest::RunOnAudioThreadImpl, | 148 base::Bind(&AudioInputTest::RunOnAudioThreadImpl, |
152 base::Unretained(this), | 149 base::Unretained(this), |
153 closure, | 150 closure, |
154 &event)); | 151 &event)); |
155 event.Wait(); | 152 event.Wait(); |
156 } else { | 153 } else { |
157 closure.Run(); | 154 closure.Run(); |
158 } | 155 } |
159 } | 156 } |
160 | 157 |
161 void RunOnAudioThreadImpl(const base::Closure& closure, | 158 void RunOnAudioThreadImpl(const base::Closure& closure, |
162 base::WaitableEvent* event) { | 159 base::WaitableEvent* event) { |
163 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 160 DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
164 closure.Run(); | 161 closure.Run(); |
165 event->Signal(); | 162 event->Signal(); |
166 } | 163 } |
167 | 164 |
168 base::MessageLoop message_loop_; | 165 base::MessageLoop message_loop_; |
169 scoped_ptr<AudioManager> audio_manager_; | 166 scoped_ptr<AudioManager> audio_manager_; |
170 AudioInputStream* audio_input_stream_; | 167 AudioInputStream* audio_input_stream_; |
171 | 168 |
172 private: | 169 private: |
173 DISALLOW_COPY_AND_ASSIGN(AudioInputTest); | 170 DISALLOW_COPY_AND_ASSIGN(AudioInputTest); |
174 }; | 171 }; |
175 | 172 |
176 // Test create and close of an AudioInputStream without recording audio. | 173 // Test create and close of an AudioInputStream without recording audio. |
177 TEST_F(AudioInputTest, CreateAndClose) { | 174 TEST_F(AudioInputTest, CreateAndClose) { |
178 if (!CanRunAudioTests()) | 175 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
179 return; | |
180 MakeAudioInputStreamOnAudioThread(); | 176 MakeAudioInputStreamOnAudioThread(); |
181 CloseAudioInputStreamOnAudioThread(); | 177 CloseAudioInputStreamOnAudioThread(); |
182 } | 178 } |
183 | 179 |
184 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 180 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
185 // This test is failing on ARM linux: http://crbug.com/238490 | 181 // This test is failing on ARM linux: http://crbug.com/238490 |
186 #define MAYBE_OpenAndClose DISABLED_OpenAndClose | 182 #define MAYBE_OpenAndClose DISABLED_OpenAndClose |
187 #else | 183 #else |
188 #define MAYBE_OpenAndClose OpenAndClose | 184 #define MAYBE_OpenAndClose OpenAndClose |
189 #endif | 185 #endif |
190 // Test create, open and close of an AudioInputStream without recording audio. | 186 // Test create, open and close of an AudioInputStream without recording audio. |
191 TEST_F(AudioInputTest, MAYBE_OpenAndClose) { | 187 TEST_F(AudioInputTest, MAYBE_OpenAndClose) { |
192 if (!CanRunAudioTests()) | 188 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
193 return; | |
194 MakeAudioInputStreamOnAudioThread(); | 189 MakeAudioInputStreamOnAudioThread(); |
195 OpenAndCloseAudioInputStreamOnAudioThread(); | 190 OpenAndCloseAudioInputStreamOnAudioThread(); |
196 } | 191 } |
197 | 192 |
198 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 193 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
199 // This test is failing on ARM linux: http://crbug.com/238490 | 194 // This test is failing on ARM linux: http://crbug.com/238490 |
200 #define MAYBE_OpenStopAndClose DISABLED_OpenStopAndClose | 195 #define MAYBE_OpenStopAndClose DISABLED_OpenStopAndClose |
201 #else | 196 #else |
202 #define MAYBE_OpenStopAndClose OpenStopAndClose | 197 #define MAYBE_OpenStopAndClose OpenStopAndClose |
203 #endif | 198 #endif |
204 // Test create, open, stop and close of an AudioInputStream without recording. | 199 // Test create, open, stop and close of an AudioInputStream without recording. |
205 TEST_F(AudioInputTest, MAYBE_OpenStopAndClose) { | 200 TEST_F(AudioInputTest, MAYBE_OpenStopAndClose) { |
206 if (!CanRunAudioTests()) | 201 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
207 return; | |
208 MakeAudioInputStreamOnAudioThread(); | 202 MakeAudioInputStreamOnAudioThread(); |
209 OpenStopAndCloseAudioInputStreamOnAudioThread(); | 203 OpenStopAndCloseAudioInputStreamOnAudioThread(); |
210 } | 204 } |
211 | 205 |
212 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 206 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
213 // This test is failing on ARM linux: http://crbug.com/238490 | 207 // This test is failing on ARM linux: http://crbug.com/238490 |
214 #define MAYBE_Record DISABLED_Record | 208 #define MAYBE_Record DISABLED_Record |
215 #else | 209 #else |
216 #define MAYBE_Record Record | 210 #define MAYBE_Record Record |
217 #endif | 211 #endif |
218 // Test a normal recording sequence using an AudioInputStream. | 212 // Test a normal recording sequence using an AudioInputStream. |
219 // Very simple test which starts capturing during half a second and verifies | 213 // Very simple test which starts capturing during half a second and verifies |
220 // that recording starts. | 214 // that recording starts. |
221 TEST_F(AudioInputTest, MAYBE_Record) { | 215 TEST_F(AudioInputTest, MAYBE_Record) { |
222 if (!CanRunAudioTests()) | 216 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
223 return; | |
224 MakeAudioInputStreamOnAudioThread(); | 217 MakeAudioInputStreamOnAudioThread(); |
225 | 218 |
226 TestInputCallback test_callback; | 219 TestInputCallback test_callback; |
227 OpenAndStartAudioInputStreamOnAudioThread(&test_callback); | 220 OpenAndStartAudioInputStreamOnAudioThread(&test_callback); |
228 | 221 |
229 message_loop_.PostDelayedTask( | 222 message_loop_.PostDelayedTask( |
230 FROM_HERE, | 223 FROM_HERE, |
231 base::MessageLoop::QuitClosure(), | 224 base::MessageLoop::QuitClosure(), |
232 base::TimeDelta::FromMilliseconds(500)); | 225 base::TimeDelta::FromMilliseconds(500)); |
233 message_loop_.Run(); | 226 message_loop_.Run(); |
234 EXPECT_GE(test_callback.callback_count(), 2); | 227 EXPECT_GE(test_callback.callback_count(), 2); |
235 EXPECT_FALSE(test_callback.had_error()); | 228 EXPECT_FALSE(test_callback.had_error()); |
236 | 229 |
237 StopAndCloseAudioInputStreamOnAudioThread(); | 230 StopAndCloseAudioInputStreamOnAudioThread(); |
238 } | 231 } |
239 | 232 |
240 } // namespace media | 233 } // namespace media |
OLD | NEW |