blob: 5b5bd03b164020c39c85f1967237ca12a3f18546 [file] [log] [blame]
alessiob3ec96df2017-05-22 06:57:06 -07001/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Alessio Bazzica270f7b52017-10-13 11:05:17 +020011#include <algorithm>
alessiob3ec96df2017-05-22 06:57:06 -070012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/array_view.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/audio_processing/audio_buffer.h"
Alex Loikoe36e8bb2018-02-16 11:54:07 +010015#include "modules/audio_processing/gain_controller2.h"
Alessio Bazzica270f7b52017-10-13 11:05:17 +020016#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "test/gtest.h"
alessiob3ec96df2017-05-22 06:57:06 -070018
19namespace webrtc {
20namespace test {
21
22namespace {
23
Alessio Bazzica270f7b52017-10-13 11:05:17 +020024constexpr size_t kFrameSizeMs = 10u;
alessiob3ec96df2017-05-22 06:57:06 -070025constexpr size_t kStereo = 2u;
26
27void SetAudioBufferSamples(float value, AudioBuffer* ab) {
Alessio Bazzica270f7b52017-10-13 11:05:17 +020028 // Sets all the samples in |ab| to |value|.
alessiob3ec96df2017-05-22 06:57:06 -070029 for (size_t k = 0; k < ab->num_channels(); ++k) {
Alessio Bazzica270f7b52017-10-13 11:05:17 +020030 std::fill(ab->channels_f()[k], ab->channels_f()[k] + ab->num_frames(),
31 value);
alessiob3ec96df2017-05-22 06:57:06 -070032 }
33}
34
alessiob3ec96df2017-05-22 06:57:06 -070035} // namespace
36
Alessio Bazzica270f7b52017-10-13 11:05:17 +020037TEST(GainController2, CreateApplyConfig) {
38 // Instances GainController2 and applies different configurations.
39 std::unique_ptr<GainController2> gain_controller2(new GainController2());
40
41 // Check that the default config is valid.
42 AudioProcessing::Config::GainController2 config;
43 EXPECT_TRUE(GainController2::Validate(config));
44 gain_controller2->ApplyConfig(config);
45
46 // Check that attenuation is not allowed.
47 config.fixed_gain_db = -5.f;
48 EXPECT_FALSE(GainController2::Validate(config));
49
50 // Check that valid configurations are applied.
51 for (const float& fixed_gain_db : {0.f, 5.f, 10.f, 50.f}) {
52 config.fixed_gain_db = fixed_gain_db;
53 EXPECT_TRUE(GainController2::Validate(config));
54 gain_controller2->ApplyConfig(config);
55 }
alessiob3ec96df2017-05-22 06:57:06 -070056}
57
58TEST(GainController2, ToString) {
Alessio Bazzica270f7b52017-10-13 11:05:17 +020059 // Tests GainController2::ToString().
60 AudioProcessing::Config::GainController2 config;
61 config.fixed_gain_db = 5.f;
alessiob3ec96df2017-05-22 06:57:06 -070062
Alessio Bazzica270f7b52017-10-13 11:05:17 +020063 config.enabled = false;
Alex Loiko9d2788f2018-03-29 11:02:43 +020064 EXPECT_EQ("{enabled: false, fixed_gain_dB: 5}",
Alessio Bazzica270f7b52017-10-13 11:05:17 +020065 GainController2::ToString(config));
alessiob3ec96df2017-05-22 06:57:06 -070066
Alessio Bazzica270f7b52017-10-13 11:05:17 +020067 config.enabled = true;
Alex Loiko9d2788f2018-03-29 11:02:43 +020068 EXPECT_EQ("{enabled: true, fixed_gain_dB: 5}",
Alessio Bazzica270f7b52017-10-13 11:05:17 +020069 GainController2::ToString(config));
alessiob3ec96df2017-05-22 06:57:06 -070070}
71
72TEST(GainController2, Usage) {
Alessio Bazzica270f7b52017-10-13 11:05:17 +020073 // Tests GainController2::Process() on an AudioBuffer instance.
74 std::unique_ptr<GainController2> gain_controller2(new GainController2());
75 gain_controller2->Initialize(AudioProcessing::kSampleRate48kHz);
76 const size_t num_frames = rtc::CheckedDivExact<size_t>(
77 kFrameSizeMs * AudioProcessing::kSampleRate48kHz, 1000);
78 AudioBuffer ab(num_frames, kStereo, num_frames, kStereo, num_frames);
79 constexpr float sample_value = 1000.f;
80 SetAudioBufferSamples(sample_value, &ab);
81 AudioProcessing::Config::GainController2 config;
82
83 // Check that samples are not modified when the fixed gain is 0 dB.
Alex Loikoe36e8bb2018-02-16 11:54:07 +010084 config.fixed_gain_db = 0.f;
Alessio Bazzica270f7b52017-10-13 11:05:17 +020085 gain_controller2->ApplyConfig(config);
alessiob3ec96df2017-05-22 06:57:06 -070086 gain_controller2->Process(&ab);
Alessio Bazzica270f7b52017-10-13 11:05:17 +020087 EXPECT_EQ(ab.channels_f()[0][0], sample_value);
88
89 // Check that samples are amplified when the fixed gain is greater than 0 dB.
90 config.fixed_gain_db = 5.f;
91 gain_controller2->ApplyConfig(config);
92 gain_controller2->Process(&ab);
93 EXPECT_LT(sample_value, ab.channels_f()[0][0]);
alessiob3ec96df2017-05-22 06:57:06 -070094}
95
96} // namespace test
97} // namespace webrtc