mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
DSP: Update convolution
This commit is contained in:
parent
2c81da73f9
commit
fca3429e6e
48 changed files with 3692 additions and 1830 deletions
|
|
@ -66,6 +66,15 @@ struct ConvolutionDemoDSP
|
|||
void process (ProcessContextReplacing<float> context)
|
||||
{
|
||||
context.isBypassed = bypass;
|
||||
|
||||
// Load a new IR if there's one available. Note that this doesn't lock or allocate!
|
||||
if (auto buffer = bufferTransfer.get())
|
||||
convolution.loadImpulseResponse (std::move (buffer->buffer),
|
||||
buffer->sampleRate,
|
||||
Convolution::Stereo::yes,
|
||||
Convolution::Trim::yes,
|
||||
Convolution::Normalise::yes);
|
||||
|
||||
convolution.process (context);
|
||||
}
|
||||
|
||||
|
|
@ -76,39 +85,90 @@ struct ConvolutionDemoDSP
|
|||
|
||||
void updateParameters()
|
||||
{
|
||||
if (auto* cabinetTypeParameter = dynamic_cast<ChoiceParameter*> (parameters[0]))
|
||||
auto* cabinetTypeParameter = dynamic_cast<ChoiceParameter*> (parameters[0]);
|
||||
|
||||
if (cabinetTypeParameter == nullptr)
|
||||
{
|
||||
if (cabinetTypeParameter->getCurrentSelectedID() == 1)
|
||||
jassertfalse;
|
||||
return;
|
||||
}
|
||||
|
||||
if (cabinetTypeParameter->getCurrentSelectedID() == 1)
|
||||
{
|
||||
bypass = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bypass = false;
|
||||
|
||||
auto selectedType = cabinetTypeParameter->getCurrentSelectedID();
|
||||
auto assetName = (selectedType == 2 ? "guitar_amp.wav" : "cassette_recorder.wav");
|
||||
|
||||
auto assetInputStream = createAssetInputStream (assetName);
|
||||
|
||||
if (assetInputStream == nullptr)
|
||||
{
|
||||
bypass = true;
|
||||
jassertfalse;
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
AudioFormatManager manager;
|
||||
manager.registerBasicFormats();
|
||||
std::unique_ptr<AudioFormatReader> reader { manager.createReaderFor (std::move (assetInputStream)) };
|
||||
|
||||
if (reader == nullptr)
|
||||
{
|
||||
bypass = false;
|
||||
|
||||
auto maxSize = static_cast<size_t> (roundToInt (sampleRate * (8192.0 / 44100.0)));
|
||||
auto selectedType = cabinetTypeParameter->getCurrentSelectedID();
|
||||
auto assetName = (selectedType == 2 ? "guitar_amp.wav" : "cassette_recorder.wav");
|
||||
|
||||
if (auto assetInputStream = createAssetInputStream (assetName))
|
||||
{
|
||||
currentCabinetData.reset();
|
||||
assetInputStream->readIntoMemoryBlock (currentCabinetData);
|
||||
|
||||
convolution.loadImpulseResponse (currentCabinetData.getData(), currentCabinetData.getSize(),
|
||||
false, true, maxSize);
|
||||
}
|
||||
jassertfalse;
|
||||
return;
|
||||
}
|
||||
|
||||
AudioBuffer<float> buffer (static_cast<int> (reader->numChannels),
|
||||
static_cast<int> (reader->lengthInSamples));
|
||||
reader->read (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), 0, buffer.getNumSamples());
|
||||
|
||||
bufferTransfer.set (std::make_unique<BufferWithSampleRate> (std::move (buffer),
|
||||
reader->sampleRate));
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct BufferWithSampleRate
|
||||
{
|
||||
BufferWithSampleRate (AudioBuffer<float>&& bufferIn, double sampleRateIn)
|
||||
: buffer (std::move (bufferIn)), sampleRate (sampleRateIn) {}
|
||||
|
||||
AudioBuffer<float> buffer;
|
||||
double sampleRate = 0.0;
|
||||
};
|
||||
|
||||
class BufferTransfer
|
||||
{
|
||||
public:
|
||||
void set (std::unique_ptr<BufferWithSampleRate> p)
|
||||
{
|
||||
const SpinLock::ScopedLockType lock (mutex);
|
||||
ptr = std::move (p);
|
||||
}
|
||||
|
||||
std::unique_ptr<BufferWithSampleRate> get()
|
||||
{
|
||||
const SpinLock::ScopedTryLockType lock (mutex);
|
||||
return lock.isLocked() ? std::move (ptr) : nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<BufferWithSampleRate> ptr;
|
||||
SpinLock mutex;
|
||||
};
|
||||
|
||||
double sampleRate = 0.0;
|
||||
bool bypass = false;
|
||||
|
||||
MemoryBlock currentCabinetData;
|
||||
Convolution convolution;
|
||||
|
||||
BufferTransfer bufferTransfer;
|
||||
|
||||
ChoiceParameter cabinetParam { { "Bypass", "Guitar amplifier 8''", "Cassette recorder" }, 1, "Cabinet Type" };
|
||||
|
||||
std::vector<DSPDemoParameterBase*> parameters { &cabinetParam };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue