1
0
Fork 0
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:
reuk 2020-04-24 10:50:46 +01:00
parent 2c81da73f9
commit fca3429e6e
No known key found for this signature in database
GPG key ID: 9ADCD339CFC98A11
48 changed files with 3692 additions and 1830 deletions

View file

@ -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 };