From d9f12e44dc789384b3f8987c9b9033f96057ab32 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 12 Aug 2016 11:31:06 -0700 Subject: [PATCH] Add resampler support for downsampling with variable-input constant-output buffering mode --- libraries/audio/src/AudioSRC.cpp | 18 ++++++++++++++++++ libraries/audio/src/AudioSRC.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/libraries/audio/src/AudioSRC.cpp b/libraries/audio/src/AudioSRC.cpp index 5dba63b349..44326e5bc4 100644 --- a/libraries/audio/src/AudioSRC.cpp +++ b/libraries/audio/src/AudioSRC.cpp @@ -1030,3 +1030,21 @@ int AudioSRC::getMaxInput(int outputFrames) { return (int)(((int64_t)outputFrames * _step) >> 32); } } + +// the input frames that will produce exactly outputFrames +int AudioSRC::getExactInput(int outputFrames) { + // + // For upsampling, a correct implementation is more complicated + // because it requires early exit of the multirate filter. + // This is not currently supported. + // + if (_upFactor > _downFactor) { + return -1; + } + if (_step == 0) { + int64_t offset = ((int64_t)_phase * _downFactor) % _upFactor; + return (int)(((int64_t)outputFrames * _downFactor + offset) / _upFactor); + } else { + return (int)(((int64_t)outputFrames * _step + _offset) >> 32); + } +} diff --git a/libraries/audio/src/AudioSRC.h b/libraries/audio/src/AudioSRC.h index f7becc22c3..5ae5318b5e 100644 --- a/libraries/audio/src/AudioSRC.h +++ b/libraries/audio/src/AudioSRC.h @@ -48,6 +48,8 @@ public: int getMinInput(int outputFrames); int getMaxInput(int outputFrames); + int getExactInput(int outputFrames); + private: float* _polyphaseFilter; int* _stepTable;