AEC3: Fix computation of audio buffer delay

This change fixes a bug where the initial delay could be set incorrectly.

Bug: webrtc:10896
Change-Id: I66b2234b69c46639488f4561e973384001230861
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/149820
Commit-Queue: Gustaf Ullberg <gustaf@webrtc.org>
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28894}
diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc
index 92f2f65..11fe450 100644
--- a/modules/audio_processing/aec3/render_delay_buffer.cc
+++ b/modules/audio_processing/aec3/render_delay_buffer.cc
@@ -39,7 +39,7 @@
 
 class RenderDelayBufferImpl final : public RenderDelayBuffer {
  public:
-  RenderDelayBufferImpl(const EchoCanceller3Config& config, size_t num_bands);
+  RenderDelayBufferImpl(const EchoCanceller3Config& config, int sample_rate_hz);
   RenderDelayBufferImpl() = delete;
   ~RenderDelayBufferImpl() override;
 
@@ -90,7 +90,7 @@
   bool external_audio_buffer_delay_verified_after_reset_ = false;
   size_t min_latency_blocks_ = 0;
   size_t excess_render_detection_counter_ = 0;
-  size_t num_bands_;
+  int sample_rate_hz_;
 
   int MapDelayToTotalDelay(size_t delay) const;
   int ComputeDelay() const;
@@ -109,7 +109,7 @@
 int RenderDelayBufferImpl::instance_count_ = 0;
 
 RenderDelayBufferImpl::RenderDelayBufferImpl(const EchoCanceller3Config& config,
-                                             size_t num_bands)
+                                             int sample_rate_hz)
     : data_dumper_(
           new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
       optimization_(DetectOptimization()),
@@ -121,7 +121,7 @@
       blocks_(GetRenderDelayBufferSize(down_sampling_factor_,
                                        config.delay.num_filters,
                                        config.filter.main.length_blocks),
-              num_bands,
+              NumBandsForRate(sample_rate_hz),
               kBlockSize),
       spectra_(blocks_.buffer.size(), kFftLengthBy2Plus1),
       ffts_(blocks_.buffer.size()),
@@ -133,7 +133,8 @@
       fft_(),
       render_ds_(sub_block_size_, 0.f),
       buffer_headroom_(config.filter.main.length_blocks),
-      num_bands_(num_bands) {
+      sample_rate_hz_(sample_rate_hz) {
+  RTC_DCHECK_GE(sample_rate_hz, 8000);
   RTC_DCHECK_EQ(blocks_.buffer.size(), ffts_.buffer.size());
   RTC_DCHECK_EQ(spectra_.buffer.size(), ffts_.buffer.size());
 
@@ -314,7 +315,8 @@
   }
 
   // Convert delay from milliseconds to blocks (rounded down).
-  external_audio_buffer_delay_ = delay_ms >> ((num_bands_ == 1) ? 1 : 2);
+  external_audio_buffer_delay_ =
+      delay_ms >> ((sample_rate_hz_ == 8000) ? 1 : 2);
 }
 
 bool RenderDelayBufferImpl::HasReceivedBufferDelay() {
@@ -455,8 +457,8 @@
 }  // namespace
 
 RenderDelayBuffer* RenderDelayBuffer::Create(const EchoCanceller3Config& config,
-                                             size_t num_bands) {
-  return new RenderDelayBufferImpl(config, num_bands);
+                                             int sample_rate_hz) {
+  return new RenderDelayBufferImpl(config, sample_rate_hz);
 }
 
 }  // namespace webrtc