APM: Fix benign race in MaybeInitializeCapture()

MaybeInitializeCapture may overwrite the render configuration of a concurrent render reinitialization, leading to a second render reinitialization on the next render processing call.

See bug description for details.

Tested: Verified bitexactness offline (single-threaded) on a large number of aecdumps.
Bug: webrtc:14495
Change-Id: I9b70b454ce1c27859c3414c9c9ec89b7bbe35559
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/277380
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38241}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 81d9660..9405e14 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -728,18 +728,20 @@
   }
 
   if (processing_config.input_stream() != input_config) {
-    processing_config.input_stream() = input_config;
     reinitialization_required = true;
   }
 
   if (processing_config.output_stream() != output_config) {
-    processing_config.output_stream() = output_config;
     reinitialization_required = true;
   }
 
   if (reinitialization_required) {
     MutexLock lock_render(&mutex_render_);
     MutexLock lock_capture(&mutex_capture_);
+    // Reread the API format since the render format may have changed.
+    processing_config = formats_.api_format;
+    processing_config.input_stream() = input_config;
+    processing_config.output_stream() = output_config;
     RETURN_ON_ERR(InitializeLocked(processing_config));
   }
   return kNoError;