/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2013 - Raw Material Software Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ #ifndef JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED #define JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED //============================================================================== /** A type of AudioSource that takes an input source and changes its sample rate. @see AudioSource */ class JUCE_API ResamplingAudioSource : public AudioSource { public: //============================================================================== /** Creates a ResamplingAudioSource for a given input source. @param inputSource the input source to read from @param deleteInputWhenDeleted if true, the input source will be deleted when this object is deleted @param numChannels the number of channels to process */ ResamplingAudioSource (AudioSource* inputSource, bool deleteInputWhenDeleted, int numChannels = 2); /** Destructor. */ ~ResamplingAudioSource(); /** Changes the resampling ratio. (This value can be changed at any time, even while the source is running). @param samplesInPerOutputSample if set to 1.0, the input is passed through; higher values will speed it up; lower values will slow it down. The ratio must be greater than 0 */ void setResamplingRatio (double samplesInPerOutputSample); /** Returns the current resampling ratio. This is the value that was set by setResamplingRatio(). */ double getResamplingRatio() const noexcept { return ratio; } //============================================================================== void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; void releaseResources() override; void getNextAudioBlock (const AudioSourceChannelInfo&) override; private: //============================================================================== OptionalScopedPointer input; double ratio, lastRatio; AudioSampleBuffer buffer; int bufferPos, sampsInBuffer; double subSampleOffset; double coefficients[6]; SpinLock ratioLock; const int numChannels; HeapBlock destBuffers, srcBuffers; void setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6); void createLowPass (double proportionalRate); struct FilterState { double x1, x2, y1, y2; }; HeapBlock filterStates; void resetFilters(); void applyFilter (float* samples, int num, FilterState& fs); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingAudioSource) }; #endif // JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED