Further utilizing the AEC3 config struct for constants

BUG=webrtc:5298

Review-Url: https://codereview.webrtc.org/3007833002
Cr-Commit-Position: refs/heads/master@{#19605}
This commit is contained in:
peah
2017-08-30 06:58:44 -07:00
committed by Commit Bot
parent b57f42676e
commit 4fed3c0b6f
12 changed files with 87 additions and 40 deletions

View File

@ -129,7 +129,11 @@ void AecState::Update(const std::vector<std::array<float, kFftLengthBy2Plus1>>&
// Update counters. // Update counters.
const float x_energy = std::inner_product(x.begin(), x.end(), x.begin(), 0.f); const float x_energy = std::inner_product(x.begin(), x.end(), x.begin(), 0.f);
const bool active_render_block = x_energy > 10000.f * kFftLengthBy2;
const bool active_render_block =
x_energy > (config_.param.render_levels.active_render_limit *
config_.param.render_levels.active_render_limit) *
kFftLengthBy2;
if (active_render_block) { if (active_render_block) {
render_received_ = true; render_received_ = true;
} }

View File

@ -181,7 +181,7 @@ BlockProcessor* BlockProcessor::Create(
std::unique_ptr<RenderDelayBuffer> render_buffer( std::unique_ptr<RenderDelayBuffer> render_buffer(
RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz))); RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(sample_rate_hz)); RenderDelayController::Create(config, sample_rate_hz));
std::unique_ptr<EchoRemover> echo_remover( std::unique_ptr<EchoRemover> echo_remover(
EchoRemover::Create(config, sample_rate_hz)); EchoRemover::Create(config, sample_rate_hz));
return Create(config, sample_rate_hz, std::move(render_buffer), return Create(config, sample_rate_hz, std::move(render_buffer),
@ -193,7 +193,7 @@ BlockProcessor* BlockProcessor::Create(
int sample_rate_hz, int sample_rate_hz,
std::unique_ptr<RenderDelayBuffer> render_buffer) { std::unique_ptr<RenderDelayBuffer> render_buffer) {
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(sample_rate_hz)); RenderDelayController::Create(config, sample_rate_hz));
std::unique_ptr<EchoRemover> echo_remover( std::unique_ptr<EchoRemover> echo_remover(
EchoRemover::Create(config, sample_rate_hz)); EchoRemover::Create(config, sample_rate_hz));
return Create(config, sample_rate_hz, std::move(render_buffer), return Create(config, sample_rate_hz, std::move(render_buffer),

View File

@ -24,13 +24,16 @@ namespace {
constexpr int kDownSamplingFactor = 4; constexpr int kDownSamplingFactor = 4;
} // namespace } // namespace
EchoPathDelayEstimator::EchoPathDelayEstimator(ApmDataDumper* data_dumper) EchoPathDelayEstimator::EchoPathDelayEstimator(
ApmDataDumper* data_dumper,
const AudioProcessing::Config::EchoCanceller3& config)
: data_dumper_(data_dumper), : data_dumper_(data_dumper),
matched_filter_(data_dumper_, matched_filter_(data_dumper_,
DetectOptimization(), DetectOptimization(),
kMatchedFilterWindowSizeSubBlocks, kMatchedFilterWindowSizeSubBlocks,
kNumMatchedFilters, kNumMatchedFilters,
kMatchedFilterAlignmentShiftSizeSubBlocks), kMatchedFilterAlignmentShiftSizeSubBlocks,
config.param.render_levels.poor_excitation_render_limit),
matched_filter_lag_aggregator_(data_dumper_, matched_filter_lag_aggregator_(data_dumper_,
matched_filter_.NumLagEstimates()) { matched_filter_.NumLagEstimates()) {
RTC_DCHECK(data_dumper); RTC_DCHECK(data_dumper);

View File

@ -17,6 +17,7 @@
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h" #include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
#include "webrtc/modules/audio_processing/aec3/matched_filter.h" #include "webrtc/modules/audio_processing/aec3/matched_filter.h"
#include "webrtc/modules/audio_processing/aec3/matched_filter_lag_aggregator.h" #include "webrtc/modules/audio_processing/aec3/matched_filter_lag_aggregator.h"
#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/rtc_base/constructormagic.h" #include "webrtc/rtc_base/constructormagic.h"
#include "webrtc/rtc_base/optional.h" #include "webrtc/rtc_base/optional.h"
@ -27,7 +28,8 @@ class ApmDataDumper;
// Estimates the delay of the echo path. // Estimates the delay of the echo path.
class EchoPathDelayEstimator { class EchoPathDelayEstimator {
public: public:
explicit EchoPathDelayEstimator(ApmDataDumper* data_dumper); EchoPathDelayEstimator(ApmDataDumper* data_dumper,
const AudioProcessing::Config::EchoCanceller3& config);
~EchoPathDelayEstimator(); ~EchoPathDelayEstimator();
// Resets the estimation. // Resets the estimation.
@ -44,7 +46,7 @@ class EchoPathDelayEstimator {
MatchedFilter matched_filter_; MatchedFilter matched_filter_;
MatchedFilterLagAggregator matched_filter_lag_aggregator_; MatchedFilterLagAggregator matched_filter_lag_aggregator_;
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoPathDelayEstimator); RTC_DISALLOW_COPY_AND_ASSIGN(EchoPathDelayEstimator);
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -37,7 +37,8 @@ TEST(EchoPathDelayEstimator, BasicApiCalls) {
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize)); std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize); std::vector<float> capture(kBlockSize);
for (size_t k = 0; k < 100; ++k) { for (size_t k = 0; k < 100; ++k) {
@ -59,7 +60,8 @@ TEST(EchoPathDelayEstimator, DelayEstimation) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
DelayBuffer<float> signal_delay_buffer(delay_samples); DelayBuffer<float> signal_delay_buffer(delay_samples);
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
rtc::Optional<size_t> estimated_delay_samples; rtc::Optional<size_t> estimated_delay_samples;
for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) { for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) {
@ -91,7 +93,8 @@ TEST(EchoPathDelayEstimator, NoInitialDelayestimates) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
for (size_t k = 0; k < 19; ++k) { for (size_t k = 0; k < 19; ++k) {
RandomizeSampleVector(&random_generator, render[0]); RandomizeSampleVector(&random_generator, render[0]);
std::copy(render[0].begin(), render[0].end(), capture.begin()); std::copy(render[0].begin(), render[0].end(), capture.begin());
@ -109,7 +112,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForLowLevelRenderSignals) {
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize)); std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize); std::vector<float> capture(kBlockSize);
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
for (size_t k = 0; k < 100; ++k) { for (size_t k = 0; k < 100; ++k) {
@ -132,7 +136,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForUncorrelatedSignals) {
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize)); std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize); std::vector<float> capture(kBlockSize);
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
for (size_t k = 0; k < 100; ++k) { for (size_t k = 0; k < 100; ++k) {
@ -152,7 +157,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForUncorrelatedSignals) {
// tests on test bots has been fixed. // tests on test bots has been fixed.
TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) { TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
std::vector<float> capture(kBlockSize); std::vector<float> capture(kBlockSize);
@ -166,7 +172,8 @@ TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
// tests on test bots has been fixed. // tests on test bots has been fixed.
TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) { TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
EchoPathDelayEstimator estimator(&data_dumper); EchoPathDelayEstimator estimator(&data_dumper,
AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
std::vector<float> capture(std::vector<float>(kBlockSize - 1)); std::vector<float> capture(std::vector<float>(kBlockSize - 1));
@ -177,7 +184,9 @@ TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
// Verifies the check for non-null data dumper. // Verifies the check for non-null data dumper.
TEST(EchoPathDelayEstimator, NullDataDumper) { TEST(EchoPathDelayEstimator, NullDataDumper) {
EXPECT_DEATH(EchoPathDelayEstimator(nullptr), ""); EXPECT_DEATH(EchoPathDelayEstimator(
nullptr, AudioProcessing::Config::EchoCanceller3()),
"");
} }
#endif #endif

View File

@ -291,13 +291,15 @@ MatchedFilter::MatchedFilter(ApmDataDumper* data_dumper,
Aec3Optimization optimization, Aec3Optimization optimization,
size_t window_size_sub_blocks, size_t window_size_sub_blocks,
int num_matched_filters, int num_matched_filters,
size_t alignment_shift_sub_blocks) size_t alignment_shift_sub_blocks,
float excitation_limit)
: data_dumper_(data_dumper), : data_dumper_(data_dumper),
optimization_(optimization), optimization_(optimization),
filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize), filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
filters_(num_matched_filters, filters_(num_matched_filters,
std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)), std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)),
lag_estimates_(num_matched_filters) { lag_estimates_(num_matched_filters),
excitation_limit_(excitation_limit) {
RTC_DCHECK(data_dumper); RTC_DCHECK(data_dumper);
RTC_DCHECK_LT(0, window_size_sub_blocks); RTC_DCHECK_LT(0, window_size_sub_blocks);
} }
@ -318,7 +320,8 @@ void MatchedFilter::Update(const DownsampledRenderBuffer& render_buffer,
const std::array<float, kSubBlockSize>& capture) { const std::array<float, kSubBlockSize>& capture) {
const std::array<float, kSubBlockSize>& y = capture; const std::array<float, kSubBlockSize>& y = capture;
const float x2_sum_threshold = filters_[0].size() * 150.f * 150.f; const float x2_sum_threshold =
filters_[0].size() * excitation_limit_ * excitation_limit_;
// Apply all matched filters. // Apply all matched filters.
size_t alignment_shift = 0; size_t alignment_shift = 0;

View File

@ -83,7 +83,8 @@ class MatchedFilter {
Aec3Optimization optimization, Aec3Optimization optimization,
size_t window_size_sub_blocks, size_t window_size_sub_blocks,
int num_matched_filters, int num_matched_filters,
size_t alignment_shift_sub_blocks); size_t alignment_shift_sub_blocks,
float excitation_limit);
~MatchedFilter(); ~MatchedFilter();
@ -108,6 +109,7 @@ class MatchedFilter {
const size_t filter_intra_lag_shift_; const size_t filter_intra_lag_shift_;
std::vector<std::vector<float>> filters_; std::vector<std::vector<float>> filters_;
std::vector<LagEstimate> lag_estimates_; std::vector<LagEstimate> lag_estimates_;
const float excitation_limit_;
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter); RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter);
}; };

View File

@ -137,7 +137,7 @@ TEST(MatchedFilter, LagEstimation) {
DelayBuffer<float> signal_delay_buffer(4 * delay_samples); DelayBuffer<float> signal_delay_buffer(4 * delay_samples);
MatchedFilter filter(&data_dumper, DetectOptimization(), MatchedFilter filter(&data_dumper, DetectOptimization(),
kWindowSizeSubBlocks, kNumMatchedFilters, kWindowSizeSubBlocks, kNumMatchedFilters,
kAlignmentShiftSubBlocks); kAlignmentShiftSubBlocks, 150);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
@ -206,7 +206,7 @@ TEST(MatchedFilter, LagNotReliableForUncorrelatedRenderAndCapture) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
kNumMatchedFilters, kAlignmentShiftSubBlocks); kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
// Analyze the correlation between render and capture. // Analyze the correlation between render and capture.
for (size_t k = 0; k < 100; ++k) { for (size_t k = 0; k < 100; ++k) {
@ -236,7 +236,7 @@ TEST(MatchedFilter, LagNotUpdatedForLowLevelRender) {
capture.fill(0.f); capture.fill(0.f);
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
kNumMatchedFilters, kAlignmentShiftSubBlocks); kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3)); RenderDelayBuffer::Create(3));
DecimatorBy4 capture_decimator; DecimatorBy4 capture_decimator;
@ -273,7 +273,7 @@ TEST(MatchedFilter, NumberOfLagEstimates) {
for (size_t num_matched_filters = 0; num_matched_filters < 10; for (size_t num_matched_filters = 0; num_matched_filters < 10;
++num_matched_filters) { ++num_matched_filters) {
MatchedFilter filter(&data_dumper, DetectOptimization(), 32, MatchedFilter filter(&data_dumper, DetectOptimization(), 32,
num_matched_filters, 1); num_matched_filters, 1, 150);
EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size()); EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size());
} }
} }
@ -283,12 +283,13 @@ TEST(MatchedFilter, NumberOfLagEstimates) {
// Verifies the check for non-zero windows size. // Verifies the check for non-zero windows size.
TEST(MatchedFilter, ZeroWindowSize) { TEST(MatchedFilter, ZeroWindowSize) {
ApmDataDumper data_dumper(0); ApmDataDumper data_dumper(0);
EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1), ""); EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1, 150),
"");
} }
// Verifies the check for non-null data dumper. // Verifies the check for non-null data dumper.
TEST(MatchedFilter, NullDataDumper) { TEST(MatchedFilter, NullDataDumper) {
EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1), ""); EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1, 150), "");
} }
#endif #endif

View File

@ -17,6 +17,7 @@
#include "webrtc/modules/audio_processing/aec3/aec3_common.h" #include "webrtc/modules/audio_processing/aec3/aec3_common.h"
#include "webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h" #include "webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h"
#include "webrtc/modules/audio_processing/aec3/render_delay_controller_metrics.h" #include "webrtc/modules/audio_processing/aec3/render_delay_controller_metrics.h"
#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/rtc_base/atomicops.h" #include "webrtc/rtc_base/atomicops.h"
#include "webrtc/rtc_base/constructormagic.h" #include "webrtc/rtc_base/constructormagic.h"
@ -26,7 +27,9 @@ namespace {
class RenderDelayControllerImpl final : public RenderDelayController { class RenderDelayControllerImpl final : public RenderDelayController {
public: public:
RenderDelayControllerImpl(int sample_rate_hz); RenderDelayControllerImpl(
const AudioProcessing::Config::EchoCanceller3& config,
int sample_rate_hz);
~RenderDelayControllerImpl() override; ~RenderDelayControllerImpl() override;
void Reset() override; void Reset() override;
void SetDelay(size_t render_delay) override; void SetDelay(size_t render_delay) override;
@ -68,10 +71,12 @@ size_t ComputeNewBufferDelay(size_t current_delay,
int RenderDelayControllerImpl::instance_count_ = 0; int RenderDelayControllerImpl::instance_count_ = 0;
RenderDelayControllerImpl::RenderDelayControllerImpl(int sample_rate_hz) RenderDelayControllerImpl::RenderDelayControllerImpl(
const AudioProcessing::Config::EchoCanceller3& config,
int sample_rate_hz)
: data_dumper_( : data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
delay_estimator_(data_dumper_.get()) { delay_estimator_(data_dumper_.get(), config) {
RTC_DCHECK(ValidFullBandRate(sample_rate_hz)); RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
} }
@ -134,8 +139,10 @@ size_t RenderDelayControllerImpl::GetDelay(
} // namespace } // namespace
RenderDelayController* RenderDelayController::Create(int sample_rate_hz) { RenderDelayController* RenderDelayController::Create(
return new RenderDelayControllerImpl(sample_rate_hz); const AudioProcessing::Config::EchoCanceller3& config,
int sample_rate_hz) {
return new RenderDelayControllerImpl(config, sample_rate_hz);
} }
} // namespace webrtc } // namespace webrtc

View File

@ -13,6 +13,7 @@
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h" #include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h" #include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
#include "webrtc/rtc_base/array_view.h" #include "webrtc/rtc_base/array_view.h"
#include "webrtc/rtc_base/optional.h" #include "webrtc/rtc_base/optional.h"
@ -22,7 +23,9 @@ namespace webrtc {
// Class for aligning the render and capture signal using a RenderDelayBuffer. // Class for aligning the render and capture signal using a RenderDelayBuffer.
class RenderDelayController { class RenderDelayController {
public: public:
static RenderDelayController* Create(int sample_rate_hz); static RenderDelayController* Create(
const AudioProcessing::Config::EchoCanceller3& config,
int sample_rate_hz);
virtual ~RenderDelayController() = default; virtual ~RenderDelayController() = default;
// Resets the delay controller. // Resets the delay controller.

View File

@ -50,7 +50,8 @@ TEST(RenderDelayController, NoRenderSignal) {
std::unique_ptr<RenderDelayBuffer> delay_buffer( std::unique_ptr<RenderDelayBuffer> delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(rate)); RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
rate));
for (size_t k = 0; k < 100; ++k) { for (size_t k = 0; k < 100; ++k) {
EXPECT_EQ(0u, delay_controller->GetDelay( EXPECT_EQ(0u, delay_controller->GetDelay(
delay_buffer->GetDownsampledRenderBuffer(), block)); delay_buffer->GetDownsampledRenderBuffer(), block));
@ -68,7 +69,8 @@ TEST(RenderDelayController, BasicApiCalls) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(rate)); RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
rate));
for (size_t k = 0; k < 10; ++k) { for (size_t k = 0; k < 10; ++k) {
render_delay_buffer->Insert(render_block); render_delay_buffer->Insert(render_block);
render_delay_buffer->UpdateBuffers(); render_delay_buffer->UpdateBuffers();
@ -95,7 +97,8 @@ TEST(RenderDelayController, Alignment) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(rate)); RenderDelayController::Create(
AudioProcessing::Config::EchoCanceller3(), rate));
DelayBuffer<float> signal_delay_buffer(delay_samples); DelayBuffer<float> signal_delay_buffer(delay_samples);
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) { for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
RandomizeSampleVector(&random_generator, render_block[0]); RandomizeSampleVector(&random_generator, render_block[0]);
@ -139,7 +142,8 @@ TEST(RenderDelayController, AlignmentWithJitter) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(rate)); RenderDelayController::Create(
AudioProcessing::Config::EchoCanceller3(), rate));
DelayBuffer<float> signal_delay_buffer(delay_samples); DelayBuffer<float> signal_delay_buffer(delay_samples);
for (size_t j = 0; for (size_t j = 0;
j < j <
@ -188,7 +192,8 @@ TEST(RenderDelayController, InitialHeadroom) {
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller( std::unique_ptr<RenderDelayController> delay_controller(
RenderDelayController::Create(rate)); RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
rate));
EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples()); EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
} }
} }
@ -204,7 +209,8 @@ TEST(RenderDelayController, WrongCaptureSize) {
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
EXPECT_DEATH( EXPECT_DEATH(
std::unique_ptr<RenderDelayController>( std::unique_ptr<RenderDelayController>(
RenderDelayController::Create(rate)) RenderDelayController::Create(
AudioProcessing::Config::EchoCanceller3(), rate))
->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(), ->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
block), block),
""); "");
@ -219,8 +225,9 @@ TEST(RenderDelayController, DISABLED_WrongSampleRate) {
SCOPED_TRACE(ProduceDebugText(rate)); SCOPED_TRACE(ProduceDebugText(rate));
std::unique_ptr<RenderDelayBuffer> render_delay_buffer( std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate))); RenderDelayBuffer::Create(NumBandsForRate(rate)));
EXPECT_DEATH(std::unique_ptr<RenderDelayController>( EXPECT_DEATH(
RenderDelayController::Create(rate)), std::unique_ptr<RenderDelayController>(RenderDelayController::Create(
AudioProcessing::Config::EchoCanceller3(), rate)),
""); "");
} }
} }

View File

@ -292,8 +292,14 @@ class AudioProcessing : public rtc::RefCountInterface {
struct EchoAudibility { struct EchoAudibility {
float low_render_limit = 192.f; float low_render_limit = 192.f;
float normal_render_limit = 64.f; float normal_render_limit = 64.f;
float active_render_limit = 100.f;
} echo_audibility; } echo_audibility;
struct RenderLevels {
float active_render_limit = 100.f;
float poor_excitation_render_limit = 150.f;
} render_levels;
struct GainUpdates { struct GainUpdates {
struct GainChanges { struct GainChanges {
float max_inc; float max_inc;