webrtc_m130/webrtc/tools/agc/test_utils.cc
Peter Kasting dce40cf804 Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.

This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.

This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002

The change is being landed as TBR to all the folks who reviewed the above.

BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher

Review URL: https://codereview.webrtc.org/1230503003 .

Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 21:52:45 +00:00

65 lines
2.1 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.
*/
#include "webrtc/tools/agc/test_utils.h"
#include <cmath>
#include <algorithm>
#include "webrtc/modules/interface/module_common_types.h"
namespace webrtc {
float MicLevel2Gain(int gain_range_db, int level) {
return (level - 127.0f) / 128.0f * gain_range_db / 2;
}
float Db2Linear(float db) {
return powf(10.0f, db / 20.0f);
}
void ApplyGainLinear(float gain, float last_gain, AudioFrame* frame) {
const size_t frame_length =
frame->samples_per_channel_ * frame->num_channels_;
// Smooth the transition between gain levels across the frame.
float smoothed_gain = last_gain;
float gain_step = (gain - last_gain) / (frame_length - 1);
for (size_t i = 0; i < frame_length; ++i) {
smoothed_gain += gain_step;
float sample = std::floor(frame->data_[i] * smoothed_gain + 0.5);
sample = std::max(std::min(32767.0f, sample), -32768.0f);
frame->data_[i] = static_cast<int16_t>(sample);
}
}
void ApplyGain(float gain_db, float last_gain_db, AudioFrame* frame) {
ApplyGainLinear(Db2Linear(gain_db), Db2Linear(last_gain_db), frame);
}
void SimulateMic(int gain_range_db, int mic_level, int last_mic_level,
AudioFrame* frame) {
assert(mic_level >= 0 && mic_level <= 255);
assert(last_mic_level >= 0 && last_mic_level <= 255);
ApplyGain(MicLevel2Gain(gain_range_db, mic_level),
MicLevel2Gain(gain_range_db, last_mic_level),
frame);
}
void SimulateMic(int gain_map[255], int mic_level, int last_mic_level,
AudioFrame* frame) {
assert(mic_level >= 0 && mic_level <= 255);
assert(last_mic_level >= 0 && last_mic_level <= 255);
ApplyGain(gain_map[mic_level], gain_map[last_mic_level], frame);
}
} // namespace webrtc