1 /* 2 * Copyright (c) 2012 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 11 #include "webrtc/tools/agc/test_utils.h" 12 13 #include <cmath> 14 15 #include <algorithm> 16 17 #include "webrtc/modules/include/module_common_types.h" 18 19 namespace webrtc { 20 21 float MicLevel2Gain(int gain_range_db, int level) { 22 return (level - 127.0f) / 128.0f * gain_range_db / 2; 23 } 24 25 float Db2Linear(float db) { 26 return powf(10.0f, db / 20.0f); 27 } 28 29 void ApplyGainLinear(float gain, float last_gain, AudioFrame* frame) { 30 const size_t frame_length = 31 frame->samples_per_channel_ * frame->num_channels_; 32 // Smooth the transition between gain levels across the frame. 33 float smoothed_gain = last_gain; 34 float gain_step = (gain - last_gain) / (frame_length - 1); 35 for (size_t i = 0; i < frame_length; ++i) { 36 smoothed_gain += gain_step; 37 float sample = std::floor(frame->data_[i] * smoothed_gain + 0.5); 38 sample = std::max(std::min(32767.0f, sample), -32768.0f); 39 frame->data_[i] = static_cast<int16_t>(sample); 40 } 41 } 42 43 void ApplyGain(float gain_db, float last_gain_db, AudioFrame* frame) { 44 ApplyGainLinear(Db2Linear(gain_db), Db2Linear(last_gain_db), frame); 45 } 46 47 void SimulateMic(int gain_range_db, int mic_level, int last_mic_level, 48 AudioFrame* frame) { 49 assert(mic_level >= 0 && mic_level <= 255); 50 assert(last_mic_level >= 0 && last_mic_level <= 255); 51 ApplyGain(MicLevel2Gain(gain_range_db, mic_level), 52 MicLevel2Gain(gain_range_db, last_mic_level), 53 frame); 54 } 55 56 void SimulateMic(int gain_map[255], int mic_level, int last_mic_level, 57 AudioFrame* frame) { 58 assert(mic_level >= 0 && mic_level <= 255); 59 assert(last_mic_level >= 0 && last_mic_level <= 255); 60 ApplyGain(gain_map[mic_level], gain_map[last_mic_level], frame); 61 } 62 63 } // namespace webrtc 64 65