OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "content/browser/media/capture/web_contents_audio_input_stream.h" | 5 #include "content/browser/media/capture/web_contents_audio_input_stream.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 using ::testing::_; | 27 using ::testing::_; |
28 using ::testing::Assign; | 28 using ::testing::Assign; |
29 using ::testing::DoAll; | 29 using ::testing::DoAll; |
30 using ::testing::Invoke; | 30 using ::testing::Invoke; |
31 using ::testing::InvokeWithoutArgs; | 31 using ::testing::InvokeWithoutArgs; |
32 using ::testing::NotNull; | 32 using ::testing::NotNull; |
33 using ::testing::SaveArg; | 33 using ::testing::SaveArg; |
34 using ::testing::WithArgs; | 34 using ::testing::WithArgs; |
35 | 35 |
| 36 using media::AudioBus; |
36 using media::AudioInputStream; | 37 using media::AudioInputStream; |
37 using media::AudioOutputStream; | 38 using media::AudioOutputStream; |
38 using media::AudioParameters; | 39 using media::AudioParameters; |
| 40 using media::AudioPushSink; |
39 using media::SineWaveAudioSource; | 41 using media::SineWaveAudioSource; |
40 using media::VirtualAudioInputStream; | 42 using media::VirtualAudioInputStream; |
41 using media::VirtualAudioOutputStream; | 43 using media::VirtualAudioOutputStream; |
42 | 44 |
43 namespace content { | 45 namespace content { |
44 | 46 |
45 namespace { | 47 namespace { |
46 | 48 |
47 const int kRenderProcessId = 123; | 49 const int kRenderProcessId = 123; |
48 const int kRenderFrameId = 456; | 50 const int kRenderFrameId = 456; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 ON_CALL(*this, SetVolume(_)) | 114 ON_CALL(*this, SetVolume(_)) |
113 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::SetVolume)); | 115 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::SetVolume)); |
114 ON_CALL(*this, GetVolume()) | 116 ON_CALL(*this, GetVolume()) |
115 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::GetVolume)); | 117 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::GetVolume)); |
116 ON_CALL(*this, SetAutomaticGainControl(_)) | 118 ON_CALL(*this, SetAutomaticGainControl(_)) |
117 .WillByDefault( | 119 .WillByDefault( |
118 Invoke(&real_, &VirtualAudioInputStream::SetAutomaticGainControl)); | 120 Invoke(&real_, &VirtualAudioInputStream::SetAutomaticGainControl)); |
119 ON_CALL(*this, GetAutomaticGainControl()) | 121 ON_CALL(*this, GetAutomaticGainControl()) |
120 .WillByDefault( | 122 .WillByDefault( |
121 Invoke(&real_, &VirtualAudioInputStream::GetAutomaticGainControl)); | 123 Invoke(&real_, &VirtualAudioInputStream::GetAutomaticGainControl)); |
122 ON_CALL(*this, AddOutputStream(NotNull(), _)) | 124 ON_CALL(*this, AddInputProvider(NotNull(), _)) |
123 .WillByDefault( | 125 .WillByDefault( |
124 Invoke(&real_, &VirtualAudioInputStream::AddOutputStream)); | 126 Invoke(&real_, &VirtualAudioInputStream::AddInputProvider)); |
125 ON_CALL(*this, RemoveOutputStream(NotNull(), _)) | 127 ON_CALL(*this, RemoveInputProvider(NotNull(), _)) |
126 .WillByDefault( | 128 .WillByDefault( |
127 Invoke(&real_, &VirtualAudioInputStream::RemoveOutputStream)); | 129 Invoke(&real_, &VirtualAudioInputStream::RemoveInputProvider)); |
128 } | 130 } |
129 | 131 |
130 ~MockVirtualAudioInputStream() { | 132 ~MockVirtualAudioInputStream() { |
131 DCHECK(real_stream_is_closed_); | 133 DCHECK(real_stream_is_closed_); |
132 } | 134 } |
133 | 135 |
134 MOCK_METHOD0(Open, bool()); | 136 MOCK_METHOD0(Open, bool()); |
135 MOCK_METHOD1(Start, void(AudioInputStream::AudioInputCallback*)); | 137 MOCK_METHOD1(Start, void(AudioInputStream::AudioInputCallback*)); |
136 MOCK_METHOD0(Stop, void()); | 138 MOCK_METHOD0(Stop, void()); |
137 MOCK_METHOD0(Close, void()); | 139 MOCK_METHOD0(Close, void()); |
138 MOCK_METHOD0(GetMaxVolume, double()); | 140 MOCK_METHOD0(GetMaxVolume, double()); |
139 MOCK_METHOD1(SetVolume, void(double)); | 141 MOCK_METHOD1(SetVolume, void(double)); |
140 MOCK_METHOD0(GetVolume, double()); | 142 MOCK_METHOD0(GetVolume, double()); |
141 MOCK_METHOD1(SetAutomaticGainControl, bool(bool)); | 143 MOCK_METHOD1(SetAutomaticGainControl, bool(bool)); |
142 MOCK_METHOD0(GetAutomaticGainControl, bool()); | 144 MOCK_METHOD0(GetAutomaticGainControl, bool()); |
143 MOCK_METHOD2(AddOutputStream, void(VirtualAudioOutputStream*, | 145 MOCK_METHOD2(AddInputProvider, |
144 const AudioParameters&)); | 146 void(media::AudioConverter::InputCallback*, |
145 MOCK_METHOD2(RemoveOutputStream, void(VirtualAudioOutputStream*, | 147 const AudioParameters&)); |
146 const AudioParameters&)); | 148 MOCK_METHOD2(RemoveInputProvider, |
| 149 void(media::AudioConverter::InputCallback*, |
| 150 const AudioParameters&)); |
147 | 151 |
148 private: | 152 private: |
149 void OnRealStreamHasClosed(VirtualAudioInputStream* stream) { | 153 void OnRealStreamHasClosed(VirtualAudioInputStream* stream) { |
150 DCHECK_EQ(&real_, stream); | 154 DCHECK_EQ(&real_, stream); |
151 DCHECK(!real_stream_is_closed_); | 155 DCHECK(!real_stream_is_closed_); |
152 real_stream_is_closed_ = true; | 156 real_stream_is_closed_ = true; |
153 } | 157 } |
154 | 158 |
155 VirtualAudioInputStream real_; | 159 VirtualAudioInputStream real_; |
156 bool real_stream_is_closed_; | 160 bool real_stream_is_closed_; |
(...skipping 11 matching lines...) Expand all Loading... |
168 uint32_t hardware_delay_bytes, | 172 uint32_t hardware_delay_bytes, |
169 double volume)); | 173 double volume)); |
170 MOCK_METHOD1(OnError, void(AudioInputStream* stream)); | 174 MOCK_METHOD1(OnError, void(AudioInputStream* stream)); |
171 | 175 |
172 private: | 176 private: |
173 DISALLOW_COPY_AND_ASSIGN(MockAudioInputCallback); | 177 DISALLOW_COPY_AND_ASSIGN(MockAudioInputCallback); |
174 }; | 178 }; |
175 | 179 |
176 } // namespace | 180 } // namespace |
177 | 181 |
178 class WebContentsAudioInputStreamTest : public testing::Test { | 182 class WebContentsAudioInputStreamTest : public testing::TestWithParam<bool> { |
179 public: | 183 public: |
180 WebContentsAudioInputStreamTest() | 184 WebContentsAudioInputStreamTest() |
181 : thread_bundle_(new TestBrowserThreadBundle( | 185 : thread_bundle_(new TestBrowserThreadBundle( |
182 TestBrowserThreadBundle::REAL_IO_THREAD)), | 186 TestBrowserThreadBundle::REAL_IO_THREAD)), |
183 audio_thread_("Audio thread"), | 187 audio_thread_("Audio thread"), |
184 mock_mirroring_manager_(new MockAudioMirroringManager()), | 188 mock_mirroring_manager_(new MockAudioMirroringManager()), |
185 mock_tracker_(new MockWebContentsTracker()), | 189 mock_tracker_(new MockWebContentsTracker()), |
186 mock_vais_(NULL), | 190 mock_vais_(NULL), |
187 wcais_(NULL), | 191 wcais_(NULL), |
188 destination_(NULL), | 192 destination_(NULL), |
189 current_render_process_id_(kRenderProcessId), | 193 current_render_process_id_(kRenderProcessId), |
190 current_render_frame_id_(kRenderFrameId), | 194 current_render_frame_id_(kRenderFrameId), |
191 on_data_event_(false, false) { | 195 on_data_event_(false, false) { |
192 audio_thread_.Start(); | 196 audio_thread_.Start(); |
193 } | 197 } |
194 | 198 |
195 ~WebContentsAudioInputStreamTest() override { | 199 ~WebContentsAudioInputStreamTest() override { |
196 audio_thread_.Stop(); | 200 audio_thread_.Stop(); |
197 thread_bundle_.reset(); | 201 thread_bundle_.reset(); |
198 | 202 |
199 DCHECK(!mock_vais_); | 203 DCHECK(!mock_vais_); |
200 DCHECK(!wcais_); | 204 DCHECK(!wcais_); |
201 EXPECT_FALSE(destination_); | 205 EXPECT_FALSE(destination_); |
202 DCHECK(streams_.empty()); | 206 DCHECK(streams_.empty()); |
203 DCHECK(sources_.empty()); | 207 DCHECK(sources_.empty()); |
204 } | 208 } |
205 | 209 |
| 210 // If this value is true, we are testing a WebContentsAudioInputStream |
| 211 // instance, which requests duplicate audio. |
| 212 // Otherwise, we are testing a WebContentsAudioInputStream instance, which |
| 213 // requests diverting audio. |
| 214 bool is_duplication() const { return GetParam(); } |
| 215 |
206 void Open() { | 216 void Open() { |
207 mock_vais_ = new MockVirtualAudioInputStream(audio_thread_.task_runner()); | 217 mock_vais_ = new MockVirtualAudioInputStream(audio_thread_.task_runner()); |
208 EXPECT_CALL(*mock_vais_, Open()); | 218 EXPECT_CALL(*mock_vais_, Open()); |
209 EXPECT_CALL(*mock_vais_, Close()); // At Close() time. | 219 EXPECT_CALL(*mock_vais_, Close()); // At Close() time. |
210 | 220 |
211 ASSERT_EQ(kRenderProcessId, current_render_process_id_); | 221 ASSERT_EQ(kRenderProcessId, current_render_process_id_); |
212 ASSERT_EQ(kRenderFrameId, current_render_frame_id_); | 222 ASSERT_EQ(kRenderFrameId, current_render_frame_id_); |
213 EXPECT_CALL(*mock_tracker_.get(), | 223 EXPECT_CALL(*mock_tracker_.get(), |
214 Start(kRenderProcessId, kRenderFrameId, _)) | 224 Start(kRenderProcessId, kRenderFrameId, _)) |
215 .WillOnce(DoAll( | 225 .WillOnce(DoAll( |
216 SaveArg<2>(&change_callback_), | 226 SaveArg<2>(&change_callback_), |
217 WithArgs<0, 1>(Invoke(this, | 227 WithArgs<0, 1>(Invoke(this, |
218 &WebContentsAudioInputStreamTest:: | 228 &WebContentsAudioInputStreamTest:: |
219 SimulateChangeCallback)))); | 229 SimulateChangeCallback)))); |
220 | 230 |
221 EXPECT_CALL(*mock_tracker_.get(), Stop()); // At Close() time. | 231 EXPECT_CALL(*mock_tracker_.get(), Stop()); // At Close() time. |
222 | 232 |
223 wcais_ = new WebContentsAudioInputStream( | 233 wcais_ = new WebContentsAudioInputStream( |
224 current_render_process_id_, current_render_frame_id_, | 234 current_render_process_id_, current_render_frame_id_, |
225 mock_mirroring_manager_.get(), | 235 mock_mirroring_manager_.get(), mock_tracker_, mock_vais_, |
226 mock_tracker_, mock_vais_); | 236 is_duplication()); |
227 wcais_->Open(); | 237 wcais_->Open(); |
228 } | 238 } |
229 | 239 |
230 void Start() { | 240 void Start() { |
231 EXPECT_CALL(*mock_vais_, Start(&mock_input_callback_)); | 241 EXPECT_CALL(*mock_vais_, Start(&mock_input_callback_)); |
232 EXPECT_CALL(*mock_vais_, Stop()); // At Stop() time. | 242 EXPECT_CALL(*mock_vais_, Stop()); // At Stop() time. |
233 | 243 |
234 EXPECT_CALL(*mock_mirroring_manager_, StartMirroring(NotNull())) | 244 EXPECT_CALL(*mock_mirroring_manager_, StartMirroring(NotNull())) |
235 .WillOnce(SaveArg<0>(&destination_)) | 245 .WillOnce(SaveArg<0>(&destination_)) |
236 .RetiresOnSaturation(); | 246 .RetiresOnSaturation(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 // Note: WCAIS posts a task to invoke | 280 // Note: WCAIS posts a task to invoke |
271 // MockAudioMirroringManager::StartMirroring() on the IO thread, which | 281 // MockAudioMirroringManager::StartMirroring() on the IO thread, which |
272 // causes our mock to set |destination_|. Block until that has happened. | 282 // causes our mock to set |destination_|. Block until that has happened. |
273 base::WaitableEvent done(false, false); | 283 base::WaitableEvent done(false, false); |
274 BrowserThread::PostTask( | 284 BrowserThread::PostTask( |
275 BrowserThread::IO, FROM_HERE, base::Bind( | 285 BrowserThread::IO, FROM_HERE, base::Bind( |
276 &base::WaitableEvent::Signal, base::Unretained(&done))); | 286 &base::WaitableEvent::Signal, base::Unretained(&done))); |
277 done.Wait(); | 287 done.Wait(); |
278 ASSERT_TRUE(destination_); | 288 ASSERT_TRUE(destination_); |
279 | 289 |
280 EXPECT_CALL(*mock_vais_, AddOutputStream(NotNull(), _)) | 290 EXPECT_CALL(*mock_vais_, AddInputProvider(NotNull(), _)) |
281 .RetiresOnSaturation(); | 291 .RetiresOnSaturation(); |
282 // Later, when stream is closed: | 292 // Later, when stream is closed: |
283 EXPECT_CALL(*mock_vais_, RemoveOutputStream(NotNull(), _)) | 293 EXPECT_CALL(*mock_vais_, RemoveInputProvider(NotNull(), _)) |
284 .RetiresOnSaturation(); | 294 .RetiresOnSaturation(); |
285 | 295 |
286 const AudioParameters& params = TestAudioParameters(); | 296 const AudioParameters& params = TestAudioParameters(); |
287 AudioOutputStream* const out = destination_->AddInput(params); | |
288 ASSERT_TRUE(out); | |
289 streams_.push_back(out); | |
290 EXPECT_TRUE(out->Open()); | |
291 SineWaveAudioSource* const source = new SineWaveAudioSource( | 297 SineWaveAudioSource* const source = new SineWaveAudioSource( |
292 params.channel_layout(), 200.0, params.sample_rate()); | 298 params.channel_layout(), 200.0, params.sample_rate()); |
293 sources_.push_back(source); | 299 sources_.push_back(source); |
294 out->Start(source); | 300 if (is_duplication()) { |
| 301 media::AudioPushSink* out = destination_->AddPushInput(params); |
| 302 ASSERT_TRUE(out); |
| 303 sinks_.push_back(out); |
| 304 std::unique_ptr<media::AudioBus> audio_data = AudioBus::Create(params); |
| 305 base::TimeTicks now = base::TimeTicks::Now(); |
| 306 // 20 Audio buses are enough for all test cases. |
| 307 const int kAudioBusesNumber = 20; |
| 308 for (int i = 0; i < kAudioBusesNumber; i++) { |
| 309 int frames = source->OnMoreData(audio_data.get(), 0, 0); |
| 310 std::unique_ptr<media::AudioBus> copy = AudioBus::Create(params); |
| 311 audio_data->CopyTo(copy.get()); |
| 312 out->OnData(std::move(copy), now); |
| 313 now += base::TimeDelta::FromMillisecondsD( |
| 314 frames * params.GetMicrosecondsPerFrame()); |
| 315 } |
| 316 } else { |
| 317 AudioOutputStream* const out = destination_->AddInput(params); |
| 318 ASSERT_TRUE(out); |
| 319 streams_.push_back(out); |
| 320 EXPECT_TRUE(out->Open()); |
| 321 out->Start(source); |
| 322 } |
295 } | 323 } |
296 | 324 |
297 void RemoveOneInputInFIFOOrder() { | 325 void RemoveOneInputInFIFOOrder() { |
298 ASSERT_FALSE(streams_.empty()); | 326 if (is_duplication()) { |
299 AudioOutputStream* const out = streams_.front(); | 327 ASSERT_FALSE(sinks_.empty()); |
300 streams_.pop_front(); | 328 AudioPushSink* const out = sinks_.front(); |
301 out->Stop(); | 329 sinks_.pop_front(); |
302 out->Close(); // Self-deletes. | 330 out->Close(); // Self-deletes. |
| 331 } else { |
| 332 ASSERT_FALSE(streams_.empty()); |
| 333 AudioOutputStream* const out = streams_.front(); |
| 334 streams_.pop_front(); |
| 335 out->Stop(); |
| 336 out->Close(); // Self-deletes. |
| 337 } |
303 ASSERT_TRUE(!sources_.empty()); | 338 ASSERT_TRUE(!sources_.empty()); |
304 delete sources_.front(); | 339 delete sources_.front(); |
305 sources_.pop_front(); | 340 sources_.pop_front(); |
306 } | 341 } |
307 | 342 |
308 void ChangeMirroringTarget() { | 343 void ChangeMirroringTarget() { |
309 const int next_render_process_id = | 344 const int next_render_process_id = |
310 current_render_process_id_ == kRenderProcessId ? | 345 current_render_process_id_ == kRenderProcessId ? |
311 kAnotherRenderProcessId : kRenderProcessId; | 346 kAnotherRenderProcessId : kRenderProcessId; |
312 const int next_render_frame_id = | 347 const int next_render_frame_id = |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 // to simulate: 1) calls to AddInput(); and 2) diverting audio data. | 418 // to simulate: 1) calls to AddInput(); and 2) diverting audio data. |
384 AudioMirroringManager::MirroringDestination* destination_; | 419 AudioMirroringManager::MirroringDestination* destination_; |
385 | 420 |
386 // Current target RenderFrame. These get flipped in ChangedMirroringTarget(). | 421 // Current target RenderFrame. These get flipped in ChangedMirroringTarget(). |
387 int current_render_process_id_; | 422 int current_render_process_id_; |
388 int current_render_frame_id_; | 423 int current_render_frame_id_; |
389 | 424 |
390 // Streams provided by calls to WebContentsAudioInputStream::AddInput(). Each | 425 // Streams provided by calls to WebContentsAudioInputStream::AddInput(). Each |
391 // is started with a simulated source of audio data. | 426 // is started with a simulated source of audio data. |
392 std::list<AudioOutputStream*> streams_; | 427 std::list<AudioOutputStream*> streams_; |
| 428 std::list<media::AudioPushSink*> sinks_; |
393 std::list<SineWaveAudioSource*> sources_; // 1:1 with elements in streams_. | 429 std::list<SineWaveAudioSource*> sources_; // 1:1 with elements in streams_. |
394 | 430 |
395 base::WaitableEvent on_data_event_; | 431 base::WaitableEvent on_data_event_; |
396 | 432 |
397 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStreamTest); | 433 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStreamTest); |
398 }; | 434 }; |
399 | 435 |
400 #define RUN_ON_AUDIO_THREAD(method) \ | 436 #define RUN_ON_AUDIO_THREAD(method) \ |
401 RunOnAudioThread(base::Bind(&WebContentsAudioInputStreamTest::method, \ | 437 RunOnAudioThread(base::Bind(&WebContentsAudioInputStreamTest::method, \ |
402 base::Unretained(this))) | 438 base::Unretained(this))) |
403 | 439 |
404 TEST_F(WebContentsAudioInputStreamTest, OpenedButNeverStarted) { | 440 TEST_P(WebContentsAudioInputStreamTest, OpenedButNeverStarted) { |
405 RUN_ON_AUDIO_THREAD(Open); | 441 RUN_ON_AUDIO_THREAD(Open); |
406 RUN_ON_AUDIO_THREAD(Close); | 442 RUN_ON_AUDIO_THREAD(Close); |
407 } | 443 } |
408 | 444 |
409 TEST_F(WebContentsAudioInputStreamTest, MirroringNothing) { | 445 TEST_P(WebContentsAudioInputStreamTest, MirroringNothing) { |
410 RUN_ON_AUDIO_THREAD(Open); | 446 RUN_ON_AUDIO_THREAD(Open); |
411 RUN_ON_AUDIO_THREAD(Start); | 447 RUN_ON_AUDIO_THREAD(Start); |
412 WaitForData(); | 448 WaitForData(); |
413 RUN_ON_AUDIO_THREAD(Stop); | 449 RUN_ON_AUDIO_THREAD(Stop); |
414 RUN_ON_AUDIO_THREAD(Close); | 450 RUN_ON_AUDIO_THREAD(Close); |
415 } | 451 } |
416 | 452 |
417 TEST_F(WebContentsAudioInputStreamTest, MirroringOutputOutlivesSession) { | 453 TEST_P(WebContentsAudioInputStreamTest, MirroringOutputOutlivesSession) { |
418 RUN_ON_AUDIO_THREAD(Open); | 454 RUN_ON_AUDIO_THREAD(Open); |
419 RUN_ON_AUDIO_THREAD(Start); | 455 RUN_ON_AUDIO_THREAD(Start); |
420 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 456 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
421 WaitForData(); | 457 WaitForData(); |
422 RUN_ON_AUDIO_THREAD(Stop); | 458 RUN_ON_AUDIO_THREAD(Stop); |
423 RUN_ON_AUDIO_THREAD(Close); | 459 RUN_ON_AUDIO_THREAD(Close); |
424 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 460 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
425 } | 461 } |
426 | 462 |
427 TEST_F(WebContentsAudioInputStreamTest, MirroringOutputWithinSession) { | 463 TEST_P(WebContentsAudioInputStreamTest, MirroringOutputWithinSession) { |
428 RUN_ON_AUDIO_THREAD(Open); | 464 RUN_ON_AUDIO_THREAD(Open); |
429 RUN_ON_AUDIO_THREAD(Start); | 465 RUN_ON_AUDIO_THREAD(Start); |
430 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 466 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
431 WaitForData(); | 467 WaitForData(); |
432 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 468 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
433 RUN_ON_AUDIO_THREAD(Stop); | 469 RUN_ON_AUDIO_THREAD(Stop); |
434 RUN_ON_AUDIO_THREAD(Close); | 470 RUN_ON_AUDIO_THREAD(Close); |
435 } | 471 } |
436 | 472 |
437 TEST_F(WebContentsAudioInputStreamTest, MirroringNothingWithTargetChange) { | 473 TEST_P(WebContentsAudioInputStreamTest, MirroringNothingWithTargetChange) { |
438 RUN_ON_AUDIO_THREAD(Open); | 474 RUN_ON_AUDIO_THREAD(Open); |
439 RUN_ON_AUDIO_THREAD(Start); | 475 RUN_ON_AUDIO_THREAD(Start); |
440 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 476 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
441 RUN_ON_AUDIO_THREAD(Stop); | 477 RUN_ON_AUDIO_THREAD(Stop); |
442 RUN_ON_AUDIO_THREAD(Close); | 478 RUN_ON_AUDIO_THREAD(Close); |
443 } | 479 } |
444 | 480 |
445 TEST_F(WebContentsAudioInputStreamTest, MirroringOneStreamAfterTargetChange) { | 481 TEST_P(WebContentsAudioInputStreamTest, MirroringOneStreamAfterTargetChange) { |
446 RUN_ON_AUDIO_THREAD(Open); | 482 RUN_ON_AUDIO_THREAD(Open); |
447 RUN_ON_AUDIO_THREAD(Start); | 483 RUN_ON_AUDIO_THREAD(Start); |
448 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 484 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
449 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 485 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
450 WaitForData(); | 486 WaitForData(); |
451 RUN_ON_AUDIO_THREAD(Stop); | 487 RUN_ON_AUDIO_THREAD(Stop); |
452 RUN_ON_AUDIO_THREAD(Close); | 488 RUN_ON_AUDIO_THREAD(Close); |
453 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 489 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
454 } | 490 } |
455 | 491 |
456 TEST_F(WebContentsAudioInputStreamTest, MirroringOneStreamWithTargetChange) { | 492 TEST_P(WebContentsAudioInputStreamTest, MirroringOneStreamWithTargetChange) { |
457 RUN_ON_AUDIO_THREAD(Open); | 493 RUN_ON_AUDIO_THREAD(Open); |
458 RUN_ON_AUDIO_THREAD(Start); | 494 RUN_ON_AUDIO_THREAD(Start); |
459 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 495 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
460 WaitForData(); | 496 WaitForData(); |
461 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 497 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
462 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 498 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
463 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 499 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
464 WaitForData(); | 500 WaitForData(); |
465 RUN_ON_AUDIO_THREAD(Stop); | 501 RUN_ON_AUDIO_THREAD(Stop); |
466 RUN_ON_AUDIO_THREAD(Close); | 502 RUN_ON_AUDIO_THREAD(Close); |
467 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 503 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
468 } | 504 } |
469 | 505 |
470 TEST_F(WebContentsAudioInputStreamTest, MirroringLostTarget) { | 506 TEST_P(WebContentsAudioInputStreamTest, MirroringLostTarget) { |
471 RUN_ON_AUDIO_THREAD(Open); | 507 RUN_ON_AUDIO_THREAD(Open); |
472 RUN_ON_AUDIO_THREAD(Start); | 508 RUN_ON_AUDIO_THREAD(Start); |
473 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 509 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
474 WaitForData(); | 510 WaitForData(); |
475 RUN_ON_AUDIO_THREAD(LoseMirroringTarget); | 511 RUN_ON_AUDIO_THREAD(LoseMirroringTarget); |
476 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 512 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
477 RUN_ON_AUDIO_THREAD(Stop); | 513 RUN_ON_AUDIO_THREAD(Stop); |
478 RUN_ON_AUDIO_THREAD(Close); | 514 RUN_ON_AUDIO_THREAD(Close); |
479 } | 515 } |
480 | 516 |
481 TEST_F(WebContentsAudioInputStreamTest, MirroringMultipleStreamsAndTargets) { | 517 TEST_P(WebContentsAudioInputStreamTest, MirroringMultipleStreamsAndTargets) { |
482 RUN_ON_AUDIO_THREAD(Open); | 518 RUN_ON_AUDIO_THREAD(Open); |
483 RUN_ON_AUDIO_THREAD(Start); | 519 RUN_ON_AUDIO_THREAD(Start); |
484 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 520 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
485 WaitForData(); | 521 WaitForData(); |
486 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 522 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
487 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 523 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
488 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 524 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
489 WaitForData(); | 525 WaitForData(); |
490 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 526 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
491 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 527 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
492 WaitForData(); | 528 WaitForData(); |
493 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 529 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
494 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 530 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
495 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 531 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
496 WaitForData(); | 532 WaitForData(); |
497 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 533 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
498 WaitForData(); | 534 WaitForData(); |
499 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 535 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
500 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 536 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
501 RUN_ON_AUDIO_THREAD(Stop); | 537 RUN_ON_AUDIO_THREAD(Stop); |
502 RUN_ON_AUDIO_THREAD(Close); | 538 RUN_ON_AUDIO_THREAD(Close); |
503 } | 539 } |
504 | 540 |
| 541 INSTANTIATE_TEST_CASE_P(, WebContentsAudioInputStreamTest, ::testing::Bool()); |
| 542 |
505 } // namespace content | 543 } // namespace content |
OLD | NEW |