33
33
#include "audiobuffer.h"
36
DSP::speexStateDeleter(SpeexPreprocessState *state)
38
speex_preprocess_state_destroy(state);
35
41
DSP::DSP(int smplPerFrame, int channels, int samplingRate) :
36
42
smplPerFrame_(smplPerFrame),
37
noiseStates_(channels, nullptr)
39
for (auto &state : noiseStates_)
40
state = speex_preprocess_state_init(smplPerFrame_, samplingRate);
45
for (int c = 0; c < channels; ++c)
47
{speex_preprocess_state_init(smplPerFrame_, samplingRate),
43
51
void DSP::enableAGC()
45
53
// automatic gain control, range [1-32768]
46
for (auto &state : noiseStates_) {
54
for (const auto &state : dspStates_) {
48
speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC, &enable);
56
speex_preprocess_ctl(state.get(), SPEEX_PREPROCESS_SET_AGC, &enable);
49
57
int target = 16000;
50
speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC_TARGET, &target);
58
speex_preprocess_ctl(state.get(), SPEEX_PREPROCESS_SET_AGC_TARGET, &target);
54
62
void DSP::disableAGC()
56
for (auto &state : noiseStates_) {
64
for (const auto &state : dspStates_) {
58
speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC, &enable);
66
speex_preprocess_ctl(state.get(), SPEEX_PREPROCESS_SET_AGC, &enable);
62
70
void DSP::enableDenoise()
64
for (auto &state : noiseStates_) {
72
for (const auto &state : dspStates_) {
66
speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DENOISE, &enable);
74
speex_preprocess_ctl(state.get(), SPEEX_PREPROCESS_SET_DENOISE, &enable);
70
78
void DSP::disableDenoise()
72
for (auto &state : noiseStates_) {
80
for (const auto &state : dspStates_) {
74
speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DENOISE, &enable);
82
speex_preprocess_ctl(state.get(), SPEEX_PREPROCESS_SET_DENOISE, &enable);
80
for (auto state : noiseStates_)
81
speex_preprocess_state_destroy(state);
84
86
void DSP::process(AudioBuffer& buff, int samples)
86
88
if (samples != smplPerFrame_) {
91
93
auto &channelData = buff.getData();
93
95
for (auto &c : channelData) {
94
if (index < noiseStates_.size() and noiseStates_[index])
95
speex_preprocess_run(noiseStates_[index], c.data());
96
if (index < dspStates_.size() and dspStates_[index].get())
97
speex_preprocess_run(dspStates_[index].get(), c.data());