| 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 |