APM: Make the GetStatistics call independent of the locks in APM
This CL changes the GetStatistics call in the audio processing module (APM) to not aquire the render or capture locks in APM, while still being thread-safe. This change eliminates the risk of thread-priority inversion due to the GetStatistics call. Apart from the above the CL: -Corrects the GetStatistics to not be const (it was const even though it aquired locks). -Slightly changes the statistics reporting, so that the stats received may be older than the most recent stats reported. Bug: webrtc:11241 Change-Id: I00deb5507e004cbe6e4a19a8bad357491f86f4ab Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163982 Reviewed-by: Sam Zackrisson <saza@webrtc.org> Commit-Queue: Per Åhgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30131}
This commit is contained in:
@ -118,7 +118,12 @@ class AudioProcessingImpl : public AudioProcessing {
|
||||
bool was_stream_delay_set() const override
|
||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
|
||||
|
||||
AudioProcessingStats GetStatistics(bool has_remote_tracks) const override;
|
||||
AudioProcessingStats GetStatistics(bool has_remote_tracks) override {
|
||||
return GetStatistics();
|
||||
}
|
||||
AudioProcessingStats GetStatistics() override {
|
||||
return stats_reporter_.GetStatistics();
|
||||
}
|
||||
|
||||
// TODO(peah): Remove MutateConfig once the new API allows that.
|
||||
void MutateConfig(rtc::FunctionView<void(AudioProcessing::Config*)> mutator);
|
||||
@ -444,6 +449,25 @@ class AudioProcessingImpl : public AudioProcessing {
|
||||
std::unique_ptr<AudioBuffer> render_audio;
|
||||
} render_ RTC_GUARDED_BY(crit_render_);
|
||||
|
||||
// Class for statistics reporting. The class is thread-safe and no lock is
|
||||
// needed when accessing it.
|
||||
class ApmStatsReporter {
|
||||
public:
|
||||
ApmStatsReporter();
|
||||
~ApmStatsReporter();
|
||||
|
||||
// Returns the most recently reported statistics.
|
||||
AudioProcessingStats GetStatistics();
|
||||
|
||||
// Update the cached statistics.
|
||||
void UpdateStatistics(const AudioProcessingStats& new_stats);
|
||||
|
||||
private:
|
||||
rtc::CriticalSection crit_stats_;
|
||||
AudioProcessingStats cached_stats_ RTC_GUARDED_BY(crit_stats_);
|
||||
SwapQueue<AudioProcessingStats> stats_message_queue_;
|
||||
} stats_reporter_;
|
||||
|
||||
std::vector<float> aec_render_queue_buffer_ RTC_GUARDED_BY(crit_render_);
|
||||
std::vector<float> aec_capture_queue_buffer_ RTC_GUARDED_BY(crit_capture_);
|
||||
|
||||
|
Reference in New Issue
Block a user