APM: fix level estimator null pointer bug

When APM is used without calling `ApplyConfig()` and the level
estimator sub-module, which is disabled by default (see [1]), is used,
APM crashes because the enabled config flag is true, but the unique
pointer object is unset.

[1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/modules/audio_processing/include/audio_processing.h;l=391?q=include%2Faudio_processing.h

Bug: webrtc:7494
Change-Id: I482a9aa4f6a0a56793769674aba7b2661330bb14
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/235375
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35230}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index ee9f5c7..d85ec62 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -418,6 +418,7 @@
   InitializePostProcessor();
   InitializePreProcessor();
   InitializeCaptureLevelsAdjuster();
+  InitializeLevelEstimator();
 
   if (aec_dump_) {
     aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis());
@@ -595,9 +596,7 @@
     InitializeCaptureLevelsAdjuster();
   }
 
-  if (config_.level_estimation.enabled && !submodules_.output_level_estimator) {
-    submodules_.output_level_estimator = std::make_unique<LevelEstimator>();
-  }
+  InitializeLevelEstimator();
 
   if (voice_detection_config_changed) {
     InitializeVoiceDetector();
@@ -1333,8 +1332,8 @@
       submodules_.capture_post_processor->Process(capture_buffer);
     }
 
-    // The level estimator operates on the recombined data.
-    if (config_.level_estimation.enabled) {
+    if (submodules_.output_level_estimator) {
+      // The level estimator operates on the recombined data.
       submodules_.output_level_estimator->ProcessStream(*capture_buffer);
       capture_.stats.output_rms_dbfs =
           submodules_.output_level_estimator->RMS();
@@ -2015,6 +2014,16 @@
   }
 }
 
+void AudioProcessingImpl::InitializeLevelEstimator() {
+  if (!config_.level_estimation.enabled) {
+    submodules_.output_level_estimator.reset();
+    return;
+  }
+  if (!submodules_.output_level_estimator) {
+    submodules_.output_level_estimator = std::make_unique<LevelEstimator>();
+  }
+}
+
 void AudioProcessingImpl::InitializePostProcessor() {
   if (submodules_.capture_post_processor) {
     submodules_.capture_post_processor->Initialize(
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index 89f5d63..6b19b4d 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -284,6 +284,7 @@
       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
   void InitializePostProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
   void InitializeAnalyzer() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
+  void InitializeLevelEstimator() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
 
   // Initializations of render-only submodules, requiring the render lock
   // already acquired.