1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#include "gain.hpp"
#include "math.h"
namespace VideoStitch {
namespace Audio {
gainDB_t clampGain(gainDB_t x) {
if (x < kGainMin) {
Logger::get(Logger::Warning) << "Gain " << x << " < than min value accepted " << kGainMin;
return kGainMin;
} else if (x > kGainMax) {
Logger::get(Logger::Warning) << "Gain " << x << " > than max value accepted " << kGainMax;
return kGainMax;
}
return x;
}
gainLin_t dBToLin(gainDB_t x) { return pow(10., x / 20.); }
gainPercent_t dBToPercent(gainDB_t x) { return (x - kGainMin) * 100. / (kGainMax - kGainMin); }
gainDB_t linToDB(gainLin_t x) { return 20. * log10(x); }
gainPercent_t linToPercent(gainLin_t x) { return dBToPercent(linToDB(x)); }
gainDB_t percentToDB(gainPercent_t x) { return x * (kGainMax - kGainMin) / 100. + kGainMin; }
gainLin_t percentToLin(gainPercent_t x) { return (dBToLin(percentToDB(x))); }
Gain::Gain(gainDB_t gaindB, bool reversePolarity, bool mute)
: AudioObject("gain", AudioFunction::PROCESSOR),
gain_(dBToLin(gaindB)),
reversePolarity_(reversePolarity),
mute_(mute) {}
gainDB_t Gain::getGainDB() { return linToDB(gain_); }
gainPercent_t Gain::getGainPercent() { return linToPercent(gain_); }
bool Gain::getMute() { return mute_; }
bool Gain::getReversePolarity() { return reversePolarity_; }
void Gain::setGainDB(gainDB_t gain) { gain_ = dBToLin(clampGain(gain)); }
void Gain::setGainPercent(gainPercent_t gain) { gain_ = dBToLin(clampGain(percentToDB(gain))); }
void Gain::setMute(bool m) { mute_ = m; }
void Gain::setReversePolarity(bool r) { reversePolarity_ = r; }
void Gain::step(AudioBlock &out, const AudioBlock &in) {
AudioBlock workingBlock = in.clone();
step(workingBlock);
out = std::move(workingBlock);
}
void Gain::step(AudioBlock &inout) {
if (mute_) {
for (auto &track : inout) {
memset(track.data(), 0, track.size() * sizeof(audioSample_t));
}
} else {
gainLin_t gain;
if (reversePolarity_) {
gain = -gain_;
} else {
gain = gain_;
}
for (auto &track : inout) {
for (auto &s : track) {
s *= gain;
}
}
}
}
} // namespace Audio
} // namespace VideoStitch