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;