30 numChannels (channels)
32 jassert (input !=
nullptr);
33 zeromem (coefficients,
sizeof (coefficients));
55 filterStates.
calloc (numChannels);
56 srcBuffers.
calloc (numChannels);
57 destBuffers.
calloc (numChannels);
58 createLowPass (ratio);
70 subSampleOffset = 0.0;
76 input->releaseResources();
77 buffer.
setSize (numChannels, 0);
103 bufferPos %= bufferSize;
108 bufferPos %= bufferSize;
121 input->getNextAudioBlock (
readInfo);
137 destBuffers[channel] =
info.buffer->getWritePointer (channel,
info.startSample);
141 int nextPos = (bufferPos + 1) % bufferSize;
143 for (
int m =
info.numSamples; --m >= 0;)
147 const float alpha = (
float) subSampleOffset;
150 *destBuffers[channel]++ = srcBuffers[channel][bufferPos]
151 + alpha * (srcBuffers[channel][
nextPos] - srcBuffers[channel][bufferPos]);
155 while (subSampleOffset >= 1.0)
157 if (++bufferPos >= bufferSize)
162 nextPos = (bufferPos + 1) % bufferSize;
163 subSampleOffset -= 1.0;
171 applyFilter (
info.buffer->getWritePointer (i,
info.startSample),
info.numSamples, filterStates[i]);
179 FilterState&
fs = filterStates[i];
181 if (
info.numSamples > 1)
195 jassert (sampsInBuffer >= 0);
198void ResamplingAudioSource::createLowPass (
const double frequencyRatio)
207 setFilterCoefficients (
c1,
215void ResamplingAudioSource::setFilterCoefficients (
double c1,
double c2,
double c3,
double c4,
double c5,
double c6)
217 const double a = 1.0 / c4;
225 coefficients[0] = c1;
226 coefficients[1] = c2;
227 coefficients[2] = c3;
228 coefficients[3] = c4;
229 coefficients[4] = c5;
230 coefficients[5] = c6;
233void ResamplingAudioSource::resetFilters()
235 if (filterStates !=
nullptr)
236 filterStates.
clear ((
size_t) numChannels);
239void ResamplingAudioSource::applyFilter (
float* samples,
int num, FilterState& fs)
243 const double in = *samples;
245 double out = coefficients[0] * in
246 + coefficients[1] * fs.x1
247 + coefficients[2] * fs.x2
248 - coefficients[4] * fs.y1
249 - coefficients[5] * fs.y2;
252 if (! (out < -1.0e-8 || out > 1.0e-8))
261 *samples++ = (float) out;
void setSize(int newNumChannels, int newNumSamples, bool keepExistingContent=false, bool clearExtraSpace=false, bool avoidReallocating=false)
Type * getWritePointer(int channelNumber) noexcept
int getNumChannels() const noexcept
int getNumSamples() const noexcept
const Type * getReadPointer(int channelNumber) const noexcept
void clear(SizeType numElements) noexcept
void calloc(SizeType newNumElements, const size_t elementSize=sizeof(ElementType))
void releaseResources() override
void getNextAudioBlock(const AudioSourceChannelInfo &) override
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
~ResamplingAudioSource() override
void setResamplingRatio(double samplesInPerOutputSample)
ResamplingAudioSource(AudioSource *inputSource, bool deleteInputWhenDeleted, int numChannels=2)