diff options
Diffstat (limited to 'src/3rdparty/resonance-audio/resonance_audio/dsp/resampler.h')
-rw-r--r-- | src/3rdparty/resonance-audio/resonance_audio/dsp/resampler.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/3rdparty/resonance-audio/resonance_audio/dsp/resampler.h b/src/3rdparty/resonance-audio/resonance_audio/dsp/resampler.h new file mode 100644 index 000000000..c2c079a80 --- /dev/null +++ b/src/3rdparty/resonance-audio/resonance_audio/dsp/resampler.h @@ -0,0 +1,135 @@ +/* +Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef RESONANCE_AUDIO_DSP_RESAMPLER_H_ +#define RESONANCE_AUDIO_DSP_RESAMPLER_H_ + +#include "base/audio_buffer.h" + +namespace vraudio { + +// Class that provides rational resampling of audio data. +class Resampler { + public: + Resampler(); + + // Resamples an |AudioBuffer| of input data sampled at |source_frequency| to + // |destination_frequency|. + // + // @param input Input data to be resampled. + // @param output Resampled output data. + void Process(const AudioBuffer& input, AudioBuffer* output); + + // Returns the maximum length which the output buffer will be, given the + // current source and destination frequencies and input length. The actual + // output length will either be this or one less. + // + // @param input_length Length of the input. + // @return Maximum length of the output. + size_t GetMaxOutputLength(size_t input_length) const; + + // Returns the next length which the output buffer will be, given the + // current source and destination frequencies and input length. + // + // @param input_length Length of the input. + // @return Next length of the output. + size_t GetNextOutputLength(size_t input_length) const; + + // Sets the source and destination sampling rate as well as the number of + // channels. Note this method only resets the filter state number of channel + // changes. + // + // @param source_frequency Sampling rate of input data. + // @param destination_frequency Desired output sampling rate. + // @param num_channels Number of channels to process. + void SetRateAndNumChannels(int source_frequency, int destination_frequency, + size_t num_channels); + + // Returns whether the sampling rates provided are supported by the resampler. + // + // @param source Source sampling rate. + // @param destination Destination sampling rate. + // @return True if the sampling rate pair are supported. + static bool AreSampleRatesSupported(int source, int destination); + + // Resets the inner state of the |Resampler| allowing its use repeatedly on + // different data streams. + void ResetState(); + + private: + friend class PolyphaseFilterTest; + // Initializes the |state_| buffer. Called when sampling rate is changed or + // the state is reset. + // + // @param size_t old_state_num_frames Number of frames in the |state_| buffer + // previous to the most recent call to |GenerateInterpolatingFilter|. + void InitializeStateBuffer(size_t old_state_num_frames); + + // Generates a windowed sinc to act as the interpolating/anti-aliasing filter. + // + // @param sample_rate The system sampling rate. + void GenerateInterpolatingFilter(int sample_rate); + + // Arranges the anti aliasing filter coefficients in polyphase filter format. + // + // @param filter_length Number of frames in |filter| containing filter + // coefficients. + // @param filter Vector of filter coefficients. + void ArrangeFilterAsPolyphase(size_t filter_length, + const AudioBuffer::Channel& filter); + + // Generates Hann windowed sinc function anti aliasing filters. + // + // @param cutoff_frequency Transition band (-3dB) frequency of the filter. + // @param sample_rate The system sampling rate. + // @param filter_length Number of frames in |buffer| containing filter + // coefficients. + // @param buffer |AudioBuffer::Channel| to contain the filter coefficients. + void GenerateSincFilter(float cutoff_frequency, float sample_rate, + size_t filter_length, AudioBuffer::Channel* buffer); + + // Rate of the interpolator section of the rational sampling rate converter. + size_t up_rate_; + + // Rate of the decimator section of the rational sampling rate convereter. + size_t down_rate_; + + // Time variable for the polyphase filter. + size_t time_modulo_up_rate_; + + // Marks the last processed sample of the input. + size_t last_processed_sample_; + + // Number of channels in the |AudioBuffer|s processed. + size_t num_channels_; + + // Number of filter coefficients in each phase of the polyphase filter. + size_t coeffs_per_phase_; + + // Filter coefficients stored in polyphase form. + AudioBuffer transposed_filter_coeffs_; + + // Filter coefficients in planar form, used for calculating the transposed + // filter. + AudioBuffer temporary_filter_coeffs_; + + // Buffer holding the samples of input required between input buffers. + AudioBuffer state_; +}; + +} // namespace vraudio + +#endif // RESONANCE_AUDIO_DSP_RESAMPLER_H_ |