diff --git a/libraries/audio/src/AudioGate.cpp b/libraries/audio/src/AudioGate.cpp index 15574f64f2..0bed2ef2dc 100644 --- a/libraries/audio/src/AudioGate.cpp +++ b/libraries/audio/src/AudioGate.cpp @@ -145,6 +145,7 @@ public: int32_t envelope(int32_t attn); virtual void process(int16_t* input, int16_t* output, int numFrames) = 0; + virtual void removeDC(int16_t* input, int16_t* output, int numFrames) = 0; }; GateImpl::GateImpl(int sampleRate) { @@ -412,6 +413,7 @@ public: // mono input/output (in-place is allowed) void process(int16_t* input, int16_t* output, int numFrames) override; + void removeDC(int16_t* input, int16_t* output, int numFrames) override; }; template @@ -467,6 +469,21 @@ void GateMono::process(int16_t* input, int16_t* output, int numFrames) { processHistogram(numFrames); } +template +void GateMono::removeDC(int16_t* input, int16_t* output, int numFrames) { + + for (int n = 0; n < numFrames; n++) { + + int32_t x = input[n]; + + // remove DC + _dc.process(x); + + // store 16-bit output + output[n] = (int16_t)saturateQ30(x); + } +} + // // Gate (stereo) // @@ -482,6 +499,7 @@ public: // interleaved stereo input/output (in-place is allowed) void process(int16_t* input, int16_t* output, int numFrames) override; + void removeDC(int16_t* input, int16_t* output, int numFrames) override; }; template @@ -540,6 +558,23 @@ void GateStereo::process(int16_t* input, int16_t* output, int numFrames) { processHistogram(numFrames); } +template +void GateStereo::removeDC(int16_t* input, int16_t* output, int numFrames) { + + for (int n = 0; n < numFrames; n++) { + + int32_t x0 = input[2*n+0]; + int32_t x1 = input[2*n+1]; + + // remove DC + _dc.process(x0, x1); + + // store 16-bit output + output[2*n+0] = (int16_t)saturateQ30(x0); + output[2*n+1] = (int16_t)saturateQ30(x1); + } +} + // // Gate (quad) // @@ -555,6 +590,7 @@ public: // interleaved quad input/output (in-place is allowed) void process(int16_t* input, int16_t* output, int numFrames) override; + void removeDC(int16_t* input, int16_t* output, int numFrames) override; }; template @@ -619,6 +655,27 @@ void GateQuad::process(int16_t* input, int16_t* output, int numFrames) { processHistogram(numFrames); } +template +void GateQuad::removeDC(int16_t* input, int16_t* output, int numFrames) { + + for (int n = 0; n < numFrames; n++) { + + int32_t x0 = input[4*n+0]; + int32_t x1 = input[4*n+1]; + int32_t x2 = input[4*n+2]; + int32_t x3 = input[4*n+3]; + + // remove DC + _dc.process(x0, x1, x2, x3); + + // store 16-bit output + output[4*n+0] = (int16_t)saturateQ30(x0); + output[4*n+1] = (int16_t)saturateQ30(x1); + output[4*n+2] = (int16_t)saturateQ30(x2); + output[4*n+3] = (int16_t)saturateQ30(x3); + } +} + // // Public API // @@ -677,6 +734,10 @@ void AudioGate::render(int16_t* input, int16_t* output, int numFrames) { _impl->process(input, output, numFrames); } +void AudioGate::removeDC(int16_t* input, int16_t* output, int numFrames) { + _impl->removeDC(input, output, numFrames); +} + void AudioGate::setThreshold(float threshold) { _impl->setThreshold(threshold); } diff --git a/libraries/audio/src/AudioGate.h b/libraries/audio/src/AudioGate.h index 527de17eb4..d4ae3c5fe8 100644 --- a/libraries/audio/src/AudioGate.h +++ b/libraries/audio/src/AudioGate.h @@ -20,6 +20,7 @@ public: // interleaved int16_t input/output (in-place is allowed) void render(int16_t* input, int16_t* output, int numFrames); + void removeDC(int16_t* input, int16_t* output, int numFrames); void setThreshold(float threshold); void setRelease(float release);