Send runtime settings to the Audio Processing Module (APM)
This CL includes the following changes:
- APM runtime setting (ID + float payload) and unit tests
- Swap queue of APM runtime settings used in AudioProcessingImpl
- runtime settings handler that forwards the settings to APM
sub-modules when a message is retrieved from the queue
- Unit test placeholder to check that the pre-gain update message
is correctly delivered
Bug: webrtc:9138
Change-Id: Id22704af15fde2b87a4431f5ce64ad1aeafc5280
Reviewed-on: https://webrtc-review.googlesource.com/69320
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Reviewed-by: Alex Loiko <aleloi@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22873}
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index 3724090..7f9cbcd 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -66,6 +66,8 @@
std::unique_ptr<AudioGenerator> audio_generator) override;
void DetachPlayoutAudioGenerator() override;
+ void SetRuntimeSetting(RuntimeSetting setting) override;
+
// Capture-side exclusive methods possibly running APM in a
// multi-threaded manner. Acquire the capture lock.
int ProcessStream(AudioFrame* frame) override;
@@ -149,6 +151,21 @@
std::unique_ptr<ApmDataDumper> data_dumper_;
static int instance_count_;
+ std::unique_ptr<SwapQueue<RuntimeSetting>> runtime_settings_;
+
+ // Class providing thread-safe message pipe functionality for
+ // |runtime_settings_|.
+ class RuntimeSettingEnqueuer {
+ public:
+ explicit RuntimeSettingEnqueuer(
+ SwapQueue<RuntimeSetting>* runtime_settings);
+ ~RuntimeSettingEnqueuer();
+ void Enqueue(RuntimeSetting setting);
+
+ private:
+ SwapQueue<RuntimeSetting>* runtime_settings_;
+ } runtime_settings_enqueuer_;
+
// Submodule interface implementations.
std::unique_ptr<HighPassFilter> high_pass_filter_impl_;
@@ -239,6 +256,9 @@
void InitializePostProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializePreProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
+ // Handle all the runtime settings in the queue.
+ void HandleRuntimeSettings() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
+
void EmptyQueuedRenderAudio();
void AllocateRenderQueue()
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);