31template <
typename Element>
38 bool push (Element& element)
noexcept
40 if (
fifo.getFreeSpace() == 0)
43 const auto writer =
fifo.write (1);
45 if (writer.blockSize1 != 0)
46 storage[
static_cast<size_t> (writer.startIndex1)] = std::move (element);
47 else if (writer.blockSize2 != 0)
48 storage[
static_cast<size_t> (writer.startIndex2)] = std::move (element);
53 template <
typename Fn>
56 template <
typename Fn>
62 template <
typename Fn>
65 fifo.read (
n).forEach ([&] (
int index)
67 fn (
storage[
static_cast<size_t> (index)]);
79 :
Thread (
"Convolution background loader"),
queue (entries)
103 const auto tryPop = [&]
107 if (!
queue.hasPendingMessages())
137 pimpl->startThread();
142 pimpl->stopThread (-1);
166 auto updateSegmentsIfNecessary = [
this] (
size_t numSegmentsToUpdate,
167 std::vector<AudioBuffer<float>>& segments)
169 if (numSegmentsToUpdate == 0
170 || numSegmentsToUpdate != (
size_t) segments.size()
171 || (
size_t) segments[0].getNumSamples() !=
fftSize * 2)
175 for (
size_t i = 0;
i < numSegmentsToUpdate; ++
i)
176 segments.push_back ({ 1, static_cast<int> (fftSize * 2) });
184 size_t currentPtr = 0;
190 auto* impulseResponse = buf.getWritePointer (0);
193 impulseResponse[0] = 1.0f;
195 FloatVectorOperations::copy (impulseResponse,
196 samples + currentPtr,
199 FFTTempObject->performRealOnlyForwardTransform (impulseResponse);
225 size_t numSamplesProcessed = 0;
234 while (numSamplesProcessed < numSamples)
239 FloatVectorOperations::copy (inputData +
inputDataPos, input + numSamplesProcessed,
static_cast<int> (numSamplesToProcess));
242 FloatVectorOperations::copy (inputSegmentData, inputData,
static_cast<int> (
fftSize));
244 fftObject->performRealOnlyForwardTransform (inputSegmentData);
248 if (inputDataWasEmpty)
250 FloatVectorOperations::fill (outputTempData, 0,
static_cast<int> (
fftSize + 1));
267 FloatVectorOperations::copy (outputData, outputTempData,
static_cast<int> (
fftSize + 1));
274 fftObject->performRealOnlyInverseTransform (outputData);
277 FloatVectorOperations::add (&output[numSamplesProcessed], &outputData[
inputDataPos], &overlapData[
inputDataPos], (
int) numSamplesToProcess);
285 FloatVectorOperations::fill (inputData, 0.0f,
static_cast<int> (
fftSize));
298 numSamplesProcessed += numSamplesToProcess;
305 size_t numSamplesProcessed = 0;
314 while (numSamplesProcessed < numSamples)
318 FloatVectorOperations::copy (inputData +
inputDataPos, input + numSamplesProcessed,
static_cast<int> (numSamplesToProcess));
320 FloatVectorOperations::copy (output + numSamplesProcessed, outputData +
inputDataPos,
static_cast<int> (numSamplesToProcess));
322 numSamplesProcessed += numSamplesToProcess;
330 FloatVectorOperations::copy (inputSegmentData, inputData,
static_cast<int> (
fftSize));
332 fftObject->performRealOnlyForwardTransform (inputSegmentData);
336 FloatVectorOperations::fill (outputTempData, 0,
static_cast<int> (
fftSize + 1));
352 FloatVectorOperations::copy (outputData, outputTempData,
static_cast<int> (
fftSize + 1));
359 fftObject->performRealOnlyInverseTransform (outputData);
362 FloatVectorOperations::add (outputData, overlapData,
static_cast<int> (
blockSize));
365 FloatVectorOperations::fill (inputData, 0.0f,
static_cast<int> (
fftSize));
383 auto FFTSizeDiv2 =
fftSize / 2;
385 for (
size_t i = 0;
i < FFTSizeDiv2;
i++)
386 samples[
i] = samples[
i << 1];
388 samples[FFTSizeDiv2] = 0;
390 for (
size_t i = 1;
i < FFTSizeDiv2;
i++)
391 samples[
i + FFTSizeDiv2] = -samples[((
fftSize -
i) << 1) + 1];
397 auto FFTSizeDiv2 =
fftSize / 2;
399 FloatVectorOperations::addWithMultiply (output, input, impulse,
static_cast<int> (FFTSizeDiv2));
400 FloatVectorOperations::subtractWithMultiply (output, &(input[FFTSizeDiv2]), &(impulse[FFTSizeDiv2]),
static_cast<int> (FFTSizeDiv2));
402 FloatVectorOperations::addWithMultiply (&(output[FFTSizeDiv2]), input, &(impulse[FFTSizeDiv2]),
static_cast<int> (FFTSizeDiv2));
403 FloatVectorOperations::addWithMultiply (&(output[FFTSizeDiv2]), &(input[FFTSizeDiv2]), impulse,
static_cast<int> (FFTSizeDiv2));
413 auto FFTSizeDiv2 =
fftSize / 2;
415 for (
size_t i = 1;
i < FFTSizeDiv2;
i++)
417 samples[(
fftSize -
i) << 1] = samples[
i];
418 samples[((
fftSize -
i) << 1) + 1] = -samples[FFTSizeDiv2 +
i];
423 for (
size_t i = 1;
i < FFTSizeDiv2;
i++)
425 samples[
i << 1] = samples[(
fftSize -
i) << 1];
426 samples[(
i << 1) + 1] = -samples[((
fftSize -
i) << 1) + 1];
452 latency (isZeroDelayIn ? 0 : maxBufferSize),
453 irSize (buf.getNumSamples()),
457 constexpr auto numChannels = 2;
459 const auto makeEngine = [&] (
int channel,
int offset,
int length,
uint32 thisBlockSize)
463 static_cast<size_t> (thisBlockSize));
468 for (int i = 0; i < numChannels; ++i)
469 head.emplace_back (makeEngine (i, 0, buf.getNumSamples(), static_cast<uint32> (maxBufferSize)));
473 const auto size = jmin (buf.getNumSamples(), headSizeIn.headSizeInSamples);
475 for (int i = 0; i < numChannels; ++i)
476 head.emplace_back (makeEngine (i, 0, size, static_cast<uint32> (maxBufferSize)));
478 const auto tailBufferSize = static_cast<uint32> (headSizeIn.headSizeInSamples + (isZeroDelay ? 0 : maxBufferSize));
480 if (size != buf.getNumSamples())
481 for (int i = 0; i < numChannels; ++i)
482 tail.emplace_back (makeEngine (i, size, buf.getNumSamples() - size, tailBufferSize));
488 for (
const auto&
e :
head)
491 for (
const auto&
e :
tail)
501 const auto tailBlock = fullTailBlock.
getSubBlock (0, (
size_t) numSamples);
503 const auto isUniform =
tail.empty();
505 for (
size_t channel = 0; channel < numChannels; ++channel)
509 tailBlock.getChannelPointer (0),
527 for (
auto i = numChannels;
i < numOutputChannels; ++
i)
536 std::vector<std::unique_ptr<ConvolutionEngine>>
head,
tail;
552 for (
auto channel = 0; channel != numChannels; ++channel)
555 if (
result.getNumSamples() == 0 ||
result.getNumChannels() == 0)
558 result.setSample (0, 0, 1.0f);
571 std::ptrdiff_t offsetBegin = numSamples;
572 std::ptrdiff_t offsetEnd = numSamples;
574 for (
auto channel = 0; channel < numChannels; ++channel)
576 const auto indexAboveThreshold = [&] (
auto begin,
auto end)
580 return std::abs (
sample) >= thresholdTrim;
585 const auto channelEnd = channelBegin + numSamples;
586 const auto itStart = indexAboveThreshold (channelBegin, channelEnd);
587 const auto itEnd = indexAboveThreshold (std::make_reverse_iterator (channelEnd),
588 std::make_reverse_iterator (channelBegin));
590 offsetBegin =
jmin (offsetBegin, itStart);
591 offsetEnd =
jmin (offsetEnd, itEnd);
594 if (offsetBegin == numSamples)
601 const auto newLength =
jmax (1, numSamples -
static_cast<int> (offsetBegin + offsetEnd));
605 for (
auto channel = 0; channel < numChannels; ++channel)
618 if (sumSquaredMagnitude < 1e-8f)
621 return 0.125f / std::sqrt (sumSquaredMagnitude);
630 const auto maxSumSquaredMag = std::accumulate (channelPtrs, channelPtrs + numChannels, 0.0f, [numSamples] (
auto max,
auto* channel)
632 return jmax (
max, std::accumulate (channel, channel + numSamples, 0.0f, [] (
auto sum,
auto samp)
634 return sum + (samp * samp);
640 std::for_each (channelPtrs, channelPtrs + numChannels, [normalisationFactor, numSamples] (
auto* channel)
642 FloatVectorOperations::multiply (channel, normalisationFactor, numSamples);
647 const double srcSampleRate,
648 const double destSampleRate)
650 if (srcSampleRate == destSampleRate)
653 const auto factorReading = srcSampleRate / destSampleRate;
670template <
typename Element>
674 void set (std::unique_ptr<Element>
p)
680 std::unique_ptr<MultichannelEngine>
get()
683 return lock.
isLocked() ? std::move (
ptr) :
nullptr;
687 std::unique_ptr<Element>
ptr;
706 std::unique_ptr<AudioFormatReader> formatReader (manager.
createReaderFor (std::move (stream)));
708 if (formatReader ==
nullptr)
711 const auto fileLength =
static_cast<size_t> (formatReader->lengthInSamples);
712 const auto lengthToLoad = maxLength == 0 ? fileLength :
jmin (maxLength, fileLength);
715 static_cast<int> (lengthToLoad) },
716 formatReader->sampleRate };
718 formatReader->read (
result.buffer.getArrayOfWritePointers(),
719 result.buffer.getNumChannels(),
721 result.buffer.getNumSamples());
735 :
latency { (requiredLatency.latencyInSamples <= 0) ? 0 :
jmax (64,
nextPowerOfTwo (requiredLatency.latencyInSamples)) },
744 const std::lock_guard<std::mutex> lock (
mutex);
757 const std::lock_guard<std::mutex> lock (
mutex);
791 return std::make_unique<MultichannelEngine> (resampled,
801 result.setSample (0, 0, 1.0f);
819 const void* sourceData,
820 size_t sourceDataSize,
827 stereo, trim, normalise);
831 const File& fileImpulseResponse,
838 stereo, trim, normalise);
864 f.setImpulseResponse ({ std::move (
b), sr }, stereo, trim, normalise);
869 size_t sourceDataSize,
913 template <
typename Fn>
920 if (
auto t = weak.lock())
927 std::weak_ptr<ConvolutionEngineQueue>
weakFromThis() {
return shared_from_this(); }
939 smoother.setCurrentAndTargetValue (1.0f);
950 template <
typename ProcessCurrent,
typename ProcessPrevious,
typename NotifyDone>
953 ProcessCurrent&& current,
954 ProcessPrevious&& previous,
955 NotifyDone&& notifyDone)
959 const auto numSamples =
static_cast<int> (input.
getNumSamples());
966 previous (input, mixBlock);
968 for (
size_t channel = 0; channel != output.
getNumChannels(); ++channel)
975 FloatVectorOperations::multiply (
smootherBuffer.getWritePointer (0), -1.0f, numSamples);
976 FloatVectorOperations::add (
smootherBuffer.getWritePointer (0), 1.0f, numSamples);
978 current (input, output);
980 for (
size_t channel = 0; channel != output.
getNumChannels(); ++channel)
995 current (input, output);
1001 smoother.setCurrentAndTargetValue (1.0f);
1038 mixer.prepare (spec);
1055 mixer.processSamples (input,
1076 double originalSampleRate,
1081 engineQueue->loadImpulseResponse (std::move (buffer), originalSampleRate, stereo, trim, normalise);
1085 size_t sourceDataSize,
1091 engineQueue->loadImpulseResponse (sourceData, sourceDataSize, stereo, trim,
size, normalise);
1100 engineQueue->loadImpulseResponse (fileImpulseResponse, stereo, trim,
size, normalise);
1116 mixer.beginTransition();
1148template <
typename ProcessWet>
1152 ProcessWet&& processWet)
noexcept
1154 const auto numChannels =
jmin (input.getNumChannels(),
volumeDry.size());
1155 const auto numSamples =
jmin (input.getNumSamples(), output.getNumSamples());
1157 auto dry =
dryBlock.getSubsetChannelBlock (0, numChannels);
1161 dry.copyFrom (input);
1163 for (
size_t channel = 0; channel < numChannels; ++channel)
1164 volumeDry[channel].applyGain (dry.getChannelPointer (channel), (
int) numSamples);
1166 processWet (input, output);
1168 for (
size_t channel = 0; channel < numChannels; ++channel)
1169 volumeWet[channel].applyGain (output.getChannelPointer (channel), (
int) numSamples);
1176 processWet (input, output);
1182 for (
size_t channel = 0; channel < numChannels; ++channel)
1210 OptionalQueue { std::make_unique<ConvolutionMessageQueue>() })
1216 OptionalQueue { std::make_unique<ConvolutionMessageQueue>() })
1227Convolution::Convolution (
const Latency& latency,
1228 const NonUniform& nonUniform,
1229 OptionalQueue&& queue)
1230 : pimpl (
std::make_unique<Impl> (latency, nonUniform,
std::move (queue)))
1233Convolution::~Convolution()
noexcept = default;
1236 size_t sourceDataSize,
1242 pimpl->loadImpulseResponse (sourceData, sourceDataSize, stereo, trim,
size, normalise);
1251 pimpl->loadImpulseResponse (fileImpulseResponse, stereo, trim,
size, normalise);
1255 double originalSampleRate,
1260 pimpl->loadImpulseResponse (std::move (buffer), originalSampleRate, stereo, trim, normalise);
1265 mixer.prepare (spec);
1266 pimpl->prepare (spec);
1283 jassert (input.getNumChannels() == output.getNumChannels());
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_AbstractFifo.h:73
Definition juce_AudioSampleBuffer.h:34
int getNumChannels() const noexcept
Definition juce_AudioSampleBuffer.h:236
int getNumSamples() const noexcept
Definition juce_AudioSampleBuffer.h:242
const Type * getReadPointer(int channelNumber) const noexcept
Definition juce_AudioSampleBuffer.h:253
Type ** getArrayOfWritePointers() noexcept
Definition juce_AudioSampleBuffer.h:342
Definition juce_CriticalSection.h:43
static Type decibelsToGain(Type decibels, Type minusInfinityDb=Type(defaultMinusInfinitydB))
Definition juce_Decibels.h:42
Definition juce_File.h:45
bool isLocked() const noexcept
Definition juce_ScopedLock.h:231
Definition juce_MemoryAudioSource.h:33
Definition juce_OptionalScopedPointer.h:38
Definition juce_ResamplingAudioSource.h:35
void getNextAudioBlock(const AudioSourceChannelInfo &) override
Definition juce_ResamplingAudioSource.cpp:80
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
Definition juce_ResamplingAudioSource.cpp:46
void setResamplingRatio(double samplesInPerOutputSample)
Definition juce_ResamplingAudioSource.cpp:38
Definition juce_SpinLock.h:42
GenericScopedTryLock< SpinLock > ScopedTryLockType
Definition juce_SpinLock.h:79
GenericScopedLock< SpinLock > ScopedLockType
Definition juce_SpinLock.h:73
void startThread()
Definition juce_Thread.cpp:122
Thread(const String &threadName, size_t threadStackSize=0)
Definition juce_Thread.cpp:26
bool threadShouldExit() const
Definition juce_Thread.cpp:177
bool stopThread(int timeOutMilliseconds)
Definition juce_Thread.cpp:208
static void JUCE_CALLTYPE sleep(int milliseconds)
Definition juce_posix_SharedCode.h:44
Definition juce_AudioBlock.h:70
AudioBlock getSubBlock(size_t newOffset, size_t newLength) const noexcept
Definition juce_AudioBlock.h:371
constexpr size_t getNumChannels() const noexcept
Definition juce_AudioBlock.h:235
SampleType * getChannelPointer(size_t channel) const noexcept
Definition juce_AudioBlock.h:241
AudioBlock & copyFrom(const AudioBlock< OtherSampleType > &src) noexcept
Definition juce_AudioBlock.h:314
AudioBlock getSingleChannelBlock(size_t channel) const noexcept
Definition juce_AudioBlock.h:249
constexpr size_t getNumSamples() const noexcept
Definition juce_AudioBlock.h:238
AudioBlock & clear() noexcept
Definition juce_AudioBlock.h:305
Definition juce_Convolution.cpp:76
Queue< IncomingCommand > queue
Definition juce_Convolution.cpp:120
FixedSizeFunction< 400, void()> IncomingCommand
Definition juce_Convolution.cpp:82
BackgroundMessageQueue(int entries)
Definition juce_Convolution.cpp:78
CriticalSection popMutex
Definition juce_Convolution.cpp:119
void run() override
Definition juce_Convolution.cpp:99
void popAll()
Definition juce_Convolution.cpp:89
bool push(IncomingCommand &command)
Definition juce_Convolution.cpp:87
Definition juce_Convolution.cpp:1014
void prepare(const ProcessSpec &spec)
Definition juce_Convolution.cpp:1035
Impl(Latency requiredLatency, NonUniform requiredHeadSize, OptionalQueue &&queue)
Definition juce_Convolution.cpp:1016
std::unique_ptr< MultichannelEngine > previousEngine
Definition juce_Convolution.cpp:1127
void reset()
Definition juce_Convolution.cpp:1025
void destroyPreviousEngine()
Definition juce_Convolution.cpp:1104
std::unique_ptr< MultichannelEngine > currentEngine
Definition juce_Convolution.cpp:1127
OptionalQueue messageQueue
Definition juce_Convolution.cpp:1125
std::shared_ptr< ConvolutionEngineQueue > engineQueue
Definition juce_Convolution.cpp:1126
void processSamples(const AudioBlock< const float > &input, AudioBlock< float > &output)
Definition juce_Convolution.cpp:1048
void loadImpulseResponse(AudioBuffer< float > &&buffer, double originalSampleRate, Stereo stereo, Trim trim, Normalise normalise)
Definition juce_Convolution.cpp:1075
int getLatency() const
Definition juce_Convolution.cpp:1073
int getCurrentIRSize() const
Definition juce_Convolution.cpp:1071
void installPendingEngine()
Definition juce_Convolution.cpp:1119
void installNewEngine(std::unique_ptr< MultichannelEngine > newEngine)
Definition juce_Convolution.cpp:1111
void loadImpulseResponse(const void *sourceData, size_t sourceDataSize, Stereo stereo, Trim trim, size_t size, Normalise normalise)
Definition juce_Convolution.cpp:1084
void loadImpulseResponse(const File &fileImpulseResponse, Stereo stereo, Trim trim, size_t size, Normalise normalise)
Definition juce_Convolution.cpp:1094
CrossoverMixer mixer
Definition juce_Convolution.cpp:1128
std::array< SmoothedValue< float >, 2 > volumeDry
Definition juce_Convolution.h:290
double sampleRate
Definition juce_Convolution.h:293
void reset()
Definition juce_Convolution.cpp:1196
HeapBlock< char > dryBlockStorage
Definition juce_Convolution.h:292
void processSamples(const AudioBlock< const float > &, AudioBlock< float > &, bool isBypassed, ProcessWet &&) noexcept
Definition juce_Convolution.cpp:1149
void prepare(const ProcessSpec &)
Definition juce_Convolution.cpp:1132
AudioBlock< float > dryBlock
Definition juce_Convolution.h:291
bool currentIsBypassed
Definition juce_Convolution.h:294
std::array< SmoothedValue< float >, 2 > volumeWet
Definition juce_Convolution.h:290
Definition juce_Convolution.cpp:731
std::unique_ptr< MultichannelEngine > makeEngine()
Definition juce_Convolution.cpp:778
ProcessSpec processSpec
Definition juce_Convolution.cpp:805
AudioBuffer< float > impulseResponse
Definition juce_Convolution.cpp:806
static AudioBuffer< float > makeImpulseBuffer()
Definition juce_Convolution.cpp:798
const Convolution::Latency latency
Definition juce_Convolution.cpp:809
std::mutex mutex
Definition juce_Convolution.cpp:815
void setProcessSpec(const ProcessSpec &spec)
Definition juce_Convolution.cpp:742
const Convolution::NonUniform headSize
Definition juce_Convolution.cpp:810
void setImpulseResponse(BufferWithSampleRate &&buf, Convolution::Stereo stereo, Convolution::Trim trim, Convolution::Normalise normalise)
Definition juce_Convolution.cpp:752
std::unique_ptr< MultichannelEngine > getEngine()
Definition juce_Convolution.cpp:775
const bool shouldBeZeroLatency
Definition juce_Convolution.cpp:811
Convolution::Normalise wantsNormalise
Definition juce_Convolution.cpp:808
ConvolutionEngineFactory(Convolution::Latency requiredLatency, Convolution::NonUniform requiredHeadSize)
Definition juce_Convolution.cpp:733
double originalSampleRate
Definition juce_Convolution.cpp:807
TryLockedPtr< MultichannelEngine > engine
Definition juce_Convolution.cpp:813
Definition juce_Convolution.cpp:849
void loadImpulseResponse(const File &fileImpulseResponse, Convolution::Stereo stereo, Convolution::Trim trim, size_t size, Convolution::Normalise normalise)
Definition juce_Convolution.cpp:881
std::weak_ptr< ConvolutionEngineQueue > weakFromThis()
Definition juce_Convolution.cpp:927
void postPendingCommand()
Definition juce_Convolution.cpp:901
void loadImpulseResponse(AudioBuffer< float > &&buffer, double sr, Convolution::Stereo stereo, Convolution::Trim trim, Convolution::Normalise normalise)
Definition juce_Convolution.cpp:856
ConvolutionEngineFactory factory
Definition juce_Convolution.cpp:930
void loadImpulseResponse(const void *sourceData, size_t sourceDataSize, Convolution::Stereo stereo, Convolution::Trim trim, size_t size, Convolution::Normalise normalise)
Definition juce_Convolution.cpp:868
void prepare(const ProcessSpec &spec)
Definition juce_Convolution.cpp:893
BackgroundMessageQueue & messageQueue
Definition juce_Convolution.cpp:929
BackgroundMessageQueue::IncomingCommand pendingCommand
Definition juce_Convolution.cpp:931
std::unique_ptr< MultichannelEngine > getEngine()
Definition juce_Convolution.cpp:910
void callLater(Fn &&fn)
Definition juce_Convolution.cpp:914
ConvolutionEngineQueue(BackgroundMessageQueue &queue, Convolution::Latency latencyIn, Convolution::NonUniform headSizeIn)
Definition juce_Convolution.cpp:851
Trim
Definition juce_Convolution.h:195
@ yes
Definition juce_Convolution.h:195
int getCurrentIRSize() const
Definition juce_Convolution.cpp:1292
Convolution()
Definition juce_Convolution.cpp:1199
int getLatency() const
Definition juce_Convolution.cpp:1294
void prepare(const ProcessSpec &)
Definition juce_Convolution.cpp:1263
std::unique_ptr< Impl > pimpl
Definition juce_Convolution.h:299
bool isActive
Definition juce_Convolution.h:303
void loadImpulseResponse(const void *sourceData, size_t sourceDataSize, Stereo isStereo, Trim requiresTrimming, size_t size, Normalise requiresNormalisation=Normalise::yes)
Definition juce_Convolution.cpp:1235
Mixer mixer
Definition juce_Convolution.h:302
Stereo
Definition juce_Convolution.h:194
@ yes
Definition juce_Convolution.h:194
void reset() noexcept
Definition juce_Convolution.cpp:1270
void processSamples(const AudioBlock< const float > &, AudioBlock< float > &, bool isBypassed) noexcept
Definition juce_Convolution.cpp:1276
Normalise
Definition juce_Convolution.h:196
@ no
Definition juce_Convolution.h:196
@ yes
Definition juce_Convolution.h:196
Definition juce_Convolution.h:40
~ConvolutionMessageQueue() noexcept
Definition juce_Convolution.cpp:140
std::unique_ptr< Impl > pimpl
Definition juce_Convolution.h:67
ConvolutionMessageQueue()
Definition juce_Convolution.cpp:130
Definition juce_Convolution.cpp:935
void processSamples(const AudioBlock< const float > &input, AudioBlock< float > &output, ProcessCurrent &¤t, ProcessPrevious &&previous, NotifyDone &¬ifyDone)
Definition juce_Convolution.cpp:951
AudioBuffer< float > smootherBuffer
Definition juce_Convolution.cpp:1007
LinearSmoothedValue< float > smoother
Definition juce_Convolution.cpp:1006
AudioBuffer< float > mixBuffer
Definition juce_Convolution.cpp:1008
void reset()
Definition juce_Convolution.cpp:937
void beginTransition()
Definition juce_Convolution.cpp:999
void prepare(const ProcessSpec &spec)
Definition juce_Convolution.cpp:942
Definition juce_FixedSizeFunction.h:87
const int blockSize
Definition juce_Convolution.cpp:541
std::vector< std::unique_ptr< ConvolutionEngine > > head
Definition juce_Convolution.cpp:536
AudioBuffer< float > tailBuffer
Definition juce_Convolution.cpp:537
void reset()
Definition juce_Convolution.cpp:486
const int irSize
Definition juce_Convolution.cpp:540
int getLatency() const noexcept
Definition juce_Convolution.cpp:532
const int latency
Definition juce_Convolution.cpp:539
int getBlockSize() const noexcept
Definition juce_Convolution.cpp:533
std::vector< std::unique_ptr< ConvolutionEngine > > tail
Definition juce_Convolution.cpp:536
void processSamples(const AudioBlock< const float > &input, AudioBlock< float > &output)
Definition juce_Convolution.cpp:495
const bool isZeroDelay
Definition juce_Convolution.cpp:542
MultichannelEngine(const AudioBuffer< float > &buf, int maxBlockSize, int maxBufferSize, Convolution::NonUniform headSizeIn, bool isZeroDelayIn)
Definition juce_Convolution.cpp:446
int getIRSize() const noexcept
Definition juce_Convolution.cpp:531
Definition juce_Convolution.cpp:33
void popAll(Fn &&fn)
Definition juce_Convolution.cpp:57
AbstractFifo fifo
Definition juce_Convolution.cpp:71
bool push(Element &element) noexcept
Definition juce_Convolution.cpp:38
void pop(Fn &&fn)
Definition juce_Convolution.cpp:54
bool hasPendingMessages() const noexcept
Definition juce_Convolution.cpp:59
void popN(int n, Fn &&fn)
Definition juce_Convolution.cpp:63
std::vector< Element > storage
Definition juce_Convolution.cpp:72
Queue(int size)
Definition juce_Convolution.cpp:35
Definition juce_Convolution.cpp:672
SpinLock mutex
Definition juce_Convolution.cpp:688
std::unique_ptr< MultichannelEngine > get()
Definition juce_Convolution.cpp:680
std::unique_ptr< Element > ptr
Definition juce_Convolution.cpp:687
void set(std::unique_ptr< Element > p)
Definition juce_Convolution.cpp:674
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
Definition juce_AudioBlock.h:29
static AudioBuffer< float > fixNumChannels(const AudioBuffer< float > &buf, Convolution::Stereo stereo)
Definition juce_Convolution.cpp:545
OptionalScopedPointer< ConvolutionMessageQueue > OptionalQueue
Definition juce_Convolution.cpp:1011
static void setImpulseResponse(ConvolutionEngineFactory &factory, const void *sourceData, size_t sourceDataSize, Convolution::Stereo stereo, Convolution::Trim trim, size_t size, Convolution::Normalise normalise)
Definition juce_Convolution.cpp:818
static AudioBuffer< float > trimImpulseResponse(const AudioBuffer< float > &buf)
Definition juce_Convolution.cpp:564
static float calculateNormalisationFactor(float sumSquaredMagnitude)
Definition juce_Convolution.cpp:616
static void normaliseImpulseResponse(AudioBuffer< float > &buf)
Definition juce_Convolution.cpp:624
bool isBypassed(const ProcessorChain< Processors... > &chain) noexcept
Definition juce_ProcessorChain.h:160
static BufferWithSampleRate loadStreamToBuffer(std::unique_ptr< InputStream > stream, size_t maxLength)
Definition juce_Convolution.cpp:702
static AudioBuffer< float > resampleImpulseResponse(const AudioBuffer< float > &buf, const double srcSampleRate, const double destSampleRate)
Definition juce_Convolution.cpp:646
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
unsigned int uint32
Definition juce_MathsFunctions.h:45
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
int nextPowerOfTwo(int n) noexcept
Definition juce_MathsFunctions.h:533
SmoothedValue< FloatType, ValueSmoothingTypes::Linear > LinearSmoothedValue
Definition juce_SmoothedValue.h:406
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
RangedDirectoryIterator begin(const RangedDirectoryIterator &it)
Definition juce_RangedDirectoryIterator.h:179
Definition juce_Uuid.h:141
#define max(x, y)
Definition os.h:78
png_uint_32 length
Definition png.c:2247
Definition juce_Convolution.cpp:692
double sampleRate
Definition juce_Convolution.cpp:699
BufferWithSampleRate()=default
AudioBuffer< float > buffer
Definition juce_Convolution.cpp:698
BufferWithSampleRate(AudioBuffer< float > &&bufferIn, double sampleRateIn)
Definition juce_Convolution.cpp:695
Definition juce_Convolution.h:119
void updateSymmetricFrequencyDomainData(float *samples) noexcept
Definition juce_Convolution.cpp:411
std::vector< AudioBuffer< float > > buffersInputSegments
Definition juce_Convolution.cpp:439
AudioBuffer< float > bufferOutput
Definition juce_Convolution.cpp:438
ConvolutionEngine(const float *samples, size_t numSamples, size_t maxBlockSize)
Definition juce_Convolution.cpp:151
void prepareForConvolution(float *samples) noexcept
Definition juce_Convolution.cpp:381
const size_t numSegments
Definition juce_Convolution.cpp:434
AudioBuffer< float > bufferInput
Definition juce_Convolution.cpp:438
std::vector< AudioBuffer< float > > buffersImpulseSegments
Definition juce_Convolution.cpp:439
size_t inputDataPos
Definition juce_Convolution.cpp:436
size_t currentSegment
Definition juce_Convolution.cpp:436
void convolutionProcessingAndAccumulate(const float *input, const float *impulse, float *output)
Definition juce_Convolution.cpp:395
void reset()
Definition juce_Convolution.cpp:208
void processSamplesWithAddedLatency(const float *input, float *output, size_t numSamples)
Definition juce_Convolution.cpp:302
void processSamples(const float *input, float *output, size_t numSamples)
Definition juce_Convolution.cpp:222
AudioBuffer< float > bufferTempOutput
Definition juce_Convolution.cpp:438
const size_t blockSize
Definition juce_Convolution.cpp:431
AudioBuffer< float > bufferOverlap
Definition juce_Convolution.cpp:438
const size_t numInputSegments
Definition juce_Convolution.cpp:435
const std::unique_ptr< FFT > fftObject
Definition juce_Convolution.cpp:433
const size_t fftSize
Definition juce_Convolution.cpp:432
Definition juce_Convolution.cpp:126
BackgroundMessageQueue(int entries)
Definition juce_Convolution.cpp:78
Definition juce_ProcessContext.h:38
uint32 numChannels
Definition juce_ProcessContext.h:46
double sampleRate
Definition juce_ProcessContext.h:40
uint32 maximumBlockSize
Definition juce_ProcessContext.h:43
const char const char const char const char char * fn
Definition swell-functions.h:168
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137