Simplification and refactoring of the AudioBuffer code

This CL performs a major refactoring and simplification
of the AudioBuffer code that.
-Removes 7 of the 9 internal buffers of the AudioBuffer.
-Avoids the implicit copying required to keep the
 internal buffers in sync.
-Removes all code relating to handling of fixed-point
 sample data in the AudioBuffer.
-Changes the naming of the class methods to reflect
 that only floating point is handled.
-Corrects some bugs in the code.
-Extends the handling of internal downmixing to be
 more generic.

Bug: webrtc:10882
Change-Id: I12c8af156fbe366b154744a0a1b3d926bf7be572
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/149828
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28928}
This commit is contained in:
Per Åhgren
2019-08-21 15:02:37 +02:00
committed by Commit Bot
parent f69bd5f184
commit 81c0cf287c
32 changed files with 541 additions and 452 deletions

View File

@ -123,17 +123,16 @@ void GainControlImpl::PackRenderAudioBuffer(
std::array<int16_t, AudioBuffer::kMaxSplitFrameLength> mixed_low_pass_data;
rtc::ArrayView<const int16_t> mixed_low_pass(mixed_low_pass_data.data(),
audio->num_frames_per_band());
if (audio->num_proc_channels() == 1) {
FloatS16ToS16(audio->split_bands_const_f(0)[kBand0To8kHz],
if (audio->num_channels() == 1) {
FloatS16ToS16(audio->split_bands_const(0)[kBand0To8kHz],
audio->num_frames_per_band(), mixed_low_pass_data.data());
} else {
const int num_channels = static_cast<int>(audio->num_channels());
for (size_t i = 0; i < audio->num_frames_per_band(); ++i) {
int32_t value =
FloatS16ToS16(audio->split_channels_const_f(kBand0To8kHz)[0][i]);
FloatS16ToS16(audio->split_channels_const(kBand0To8kHz)[0][i]);
for (int j = 1; j < num_channels; ++j) {
value +=
FloatS16ToS16(audio->split_channels_const_f(kBand0To8kHz)[j][i]);
value += FloatS16ToS16(audio->split_channels_const(kBand0To8kHz)[j][i]);
}
mixed_low_pass_data[i] = value / num_channels;
}
@ -165,13 +164,13 @@ int GainControlImpl::AnalyzeCaptureAudio(AudioBuffer* audio) {
for (auto& gain_controller : gain_controllers_) {
gain_controller->set_capture_level(analog_capture_level_);
audio->CopySplitChannelDataTo(capture_channel, split_bands);
audio->ExportSplitChannelData(capture_channel, split_bands);
int err =
WebRtcAgc_AddMic(gain_controller->state(), split_bands,
audio->num_bands(), audio->num_frames_per_band());
audio->CopySplitChannelDataFrom(capture_channel, split_bands);
audio->ImportSplitChannelData(capture_channel, split_bands);
if (err != AudioProcessing::kNoError) {
return AudioProcessing::kUnspecifiedError;
@ -183,14 +182,14 @@ int GainControlImpl::AnalyzeCaptureAudio(AudioBuffer* audio) {
for (auto& gain_controller : gain_controllers_) {
int32_t capture_level_out = 0;
audio->CopySplitChannelDataTo(capture_channel, split_bands);
audio->ExportSplitChannelData(capture_channel, split_bands);
int err =
WebRtcAgc_VirtualMic(gain_controller->state(), split_bands,
audio->num_bands(), audio->num_frames_per_band(),
analog_capture_level_, &capture_level_out);
audio->CopySplitChannelDataFrom(capture_channel, split_bands);
audio->ImportSplitChannelData(capture_channel, split_bands);
gain_controller->set_capture_level(capture_level_out);
@ -229,7 +228,7 @@ int GainControlImpl::ProcessCaptureAudio(AudioBuffer* audio,
[AudioBuffer::kMaxSplitFrameLength];
int16_t* split_bands[AudioBuffer::kMaxNumBands] = {
split_band_data[0], split_band_data[1], split_band_data[2]};
audio->CopySplitChannelDataTo(capture_channel, split_bands);
audio->ExportSplitChannelData(capture_channel, split_bands);
// The call to stream_has_echo() is ok from a deadlock perspective
// as the capture lock is allready held.
@ -239,7 +238,7 @@ int GainControlImpl::ProcessCaptureAudio(AudioBuffer* audio,
gain_controller->get_capture_level(), &capture_level_out,
stream_has_echo, &saturation_warning);
audio->CopySplitChannelDataFrom(capture_channel, split_bands);
audio->ImportSplitChannelData(capture_channel, split_bands);
if (err != AudioProcessing::kNoError) {
return AudioProcessing::kUnspecifiedError;