diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc index 638621d32d..9551d0b857 100644 --- a/modules/audio_processing/agc/agc_manager_direct.cc +++ b/modules/audio_processing/agc/agc_manager_direct.cc @@ -146,17 +146,19 @@ int InitializeGainControl(GainControl* gain_control, float ComputeClippedRatio(const float* const* audio, size_t num_channels, size_t samples_per_channel) { - RTC_DCHECK_GT(num_channels * samples_per_channel, 0); + RTC_DCHECK_GT(samples_per_channel, 0); int num_clipped = 0; for (size_t ch = 0; ch < num_channels; ++ch) { + int num_clipped_in_ch = 0; for (size_t i = 0; i < samples_per_channel; ++i) { RTC_DCHECK(audio[ch]); if (audio[ch][i] >= 32767.f || audio[ch][i] <= -32768.f) { - ++num_clipped; + ++num_clipped_in_ch; } } + num_clipped = std::max(num_clipped, num_clipped_in_ch); } - return static_cast(num_clipped) / (num_channels * samples_per_channel); + return static_cast(num_clipped) / (samples_per_channel); } } // namespace diff --git a/modules/audio_processing/agc/agc_manager_direct_unittest.cc b/modules/audio_processing/agc/agc_manager_direct_unittest.cc index 41f1904bf6..7c261d408b 100644 --- a/modules/audio_processing/agc/agc_manager_direct_unittest.cc +++ b/modules/audio_processing/agc/agc_manager_direct_unittest.cc @@ -113,8 +113,13 @@ class AgcManagerDirectTest : public ::testing::Test { void CallPreProc(int num_calls, float clipped_ratio) { RTC_DCHECK_GE(1.f, clipped_ratio); - int num_clipped = kNumChannels * kSamplesPerChannel * clipped_ratio; - std::fill(audio_data.begin(), audio_data.begin() + num_clipped, 32767.f); + const int num_clipped = kSamplesPerChannel * clipped_ratio; + std::fill(audio_data.begin(), audio_data.end(), 0.f); + for (size_t ch = 0; ch < kNumChannels; ++ch) { + for (int k = 0; k < num_clipped; ++k) { + audio[ch][k] = 32767.f; + } + } for (int i = 0; i < num_calls; ++i) { manager_.AnalyzePreProcess(audio.data(), kNumChannels,