/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
This file is part of the JUCE library .
Copyright ( c ) 2015 - ROLI 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 ; }
/** Clears any buffers and filters that the resampler is using. */
void flushBuffers ( ) ;
//==============================================================================
void prepareToPlay ( int samplesPerBlockExpected , double sampleRate ) override ;
void releaseResources ( ) override ;
void getNextAudioBlock ( const AudioSourceChannelInfo & ) override ;
private :
//==============================================================================
OptionalScopedPointer < AudioSource > input ;
double ratio , lastRatio ;
AudioSampleBuffer buffer ;
int bufferPos , sampsInBuffer ;
double subSampleOffset ;
double coefficients [ 6 ] ;
SpinLock ratioLock ;
const int numChannels ;
HeapBlock < float * > destBuffers ;
HeapBlock < const float * > 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 < FilterState > filterStates ;
void resetFilters ( ) ;
void applyFilter ( float * samples , int num , FilterState & fs ) ;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR ( ResamplingAudioSource )
} ;
# endif // JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED