OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/environment.h" | 5 #include "base/environment.h" |
6 #include "base/test/test_timeouts.h" | 6 #include "base/test/test_timeouts.h" |
7 #include "content/renderer/media/webrtc_audio_device_impl.h" | 7 #include "content/renderer/media/webrtc_audio_device_impl.h" |
8 #include "content/test/webrtc_audio_device_test.h" | 8 #include "content/test/webrtc_audio_device_test.h" |
| 9 #include "media/audio/audio_manager.h" |
9 #include "media/audio/audio_util.h" | 10 #include "media/audio/audio_util.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
11 #include "third_party/webrtc/voice_engine/main/interface/voe_audio_processing.h" | 12 #include "third_party/webrtc/voice_engine/main/interface/voe_audio_processing.h" |
12 #include "third_party/webrtc/voice_engine/main/interface/voe_base.h" | 13 #include "third_party/webrtc/voice_engine/main/interface/voe_base.h" |
13 #include "third_party/webrtc/voice_engine/main/interface/voe_external_media.h" | 14 #include "third_party/webrtc/voice_engine/main/interface/voe_external_media.h" |
14 #include "third_party/webrtc/voice_engine/main/interface/voe_file.h" | 15 #include "third_party/webrtc/voice_engine/main/interface/voe_file.h" |
15 #include "third_party/webrtc/voice_engine/main/interface/voe_network.h" | 16 #include "third_party/webrtc/voice_engine/main/interface/voe_network.h" |
16 | 17 |
17 using testing::_; | 18 using testing::_; |
18 using testing::AnyNumber; | 19 using testing::AnyNumber; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 int channel_id_; | 108 int channel_id_; |
108 webrtc::ProcessingTypes type_; | 109 webrtc::ProcessingTypes type_; |
109 int packet_size_; | 110 int packet_size_; |
110 int sample_rate_; | 111 int sample_rate_; |
111 int channels_; | 112 int channels_; |
112 DISALLOW_COPY_AND_ASSIGN(WebRTCMediaProcessImpl); | 113 DISALLOW_COPY_AND_ASSIGN(WebRTCMediaProcessImpl); |
113 }; | 114 }; |
114 | 115 |
115 } // end namespace | 116 } // end namespace |
116 | 117 |
| 118 // Utility class to delete the AudioManager. |
| 119 // TODO(tommi): Remove when we've fixed issue 105249. |
| 120 class AutoAudioManagerCleanup { |
| 121 public: |
| 122 AutoAudioManagerCleanup() { |
| 123 // In order to prevent this from happening, we sacrifice this test even |
| 124 // though some other test must have caused this. If we don't it won't |
| 125 // get fixed. Sorry :) |
| 126 EXPECT_FALSE(DeleteAndResurrect()) |
| 127 << "AudioManager singleton was not cleaned up by some previous test!"; |
| 128 } |
| 129 ~AutoAudioManagerCleanup() { |
| 130 DeleteAndResurrect(); |
| 131 } |
| 132 |
| 133 private: |
| 134 // Returns true iff the AudioManager existed and was deleted. |
| 135 bool DeleteAndResurrect() { |
| 136 if (AudioManager::SingletonExists()) { |
| 137 AudioManager::Destroy(NULL); |
| 138 AudioManager::Resurrect(); |
| 139 return true; |
| 140 } |
| 141 return false; |
| 142 } |
| 143 |
| 144 DISALLOW_COPY_AND_ASSIGN(AutoAudioManagerCleanup); |
| 145 }; |
| 146 |
117 // Basic test that instantiates and initializes an instance of | 147 // Basic test that instantiates and initializes an instance of |
118 // WebRtcAudioDeviceImpl. | 148 // WebRtcAudioDeviceImpl. |
119 TEST_F(WebRTCAudioDeviceTest, Construct) { | 149 TEST_F(WebRTCAudioDeviceTest, Construct) { |
| 150 AutoAudioManagerCleanup audio_manager_cleanup; |
120 AudioUtilNoHardware audio_util(48000.0, 48000.0); | 151 AudioUtilNoHardware audio_util(48000.0, 48000.0); |
121 SetAudioUtilCallback(&audio_util); | 152 SetAudioUtilCallback(&audio_util); |
122 scoped_refptr<WebRtcAudioDeviceImpl> audio_device( | 153 scoped_refptr<WebRtcAudioDeviceImpl> audio_device( |
123 new WebRtcAudioDeviceImpl()); | 154 new WebRtcAudioDeviceImpl()); |
124 audio_device->SetSessionId(1); | 155 audio_device->SetSessionId(1); |
125 | 156 |
126 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); | 157 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); |
127 ASSERT_TRUE(engine.valid()); | 158 ASSERT_TRUE(engine.valid()); |
128 | 159 |
129 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); | 160 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); |
130 int err = base->Init(audio_device); | 161 int err = base->Init(audio_device); |
131 EXPECT_EQ(0, err); | 162 EXPECT_EQ(0, err); |
132 EXPECT_EQ(0, base->Terminate()); | 163 EXPECT_EQ(0, base->Terminate()); |
133 } | 164 } |
134 | 165 |
135 // Verify that a call to webrtc::VoEBase::StartPlayout() starts audio output | 166 // Verify that a call to webrtc::VoEBase::StartPlayout() starts audio output |
136 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will | 167 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will |
137 // be utilized to implement the actual audio path. The test registers a | 168 // be utilized to implement the actual audio path. The test registers a |
138 // webrtc::VoEExternalMedia implementation to hijack the output audio and | 169 // webrtc::VoEExternalMedia implementation to hijack the output audio and |
139 // verify that streaming starts correctly. | 170 // verify that streaming starts correctly. |
140 // Disabled when running headless since the bots don't have the required config. | 171 // Disabled when running headless since the bots don't have the required config. |
141 TEST_F(WebRTCAudioDeviceTest, StartPlayout) { | 172 TEST_F(WebRTCAudioDeviceTest, StartPlayout) { |
| 173 AutoAudioManagerCleanup audio_manager_cleanup; |
| 174 |
142 if (IsRunningHeadless()) | 175 if (IsRunningHeadless()) |
143 return; | 176 return; |
144 | 177 |
145 AudioUtil audio_util; | 178 AudioUtil audio_util; |
146 SetAudioUtilCallback(&audio_util); | 179 SetAudioUtilCallback(&audio_util); |
147 | 180 |
148 EXPECT_CALL(media_observer(), | 181 EXPECT_CALL(media_observer(), |
149 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1); | 182 OnSetAudioStreamStatus(_, 1, StrEq("created"))).Times(1); |
150 EXPECT_CALL(media_observer(), | 183 EXPECT_CALL(media_observer(), |
151 OnSetAudioStreamPlaying(_, 1, true)).Times(1); | 184 OnSetAudioStreamPlaying(_, 1, true)).Times(1); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 // Verify that a call to webrtc::VoEBase::StartRecording() starts audio input | 234 // Verify that a call to webrtc::VoEBase::StartRecording() starts audio input |
202 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will | 235 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will |
203 // be utilized to implement the actual audio path. The test registers a | 236 // be utilized to implement the actual audio path. The test registers a |
204 // webrtc::VoEExternalMedia implementation to hijack the input audio and | 237 // webrtc::VoEExternalMedia implementation to hijack the input audio and |
205 // verify that streaming starts correctly. An external transport implementation | 238 // verify that streaming starts correctly. An external transport implementation |
206 // is also required to ensure that "sending" can start without actually trying | 239 // is also required to ensure that "sending" can start without actually trying |
207 // to send encoded packets to the network. Our main interest here is to ensure | 240 // to send encoded packets to the network. Our main interest here is to ensure |
208 // that the audio capturing starts as it should. | 241 // that the audio capturing starts as it should. |
209 // Disabled when running headless since the bots don't have the required config. | 242 // Disabled when running headless since the bots don't have the required config. |
210 TEST_F(WebRTCAudioDeviceTest, StartRecording) { | 243 TEST_F(WebRTCAudioDeviceTest, StartRecording) { |
| 244 AutoAudioManagerCleanup audio_manager_cleanup; |
| 245 |
211 if (IsRunningHeadless()) | 246 if (IsRunningHeadless()) |
212 return; | 247 return; |
213 | 248 |
214 AudioUtil audio_util; | 249 AudioUtil audio_util; |
215 SetAudioUtilCallback(&audio_util); | 250 SetAudioUtilCallback(&audio_util); |
216 | 251 |
217 // TODO(tommi): extend MediaObserver and MockMediaObserver with support | 252 // TODO(tommi): extend MediaObserver and MockMediaObserver with support |
218 // for new interfaces, like OnSetAudioStreamRecording(). When done, add | 253 // for new interfaces, like OnSetAudioStreamRecording(). When done, add |
219 // EXPECT_CALL() macros here. | 254 // EXPECT_CALL() macros here. |
220 | 255 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 ch, webrtc::kRecordingPerChannel)); | 300 ch, webrtc::kRecordingPerChannel)); |
266 EXPECT_EQ(0, base->StopSend(ch)); | 301 EXPECT_EQ(0, base->StopSend(ch)); |
267 | 302 |
268 EXPECT_EQ(0, base->DeleteChannel(ch)); | 303 EXPECT_EQ(0, base->DeleteChannel(ch)); |
269 EXPECT_EQ(0, base->Terminate()); | 304 EXPECT_EQ(0, base->Terminate()); |
270 } | 305 } |
271 | 306 |
272 // Uses WebRtcAudioDeviceImpl to play a local wave file. | 307 // Uses WebRtcAudioDeviceImpl to play a local wave file. |
273 // Disabled when running headless since the bots don't have the required config. | 308 // Disabled when running headless since the bots don't have the required config. |
274 TEST_F(WebRTCAudioDeviceTest, PlayLocalFile) { | 309 TEST_F(WebRTCAudioDeviceTest, PlayLocalFile) { |
| 310 AutoAudioManagerCleanup audio_manager_cleanup; |
| 311 |
275 if (IsRunningHeadless()) | 312 if (IsRunningHeadless()) |
276 return; | 313 return; |
277 | 314 |
278 std::string file_path( | 315 std::string file_path( |
279 GetTestDataPath(FILE_PATH_LITERAL("speechmusic_mono_16kHz.pcm"))); | 316 GetTestDataPath(FILE_PATH_LITERAL("speechmusic_mono_16kHz.pcm"))); |
280 | 317 |
281 AudioUtil audio_util; | 318 AudioUtil audio_util; |
282 SetAudioUtilCallback(&audio_util); | 319 SetAudioUtilCallback(&audio_util); |
283 | 320 |
284 EXPECT_CALL(media_observer(), | 321 EXPECT_CALL(media_observer(), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 | 362 |
326 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback. | 363 // Uses WebRtcAudioDeviceImpl to play out recorded audio in loopback. |
327 // An external transport implementation is utilized to feed back RTP packets | 364 // An external transport implementation is utilized to feed back RTP packets |
328 // which are recorded, encoded, packetized into RTP packets and finally | 365 // which are recorded, encoded, packetized into RTP packets and finally |
329 // "transmitted". The RTP packets are then fed back into the VoiceEngine | 366 // "transmitted". The RTP packets are then fed back into the VoiceEngine |
330 // where they are decoded and played out on the default audio output device. | 367 // where they are decoded and played out on the default audio output device. |
331 // Disabled when running headless since the bots don't have the required config. | 368 // Disabled when running headless since the bots don't have the required config. |
332 // TODO(henrika): improve quality by using a wideband codec, enabling noise- | 369 // TODO(henrika): improve quality by using a wideband codec, enabling noise- |
333 // suppressions and perhaps also the digital AGC. | 370 // suppressions and perhaps also the digital AGC. |
334 TEST_F(WebRTCAudioDeviceTest, FullDuplexAudio) { | 371 TEST_F(WebRTCAudioDeviceTest, FullDuplexAudio) { |
| 372 AutoAudioManagerCleanup audio_manager_cleanup; |
| 373 |
335 if (IsRunningHeadless()) | 374 if (IsRunningHeadless()) |
336 return; | 375 return; |
337 | 376 |
338 EXPECT_CALL(media_observer(), | 377 EXPECT_CALL(media_observer(), |
339 OnSetAudioStreamStatus(_, 1, StrEq("created"))); | 378 OnSetAudioStreamStatus(_, 1, StrEq("created"))); |
340 EXPECT_CALL(media_observer(), | 379 EXPECT_CALL(media_observer(), |
341 OnSetAudioStreamPlaying(_, 1, true)); | 380 OnSetAudioStreamPlaying(_, 1, true)); |
342 EXPECT_CALL(media_observer(), | 381 EXPECT_CALL(media_observer(), |
343 OnSetAudioStreamStatus(_, 1, StrEq("closed"))); | 382 OnSetAudioStreamStatus(_, 1, StrEq("closed"))); |
| 383 EXPECT_CALL(media_observer(), |
| 384 OnDeleteAudioStream(_, 1)).Times(AnyNumber()); |
344 | 385 |
345 AudioUtil audio_util; | 386 AudioUtil audio_util; |
346 SetAudioUtilCallback(&audio_util); | 387 SetAudioUtilCallback(&audio_util); |
347 | 388 |
348 scoped_refptr<WebRtcAudioDeviceImpl> audio_device( | 389 scoped_refptr<WebRtcAudioDeviceImpl> audio_device( |
349 new WebRtcAudioDeviceImpl()); | 390 new WebRtcAudioDeviceImpl()); |
350 audio_device->SetSessionId(1); | 391 audio_device->SetSessionId(1); |
351 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); | 392 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); |
352 ASSERT_TRUE(engine.valid()); | 393 ASSERT_TRUE(engine.valid()); |
353 | 394 |
(...skipping 17 matching lines...) Expand all Loading... |
371 new MessageLoop::QuitTask(), | 412 new MessageLoop::QuitTask(), |
372 TestTimeouts::action_timeout_ms()); | 413 TestTimeouts::action_timeout_ms()); |
373 message_loop_.Run(); | 414 message_loop_.Run(); |
374 | 415 |
375 EXPECT_EQ(0, base->StopSend(ch)); | 416 EXPECT_EQ(0, base->StopSend(ch)); |
376 EXPECT_EQ(0, base->StopPlayout(ch)); | 417 EXPECT_EQ(0, base->StopPlayout(ch)); |
377 | 418 |
378 EXPECT_EQ(0, base->DeleteChannel(ch)); | 419 EXPECT_EQ(0, base->DeleteChannel(ch)); |
379 EXPECT_EQ(0, base->Terminate()); | 420 EXPECT_EQ(0, base->Terminate()); |
380 } | 421 } |
OLD | NEW |