Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/modules/audio_processing/audio_processing_impl.h" | 11 #include "webrtc/modules/audio_processing/audio_processing_impl.h" |
| 12 | 12 |
| 13 #include <algorithm> | 13 #include <algorithm> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "webrtc/base/array_view.h" | 17 #include "webrtc/base/array_view.h" |
| 18 #include "webrtc/base/criticalsection.h" | 18 #include "webrtc/base/criticalsection.h" |
| 19 #include "webrtc/base/event.h" | |
| 19 #include "webrtc/base/platform_thread.h" | 20 #include "webrtc/base/platform_thread.h" |
| 20 #include "webrtc/config.h" | 21 #include "webrtc/config.h" |
| 21 #include "webrtc/modules/audio_processing/test/test_utils.h" | 22 #include "webrtc/modules/audio_processing/test/test_utils.h" |
| 22 #include "webrtc/modules/include/module_common_types.h" | 23 #include "webrtc/modules/include/module_common_types.h" |
| 23 #include "webrtc/system_wrappers/include/event_wrapper.h" | |
| 24 #include "webrtc/system_wrappers/include/sleep.h" | 24 #include "webrtc/system_wrappers/include/sleep.h" |
| 25 #include "webrtc/test/random.h" | 25 #include "webrtc/test/random.h" |
| 26 | 26 |
| 27 namespace webrtc { | 27 namespace webrtc { |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 class AudioProcessingImplLockTest; | 31 class AudioProcessingImplLockTest; |
| 32 | 32 |
| 33 // Type of the render thread APM API call to use in the test. | 33 // Type of the render thread APM API call to use in the test. |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 void IncreaseRenderCounter() { | 266 void IncreaseRenderCounter() { |
| 267 rtc::CritScope cs(&crit_); | 267 rtc::CritScope cs(&crit_); |
| 268 render_count++; | 268 render_count++; |
| 269 } | 269 } |
| 270 | 270 |
| 271 void IncreaseCaptureCounter() { | 271 void IncreaseCaptureCounter() { |
| 272 rtc::CritScope cs(&crit_); | 272 rtc::CritScope cs(&crit_); |
| 273 capture_count++; | 273 capture_count++; |
| 274 } | 274 } |
| 275 | 275 |
| 276 int GetCaptureCounter() { | 276 int GetCaptureCounter() const { |
| 277 rtc::CritScope cs(&crit_); | 277 rtc::CritScope cs(&crit_); |
| 278 return capture_count; | 278 return capture_count; |
| 279 } | 279 } |
| 280 | 280 |
| 281 int GetRenderCounter() { | 281 int GetRenderCounter() const { |
| 282 rtc::CritScope cs(&crit_); | 282 rtc::CritScope cs(&crit_); |
| 283 return render_count; | 283 return render_count; |
| 284 } | 284 } |
| 285 | 285 |
| 286 int CaptureMinusRenderCounters() { | 286 int CaptureMinusRenderCounters() const { |
| 287 rtc::CritScope cs(&crit_); | 287 rtc::CritScope cs(&crit_); |
| 288 return capture_count - render_count; | 288 return capture_count - render_count; |
| 289 } | 289 } |
| 290 | 290 |
| 291 int RenderMinusCaptureCounters() const { | |
| 292 return -CaptureMinusRenderCounters(); | |
| 293 } | |
| 294 | |
| 291 bool BothCountersExceedeThreshold(int threshold) { | 295 bool BothCountersExceedeThreshold(int threshold) { |
| 292 rtc::CritScope cs(&crit_); | 296 rtc::CritScope cs(&crit_); |
| 293 return (render_count > threshold && capture_count > threshold); | 297 return (render_count > threshold && capture_count > threshold); |
| 294 } | 298 } |
| 295 | 299 |
| 296 private: | 300 private: |
| 297 rtc::CriticalSection crit_; | 301 mutable rtc::CriticalSection crit_; |
| 298 int render_count GUARDED_BY(crit_) = 0; | 302 int render_count GUARDED_BY(crit_) = 0; |
| 299 int capture_count GUARDED_BY(crit_) = 0; | 303 int capture_count GUARDED_BY(crit_) = 0; |
| 300 }; | 304 }; |
| 301 | 305 |
| 302 // Checker for whether the capture side has been called. | |
| 303 class CaptureSideCalledChecker { | |
| 304 public: | |
| 305 bool CaptureSideCalled() { | |
| 306 rtc::CritScope cs(&crit_); | |
| 307 return capture_side_called_; | |
| 308 } | |
| 309 | |
| 310 void FlagCaptureSideCalled() { | |
| 311 rtc::CritScope cs(&crit_); | |
| 312 capture_side_called_ = true; | |
| 313 } | |
| 314 | |
| 315 private: | |
| 316 rtc::CriticalSection crit_; | |
| 317 bool capture_side_called_ GUARDED_BY(crit_) = false; | |
| 318 }; | |
| 319 | |
| 320 // Class for handling the capture side processing. | 306 // Class for handling the capture side processing. |
| 321 class CaptureProcessor { | 307 class CaptureProcessor { |
| 322 public: | 308 public: |
| 323 CaptureProcessor(int max_frame_size, | 309 CaptureProcessor(int max_frame_size, |
| 324 RandomGenerator* rand_gen, | 310 RandomGenerator* rand_gen, |
| 311 rtc::Event* render_call_event, | |
| 312 rtc::Event* capture_call_event, | |
| 325 FrameCounters* shared_counters_state, | 313 FrameCounters* shared_counters_state, |
| 326 CaptureSideCalledChecker* capture_call_checker, | |
| 327 AudioProcessingImplLockTest* test_framework, | 314 AudioProcessingImplLockTest* test_framework, |
| 328 TestConfig* test_config, | 315 TestConfig* test_config, |
| 329 AudioProcessing* apm); | 316 AudioProcessing* apm); |
| 330 bool Process(); | 317 bool Process(); |
| 331 | 318 |
| 332 private: | 319 private: |
| 333 static const int kMaxCallDifference = 10; | 320 static const int kMaxCallDifference = 10; |
| 334 static const float kCaptureInputFloatLevel; | 321 static const float kCaptureInputFloatLevel; |
| 335 static const int kCaptureInputFixLevel = 1024; | 322 static const int kCaptureInputFixLevel = 1024; |
| 336 | 323 |
| 337 void PrepareFrame(); | 324 void PrepareFrame(); |
| 338 void CallApmCaptureSide(); | 325 void CallApmCaptureSide(); |
| 339 void ApplyRuntimeSettingScheme(); | 326 void ApplyRuntimeSettingScheme(); |
| 340 | 327 |
| 341 RandomGenerator* rand_gen_ = nullptr; | 328 RandomGenerator* const rand_gen_ = nullptr; |
| 342 FrameCounters* frame_counters_ = nullptr; | 329 rtc::Event* const render_call_event_ = nullptr; |
| 343 CaptureSideCalledChecker* capture_call_checker_ = nullptr; | 330 rtc::Event* const capture_call_event_ = nullptr; |
| 344 AudioProcessingImplLockTest* test_ = nullptr; | 331 FrameCounters* const frame_counters_ = nullptr; |
| 345 TestConfig* test_config_ = nullptr; | 332 AudioProcessingImplLockTest* const test_ = nullptr; |
| 346 AudioProcessing* apm_ = nullptr; | 333 const TestConfig* const test_config_ = nullptr; |
| 334 AudioProcessing* const apm_ = nullptr; | |
| 347 AudioFrameData frame_data_; | 335 AudioFrameData frame_data_; |
| 348 }; | 336 }; |
| 349 | 337 |
| 350 // Class for handling the stats processing. | 338 // Class for handling the stats processing. |
| 351 class StatsProcessor { | 339 class StatsProcessor { |
| 352 public: | 340 public: |
| 353 StatsProcessor(RandomGenerator* rand_gen, | 341 StatsProcessor(RandomGenerator* rand_gen, |
| 354 TestConfig* test_config, | 342 TestConfig* test_config, |
| 355 AudioProcessing* apm); | 343 AudioProcessing* apm); |
| 356 bool Process(); | 344 bool Process(); |
| 357 | 345 |
| 358 private: | 346 private: |
| 359 RandomGenerator* rand_gen_ = nullptr; | 347 RandomGenerator* rand_gen_ = nullptr; |
| 360 TestConfig* test_config_ = nullptr; | 348 TestConfig* test_config_ = nullptr; |
| 361 AudioProcessing* apm_ = nullptr; | 349 AudioProcessing* apm_ = nullptr; |
| 362 }; | 350 }; |
| 363 | 351 |
| 364 // Class for handling the render side processing. | 352 // Class for handling the render side processing. |
| 365 class RenderProcessor { | 353 class RenderProcessor { |
| 366 public: | 354 public: |
| 367 RenderProcessor(int max_frame_size, | 355 RenderProcessor(int max_frame_size, |
| 368 RandomGenerator* rand_gen, | 356 RandomGenerator* rand_gen, |
| 357 rtc::Event* render_call_event, | |
| 358 rtc::Event* capture_call_event, | |
| 369 FrameCounters* shared_counters_state, | 359 FrameCounters* shared_counters_state, |
| 370 CaptureSideCalledChecker* capture_call_checker, | |
| 371 AudioProcessingImplLockTest* test_framework, | 360 AudioProcessingImplLockTest* test_framework, |
| 372 TestConfig* test_config, | 361 TestConfig* test_config, |
| 373 AudioProcessing* apm); | 362 AudioProcessing* apm); |
| 374 bool Process(); | 363 bool Process(); |
| 375 | 364 |
| 376 private: | 365 private: |
| 377 static const int kMaxCallDifference = 10; | 366 static const int kMaxCallDifference = 10; |
| 378 static const int kRenderInputFixLevel = 16384; | 367 static const int kRenderInputFixLevel = 16384; |
| 379 static const float kRenderInputFloatLevel; | 368 static const float kRenderInputFloatLevel; |
| 380 | 369 |
| 381 void PrepareFrame(); | 370 void PrepareFrame(); |
| 382 void CallApmRenderSide(); | 371 void CallApmRenderSide(); |
| 383 void ApplyRuntimeSettingScheme(); | 372 void ApplyRuntimeSettingScheme(); |
| 384 | 373 |
| 385 RandomGenerator* rand_gen_ = nullptr; | 374 RandomGenerator* const rand_gen_ = nullptr; |
| 386 FrameCounters* frame_counters_ = nullptr; | 375 rtc::Event* const render_call_event_ = nullptr; |
| 387 CaptureSideCalledChecker* capture_call_checker_ = nullptr; | 376 rtc::Event* const capture_call_event_ = nullptr; |
| 388 AudioProcessingImplLockTest* test_ = nullptr; | 377 FrameCounters* const frame_counters_ = nullptr; |
| 389 TestConfig* test_config_ = nullptr; | 378 AudioProcessingImplLockTest* const test_ = nullptr; |
| 390 AudioProcessing* apm_ = nullptr; | 379 const TestConfig* const test_config_ = nullptr; |
| 391 bool first_render_side_call_ = true; | 380 AudioProcessing* const apm_ = nullptr; |
| 392 AudioFrameData frame_data_; | 381 AudioFrameData frame_data_; |
| 382 bool first_render_call_ = true; | |
| 393 }; | 383 }; |
| 394 | 384 |
| 395 class AudioProcessingImplLockTest | 385 class AudioProcessingImplLockTest |
| 396 : public ::testing::TestWithParam<TestConfig> { | 386 : public ::testing::TestWithParam<TestConfig> { |
| 397 public: | 387 public: |
| 398 AudioProcessingImplLockTest(); | 388 AudioProcessingImplLockTest(); |
| 399 EventTypeWrapper RunTest(); | 389 bool RunTest(); |
| 400 void CheckTestCompleteness(); | 390 bool MaybeEndTest(); |
| 401 | 391 |
| 402 private: | 392 private: |
| 403 static const int kTestTimeOutLimit = 10 * 60 * 1000; | 393 static const int kTestTimeOutLimit = 10 * 60 * 1000; |
| 404 static const int kMaxFrameSize = 480; | 394 static const int kMaxFrameSize = 480; |
| 405 | 395 |
| 406 // ::testing::TestWithParam<> implementation | 396 // ::testing::TestWithParam<> implementation |
| 407 void SetUp() override; | 397 void SetUp() override; |
| 408 void TearDown() override; | 398 void TearDown() override; |
| 409 | 399 |
| 410 // Thread callback for the render thread | 400 // Thread callback for the render thread |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 435 // Start the threads used in the test. | 425 // Start the threads used in the test. |
| 436 void StartThreads() { | 426 void StartThreads() { |
| 437 render_thread_.Start(); | 427 render_thread_.Start(); |
| 438 render_thread_.SetPriority(rtc::kRealtimePriority); | 428 render_thread_.SetPriority(rtc::kRealtimePriority); |
| 439 capture_thread_.Start(); | 429 capture_thread_.Start(); |
| 440 capture_thread_.SetPriority(rtc::kRealtimePriority); | 430 capture_thread_.SetPriority(rtc::kRealtimePriority); |
| 441 stats_thread_.Start(); | 431 stats_thread_.Start(); |
| 442 stats_thread_.SetPriority(rtc::kNormalPriority); | 432 stats_thread_.SetPriority(rtc::kNormalPriority); |
| 443 } | 433 } |
| 444 | 434 |
| 445 // Event handler for the test. | 435 // Event handlers for the test. |
| 446 const rtc::scoped_ptr<EventWrapper> test_complete_; | 436 rtc::Event test_complete_; |
| 437 rtc::Event render_call_event_; | |
| 438 rtc::Event capture_call_event_; | |
| 447 | 439 |
| 448 // Thread related variables. | 440 // Thread related variables. |
| 449 rtc::PlatformThread render_thread_; | 441 rtc::PlatformThread render_thread_; |
| 450 rtc::PlatformThread capture_thread_; | 442 rtc::PlatformThread capture_thread_; |
| 451 rtc::PlatformThread stats_thread_; | 443 rtc::PlatformThread stats_thread_; |
| 452 mutable RandomGenerator rand_gen_; | 444 mutable RandomGenerator rand_gen_; |
|
pbos-webrtc
2015/12/02 22:59:13
This one looks shared between multiple instances,
peah-webrtc
2015/12/03 08:17:17
It is, there us a custom class RandomGenerator whi
terelius
2015/12/09 17:10:38
RandomGenerator comes from base/helpers.h which is
terelius
2015/12/09 17:15:07
Oops, sorry. You are right. Confused it with a sim
the sun
2015/12/10 09:37:54
Why share the PRNG? Why not just keep separate ins
| |
| 453 | 445 |
| 454 rtc::scoped_ptr<AudioProcessing> apm_; | 446 rtc::scoped_ptr<AudioProcessing> apm_; |
| 455 TestConfig test_config_; | 447 TestConfig test_config_; |
| 456 FrameCounters frame_counters_; | 448 FrameCounters frame_counters_; |
| 457 CaptureSideCalledChecker capture_call_checker_; | |
| 458 RenderProcessor render_thread_state_; | 449 RenderProcessor render_thread_state_; |
| 459 CaptureProcessor capture_thread_state_; | 450 CaptureProcessor capture_thread_state_; |
| 460 StatsProcessor stats_thread_state_; | 451 StatsProcessor stats_thread_state_; |
| 461 }; | 452 }; |
| 462 | 453 |
| 463 // Sleeps a random time between 0 and max_sleep milliseconds. | 454 // Sleeps a random time between 0 and max_sleep milliseconds. |
| 464 void SleepRandomMs(int max_sleep, RandomGenerator* rand_gen) { | 455 void SleepRandomMs(int max_sleep, RandomGenerator* rand_gen) { |
| 465 int sleeptime = rand_gen->RandInt(0, max_sleep); | 456 int sleeptime = rand_gen->RandInt(0, max_sleep); |
| 466 SleepMs(sleeptime); | 457 SleepMs(sleeptime); |
| 467 } | 458 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 490 for (int k = 0; k < static_cast<int>(frame->samples_per_channel_); k++) { | 481 for (int k = 0; k < static_cast<int>(frame->samples_per_channel_); k++) { |
| 491 // Store random 16 bit number between -(amplitude+1) and | 482 // Store random 16 bit number between -(amplitude+1) and |
| 492 // amplitude. | 483 // amplitude. |
| 493 frame->data_[k * ch] = | 484 frame->data_[k * ch] = |
| 494 rand_gen->RandInt(2 * amplitude + 1) - amplitude - 1; | 485 rand_gen->RandInt(2 * amplitude + 1) - amplitude - 1; |
| 495 } | 486 } |
| 496 } | 487 } |
| 497 } | 488 } |
| 498 | 489 |
| 499 AudioProcessingImplLockTest::AudioProcessingImplLockTest() | 490 AudioProcessingImplLockTest::AudioProcessingImplLockTest() |
| 500 : test_complete_(EventWrapper::Create()), | 491 : test_complete_(false, false), |
| 492 render_call_event_(false, false), | |
| 493 capture_call_event_(false, false), | |
| 501 render_thread_(RenderProcessorThreadFunc, this, "render"), | 494 render_thread_(RenderProcessorThreadFunc, this, "render"), |
| 502 capture_thread_(CaptureProcessorThreadFunc, this, "capture"), | 495 capture_thread_(CaptureProcessorThreadFunc, this, "capture"), |
| 503 stats_thread_(StatsProcessorThreadFunc, this, "stats"), | 496 stats_thread_(StatsProcessorThreadFunc, this, "stats"), |
| 504 apm_(AudioProcessingImpl::Create()), | 497 apm_(AudioProcessingImpl::Create()), |
| 505 render_thread_state_(kMaxFrameSize, | 498 render_thread_state_(kMaxFrameSize, |
| 506 &rand_gen_, | 499 &rand_gen_, |
| 500 &render_call_event_, | |
| 501 &capture_call_event_, | |
| 507 &frame_counters_, | 502 &frame_counters_, |
| 508 &capture_call_checker_, | |
| 509 this, | 503 this, |
| 510 &test_config_, | 504 &test_config_, |
| 511 apm_.get()), | 505 apm_.get()), |
| 512 capture_thread_state_(kMaxFrameSize, | 506 capture_thread_state_(kMaxFrameSize, |
| 513 &rand_gen_, | 507 &rand_gen_, |
| 508 &render_call_event_, | |
| 509 &capture_call_event_, | |
| 514 &frame_counters_, | 510 &frame_counters_, |
| 515 &capture_call_checker_, | |
| 516 this, | 511 this, |
| 517 &test_config_, | 512 &test_config_, |
| 518 apm_.get()), | 513 apm_.get()), |
| 519 stats_thread_state_(&rand_gen_, &test_config_, apm_.get()) {} | 514 stats_thread_state_(&rand_gen_, &test_config_, apm_.get()) {} |
| 520 | 515 |
| 521 // Run the test with a timeout. | 516 // Run the test with a timeout. |
| 522 EventTypeWrapper AudioProcessingImplLockTest::RunTest() { | 517 bool AudioProcessingImplLockTest::RunTest() { |
| 523 StartThreads(); | 518 StartThreads(); |
| 524 return test_complete_->Wait(kTestTimeOutLimit); | 519 return test_complete_.Wait(kTestTimeOutLimit); |
| 525 } | 520 } |
| 526 | 521 |
| 527 void AudioProcessingImplLockTest::CheckTestCompleteness() { | 522 bool AudioProcessingImplLockTest::MaybeEndTest() { |
| 528 if (HasFatalFailure() || TestDone()) { | 523 if (HasFatalFailure() || TestDone()) { |
| 529 test_complete_->Set(); | 524 test_complete_.Set(); |
| 525 return true; | |
| 530 } | 526 } |
| 527 return false; | |
| 531 } | 528 } |
| 532 | 529 |
| 533 // Setup of test and APM. | 530 // Setup of test and APM. |
| 534 void AudioProcessingImplLockTest::SetUp() { | 531 void AudioProcessingImplLockTest::SetUp() { |
| 535 test_config_ = static_cast<TestConfig>(GetParam()); | 532 test_config_ = static_cast<TestConfig>(GetParam()); |
| 536 | 533 |
| 537 ASSERT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true)); | 534 ASSERT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true)); |
| 538 ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); | 535 ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); |
| 539 | 536 |
| 540 ASSERT_EQ(apm_->kNoError, | 537 ASSERT_EQ(apm_->kNoError, |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 565 | 562 |
| 566 config.Set<DelayAgnostic>( | 563 config.Set<DelayAgnostic>( |
| 567 new DelayAgnostic(test_config_.aec_type == | 564 new DelayAgnostic(test_config_.aec_type == |
| 568 AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec)); | 565 AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec)); |
| 569 | 566 |
| 570 apm_->SetExtraOptions(config); | 567 apm_->SetExtraOptions(config); |
| 571 } | 568 } |
| 572 } | 569 } |
| 573 | 570 |
| 574 void AudioProcessingImplLockTest::TearDown() { | 571 void AudioProcessingImplLockTest::TearDown() { |
| 572 render_call_event_.Set(); | |
| 573 capture_call_event_.Set(); | |
| 575 render_thread_.Stop(); | 574 render_thread_.Stop(); |
| 576 capture_thread_.Stop(); | 575 capture_thread_.Stop(); |
| 577 stats_thread_.Stop(); | 576 stats_thread_.Stop(); |
| 578 } | 577 } |
| 579 | 578 |
| 580 StatsProcessor::StatsProcessor(RandomGenerator* rand_gen, | 579 StatsProcessor::StatsProcessor(RandomGenerator* rand_gen, |
| 581 TestConfig* test_config, | 580 TestConfig* test_config, |
| 582 AudioProcessing* apm) | 581 AudioProcessing* apm) |
| 583 : rand_gen_(rand_gen), test_config_(test_config), apm_(apm) {} | 582 : rand_gen_(rand_gen), test_config_(test_config), apm_(apm) {} |
| 584 | 583 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 602 | 601 |
| 603 // The below return values are not testable. | 602 // The below return values are not testable. |
| 604 apm_->noise_suppression()->speech_probability(); | 603 apm_->noise_suppression()->speech_probability(); |
| 605 apm_->voice_detection()->is_enabled(); | 604 apm_->voice_detection()->is_enabled(); |
| 606 | 605 |
| 607 return true; | 606 return true; |
| 608 } | 607 } |
| 609 | 608 |
| 610 const float CaptureProcessor::kCaptureInputFloatLevel = 0.03125f; | 609 const float CaptureProcessor::kCaptureInputFloatLevel = 0.03125f; |
| 611 | 610 |
| 612 CaptureProcessor::CaptureProcessor( | 611 CaptureProcessor::CaptureProcessor(int max_frame_size, |
| 613 int max_frame_size, | 612 RandomGenerator* rand_gen, |
| 614 RandomGenerator* rand_gen, | 613 rtc::Event* render_call_event, |
| 615 FrameCounters* shared_counters_state, | 614 rtc::Event* capture_call_event, |
| 616 CaptureSideCalledChecker* capture_call_checker, | 615 FrameCounters* shared_counters_state, |
| 617 AudioProcessingImplLockTest* test_framework, | 616 AudioProcessingImplLockTest* test_framework, |
| 618 TestConfig* test_config, | 617 TestConfig* test_config, |
| 619 AudioProcessing* apm) | 618 AudioProcessing* apm) |
| 620 : rand_gen_(rand_gen), | 619 : rand_gen_(rand_gen), |
| 620 render_call_event_(render_call_event), | |
| 621 capture_call_event_(capture_call_event), | |
| 621 frame_counters_(shared_counters_state), | 622 frame_counters_(shared_counters_state), |
| 622 capture_call_checker_(capture_call_checker), | |
| 623 test_(test_framework), | 623 test_(test_framework), |
| 624 test_config_(test_config), | 624 test_config_(test_config), |
| 625 apm_(apm), | 625 apm_(apm), |
| 626 frame_data_(max_frame_size) {} | 626 frame_data_(max_frame_size) {} |
| 627 | 627 |
| 628 // Implements the callback functionality for the capture thread. | 628 // Implements the callback functionality for the capture thread. |
| 629 bool CaptureProcessor::Process() { | 629 bool CaptureProcessor::Process() { |
| 630 // Sleep a random time to simulate thread jitter. | 630 // Sleep a random time to simulate thread jitter. |
| 631 SleepRandomMs(3, rand_gen_); | 631 SleepRandomMs(3, rand_gen_); |
| 632 | 632 |
| 633 // End the test if complete. | 633 // Check whether the test is done. |
| 634 test_->CheckTestCompleteness(); | 634 if (test_->MaybeEndTest()) { |
| 635 return false; | |
| 636 } | |
| 635 | 637 |
| 636 // Ensure that there are not more capture side calls than render side | 638 // Ensure that the number of render and capture calls do not |
| 637 // calls. | 639 // differ too much. |
| 638 if (capture_call_checker_->CaptureSideCalled()) { | 640 if (frame_counters_->CaptureMinusRenderCounters() > kMaxCallDifference) { |
| 639 while (kMaxCallDifference < frame_counters_->CaptureMinusRenderCounters()) { | 641 render_call_event_->Wait(rtc::Event::kForever); |
| 640 SleepMs(1); | |
| 641 } | |
| 642 } | 642 } |
| 643 | 643 |
| 644 // Apply any specified capture side APM non-processing runtime calls. | 644 // Apply any specified capture side APM non-processing runtime calls. |
| 645 ApplyRuntimeSettingScheme(); | 645 ApplyRuntimeSettingScheme(); |
| 646 | 646 |
| 647 // Apply the capture side processing call. | 647 // Apply the capture side processing call. |
| 648 CallApmCaptureSide(); | 648 CallApmCaptureSide(); |
| 649 | 649 |
| 650 // Increase the number of capture-side calls. | 650 // Increase the number of capture-side calls. |
| 651 frame_counters_->IncreaseCaptureCounter(); | 651 frame_counters_->IncreaseCaptureCounter(); |
| 652 | 652 |
| 653 // Flag that the capture side has been called at least once | 653 // Flag to the render thread that another capture API call has occurred |
| 654 // (needed to ensure that a capture call has been done | 654 // by triggering this threads call event. |
| 655 // before the first render call is performed (implicitly | 655 capture_call_event_->Set(); |
| 656 // required by the APM API). | |
| 657 capture_call_checker_->FlagCaptureSideCalled(); | |
| 658 | 656 |
| 659 return true; | 657 return true; |
| 660 } | 658 } |
| 661 | 659 |
| 662 // Prepares a frame with relevant audio data and metadata. | 660 // Prepares a frame with relevant audio data and metadata. |
| 663 void CaptureProcessor::PrepareFrame() { | 661 void CaptureProcessor::PrepareFrame() { |
| 664 // Restrict to a common fixed sample rate if the AudioFrame | 662 // Restrict to a common fixed sample rate if the AudioFrame |
| 665 // interface is used. | 663 // interface is used. |
| 666 if (test_config_->capture_api_function == | 664 if (test_config_->capture_api_function == |
| 667 CaptureApiImpl::ProcessStreamImpl1) { | 665 CaptureApiImpl::ProcessStreamImpl1) { |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 866 // the number of input channels. | 864 // the number of input channels. |
| 867 frame_data_.output_number_of_channels = | 865 frame_data_.output_number_of_channels = |
| 868 std::min(frame_data_.output_number_of_channels, | 866 std::min(frame_data_.output_number_of_channels, |
| 869 frame_data_.input_number_of_channels); | 867 frame_data_.input_number_of_channels); |
| 870 } | 868 } |
| 871 | 869 |
| 872 const float RenderProcessor::kRenderInputFloatLevel = 0.5f; | 870 const float RenderProcessor::kRenderInputFloatLevel = 0.5f; |
| 873 | 871 |
| 874 RenderProcessor::RenderProcessor(int max_frame_size, | 872 RenderProcessor::RenderProcessor(int max_frame_size, |
| 875 RandomGenerator* rand_gen, | 873 RandomGenerator* rand_gen, |
| 874 rtc::Event* render_call_event, | |
| 875 rtc::Event* capture_call_event, | |
| 876 FrameCounters* shared_counters_state, | 876 FrameCounters* shared_counters_state, |
| 877 CaptureSideCalledChecker* capture_call_checker, | |
| 878 AudioProcessingImplLockTest* test_framework, | 877 AudioProcessingImplLockTest* test_framework, |
| 879 TestConfig* test_config, | 878 TestConfig* test_config, |
| 880 AudioProcessing* apm) | 879 AudioProcessing* apm) |
| 881 : rand_gen_(rand_gen), | 880 : rand_gen_(rand_gen), |
| 881 render_call_event_(render_call_event), | |
| 882 capture_call_event_(capture_call_event), | |
| 882 frame_counters_(shared_counters_state), | 883 frame_counters_(shared_counters_state), |
| 883 capture_call_checker_(capture_call_checker), | |
| 884 test_(test_framework), | 884 test_(test_framework), |
| 885 test_config_(test_config), | 885 test_config_(test_config), |
| 886 apm_(apm), | 886 apm_(apm), |
| 887 frame_data_(max_frame_size) {} | 887 frame_data_(max_frame_size) {} |
| 888 | 888 |
| 889 // Implements the callback functionality for the render thread. | 889 // Implements the callback functionality for the render thread. |
| 890 bool RenderProcessor::Process() { | 890 bool RenderProcessor::Process() { |
| 891 // Conditional wait to ensure that a capture call has been done | 891 // Conditional wait to ensure that a capture call has been done |
| 892 // before the first render call is performed (implicitly | 892 // before the first render call is performed (implicitly |
| 893 // required by the APM API). | 893 // required by the APM API). |
| 894 if (first_render_side_call_) { | 894 if (first_render_call_) { |
| 895 while (!capture_call_checker_->CaptureSideCalled()) { | 895 capture_call_event_->Wait(rtc::Event::kForever); |
| 896 SleepRandomMs(3, rand_gen_); | 896 first_render_call_ = false; |
| 897 } | |
| 898 | |
| 899 first_render_side_call_ = false; | |
| 900 } | 897 } |
| 901 | 898 |
| 902 // Sleep a random time to simulate thread jitter. | 899 // Sleep a random time to simulate thread jitter. |
| 903 SleepRandomMs(3, rand_gen_); | 900 SleepRandomMs(3, rand_gen_); |
| 904 | 901 |
| 905 // End the test early if a fatal failure (ASSERT_*) has occurred. | 902 // Check whether the test is done. |
| 906 test_->CheckTestCompleteness(); | 903 if (test_->MaybeEndTest()) { |
|
pbos-webrtc
2015/12/02 22:59:13
Maybe rename MaybeEndTest to TestHasEnded?
peah-webrtc
2015/12/03 08:17:17
That is a good name but I think it is a bit mislea
| |
| 904 return false; | |
| 905 } | |
| 907 | 906 |
| 908 // Ensure that the number of render and capture calls do not | 907 // Ensure that the number of render and capture calls do not |
| 909 // differ too much. | 908 // differ too much. |
| 910 while (kMaxCallDifference < -frame_counters_->CaptureMinusRenderCounters()) { | 909 if (frame_counters_->RenderMinusCaptureCounters() > kMaxCallDifference) { |
| 911 SleepMs(1); | 910 capture_call_event_->Wait(rtc::Event::kForever); |
| 912 } | 911 } |
| 913 | 912 |
| 914 // Apply any specified render side APM non-processing runtime calls. | 913 // Apply any specified render side APM non-processing runtime calls. |
| 915 ApplyRuntimeSettingScheme(); | 914 ApplyRuntimeSettingScheme(); |
| 916 | 915 |
| 917 // Apply the render side processing call. | 916 // Apply the render side processing call. |
| 918 CallApmRenderSide(); | 917 CallApmRenderSide(); |
| 919 | 918 |
| 920 // Increase the number of render-side calls. | 919 // Increase the number of render-side calls. |
| 921 frame_counters_->IncreaseRenderCounter(); | 920 frame_counters_->IncreaseRenderCounter(); |
| 922 | 921 |
| 922 // Flag to the capture thread that another render API call has occurred | |
| 923 // by triggering this threads call event. | |
| 924 render_call_event_->Set(); | |
| 923 return true; | 925 return true; |
| 924 } | 926 } |
| 925 | 927 |
| 926 // Prepares the render side frame and the accompanying metadata | 928 // Prepares the render side frame and the accompanying metadata |
| 927 // with the appropriate information. | 929 // with the appropriate information. |
| 928 void RenderProcessor::PrepareFrame() { | 930 void RenderProcessor::PrepareFrame() { |
| 929 // Restrict to a common fixed sample rate if the AudioFrame interface is | 931 // Restrict to a common fixed sample rate if the AudioFrame interface is |
| 930 // used. | 932 // used. |
| 931 if ((test_config_->render_api_function == | 933 if ((test_config_->render_api_function == |
| 932 RenderApiImpl::AnalyzeReverseStreamImpl1) || | 934 RenderApiImpl::AnalyzeReverseStreamImpl1) || |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1107 // the number of input channels. | 1109 // the number of input channels. |
| 1108 frame_data_.output_number_of_channels = | 1110 frame_data_.output_number_of_channels = |
| 1109 std::min(frame_data_.output_number_of_channels, | 1111 std::min(frame_data_.output_number_of_channels, |
| 1110 frame_data_.input_number_of_channels); | 1112 frame_data_.input_number_of_channels); |
| 1111 } | 1113 } |
| 1112 | 1114 |
| 1113 } // anonymous namespace | 1115 } // anonymous namespace |
| 1114 | 1116 |
| 1115 TEST_P(AudioProcessingImplLockTest, LockTest) { | 1117 TEST_P(AudioProcessingImplLockTest, LockTest) { |
| 1116 // Run test and verify that it did not time out. | 1118 // Run test and verify that it did not time out. |
| 1117 ASSERT_EQ(kEventSignaled, RunTest()); | 1119 ASSERT_TRUE(RunTest()); |
| 1118 } | 1120 } |
| 1119 | 1121 |
| 1120 // Instantiate tests from the extreme test configuration set. | 1122 // Instantiate tests from the extreme test configuration set. |
| 1121 INSTANTIATE_TEST_CASE_P( | 1123 INSTANTIATE_TEST_CASE_P( |
| 1122 DISABLED_AudioProcessingImplLockExtensive, | 1124 DISABLED_AudioProcessingImplLockExtensive, |
| 1123 AudioProcessingImplLockTest, | 1125 AudioProcessingImplLockTest, |
| 1124 ::testing::ValuesIn(TestConfig::GenerateExtensiveTestConfigs())); | 1126 ::testing::ValuesIn(TestConfig::GenerateExtensiveTestConfigs())); |
| 1125 | 1127 |
| 1126 INSTANTIATE_TEST_CASE_P( | 1128 INSTANTIATE_TEST_CASE_P( |
| 1127 AudioProcessingImplLockBrief, | 1129 AudioProcessingImplLockBrief, |
| 1128 AudioProcessingImplLockTest, | 1130 AudioProcessingImplLockTest, |
| 1129 ::testing::ValuesIn(TestConfig::GenerateBriefTestConfigs())); | 1131 ::testing::ValuesIn(TestConfig::GenerateBriefTestConfigs())); |
| 1130 | 1132 |
| 1131 } // namespace webrtc | 1133 } // namespace webrtc |
| OLD | NEW |