
functionalities doing sample-rate conversions: -The implicit resampling done in the AudioBuffer CopyTo, CopyFrom, InterleaveTo and DeinterleaveFrom methods. -The multi-band splitting scheme. The selection of rates in these have been difficult and complicated, partly due to that the APM API which allows for activating the APM submodules without notifying the APM. This CL adds functionality that for each capture frame polls all submodules for whether they are active or not and compares this against a cached result. Furthermore, new functionality is added that based on the results of the comparison do a reinitialization of the APM. This has several advantages -The code deciding on whether to analysis and synthesis is needed for the bandsplitting can be much simplified and centralized. -The selection of the processing rate can be done such as to avoid the implicit resampling that was in some cases unnecessarily done. -The optimization for whether an output copy is needed that was done to improve performance due to the implicit resampling is no longer needed, which simplifies the code and makes it less error-prone in the sense that is no longer neccessary to keep track of whether any module has changed the signal. Finally, it should be noted that the polling of the state for all the submodules was done previously as well, but in a less obvious and distributed manner. BUG=webrtc:6181, webrtc:6220, webrtc:5298, webrtc:6296, webrtc:6298, webrtc:6297 Review-Url: https://codereview.webrtc.org/2304123002 Cr-Commit-Position: refs/heads/master@{#14175}
105 lines
3.6 KiB
C++
105 lines
3.6 KiB
C++
/*
|
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_IMPL_H_
|
|
#define WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_IMPL_H_
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "webrtc/base/constructormagic.h"
|
|
#include "webrtc/base/criticalsection.h"
|
|
#include "webrtc/base/swap_queue.h"
|
|
#include "webrtc/base/thread_annotations.h"
|
|
#include "webrtc/modules/audio_processing/include/audio_processing.h"
|
|
#include "webrtc/modules/audio_processing/render_queue_item_verifier.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class AudioBuffer;
|
|
|
|
class GainControlImpl : public GainControl {
|
|
public:
|
|
GainControlImpl(rtc::CriticalSection* crit_render,
|
|
rtc::CriticalSection* crit_capture);
|
|
~GainControlImpl() override;
|
|
|
|
int ProcessRenderAudio(AudioBuffer* audio);
|
|
int AnalyzeCaptureAudio(AudioBuffer* audio);
|
|
int ProcessCaptureAudio(AudioBuffer* audio, bool stream_has_echo);
|
|
|
|
void Initialize(size_t num_proc_channels, int sample_rate_hz);
|
|
|
|
// GainControl implementation.
|
|
bool is_enabled() const override;
|
|
int stream_analog_level() override;
|
|
bool is_limiter_enabled() const override;
|
|
Mode mode() const override;
|
|
|
|
// Reads render side data that has been queued on the render call.
|
|
void ReadQueuedRenderData();
|
|
|
|
int compression_gain_db() const override;
|
|
|
|
private:
|
|
class GainController;
|
|
|
|
// GainControl implementation.
|
|
int Enable(bool enable) override;
|
|
int set_stream_analog_level(int level) override;
|
|
int set_mode(Mode mode) override;
|
|
int set_target_level_dbfs(int level) override;
|
|
int target_level_dbfs() const override;
|
|
int set_compression_gain_db(int gain) override;
|
|
int enable_limiter(bool enable) override;
|
|
int set_analog_level_limits(int minimum, int maximum) override;
|
|
int analog_level_minimum() const override;
|
|
int analog_level_maximum() const override;
|
|
bool stream_is_saturated() const override;
|
|
|
|
void AllocateRenderQueue();
|
|
int Configure();
|
|
|
|
rtc::CriticalSection* const crit_render_ ACQUIRED_BEFORE(crit_capture_);
|
|
rtc::CriticalSection* const crit_capture_;
|
|
|
|
bool enabled_ = false;
|
|
|
|
Mode mode_ GUARDED_BY(crit_capture_);
|
|
int minimum_capture_level_ GUARDED_BY(crit_capture_);
|
|
int maximum_capture_level_ GUARDED_BY(crit_capture_);
|
|
bool limiter_enabled_ GUARDED_BY(crit_capture_);
|
|
int target_level_dbfs_ GUARDED_BY(crit_capture_);
|
|
int compression_gain_db_ GUARDED_BY(crit_capture_);
|
|
int analog_capture_level_ GUARDED_BY(crit_capture_);
|
|
bool was_analog_level_set_ GUARDED_BY(crit_capture_);
|
|
bool stream_is_saturated_ GUARDED_BY(crit_capture_);
|
|
|
|
size_t render_queue_element_max_size_ GUARDED_BY(crit_render_)
|
|
GUARDED_BY(crit_capture_);
|
|
std::vector<int16_t> render_queue_buffer_ GUARDED_BY(crit_render_);
|
|
std::vector<int16_t> capture_queue_buffer_ GUARDED_BY(crit_capture_);
|
|
|
|
// Lock protection not needed.
|
|
std::unique_ptr<
|
|
SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>>
|
|
render_signal_queue_;
|
|
|
|
std::vector<std::unique_ptr<GainController>> gain_controllers_;
|
|
|
|
rtc::Optional<size_t> num_proc_channels_ GUARDED_BY(crit_capture_);
|
|
rtc::Optional<int> sample_rate_hz_ GUARDED_BY(crit_capture_);
|
|
|
|
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(GainControlImpl);
|
|
};
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_IMPL_H_
|