Issue: Errors from juce_convolution.h file

Hi Guys, I’m working on a plugin and using the dsp::convolution class. I’m not sure what’s wrong with my implementation but I keep getting errors in Visual Studio from the juce_convolutionn.h file. The errors are as follows;

‘ProcessContext’: must be a class or namespace when followed by ‘::’
‘ProcessContext’: left of ‘::’ must be a class/struct/union - similar errors for ‘.getInputBlock’, ‘.getOutputBlock’, ‘.isBypassed’.
Convolution engine only supports single precision floating point data.

The code in my process block is as follows;

dsp::AudioBlock <float> block;

dsp::ProcessContextReplacing<float>::SampleType context;


convolution.loadImpulseResponse (impulseResponse01, 0, true, true, 0);
void process(dsp::ProcessContextReplacing<float>(block));

Any help on this will be greatly appreciated
Thanks

Which version of Visual Studio are you using?

VS enterprise 2017
version 15.6.1

Have you added the JUCE DSP module in Projucer into your project and enabled at least C++14 support?

Why do you have a void in the last line of your code?

because without it I get ‘Identifier “process” is undefined’

Yes i have the dsp module added, where do I find the option to enable c++ 14 support?

Can you show your actual code? The above code fragment doesn’t really make much sense.

I do have c++ 14 support enabled

PluginProcessor.cpp file is;

#include “PluginProcessor.h”
#include “PluginEditor.h”

//=================================================================
Vle02AudioProcessor::Vle02AudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
: AudioProcessor (BusesProperties()
#if ! JucePlugin_IsMidiEffect
#if ! JucePlugin_IsSynth
.withInput (“Input”, AudioChannelSet::stereo(), true)
#endif
.withOutput (“Output”, AudioChannelSet::stereo(), true)
#endif
)
#endif
{
}

Vle02AudioProcessor::~Vle02AudioProcessor()
{
}

//=================================================================
const String Vle02AudioProcessor::getName() const
{
return JucePlugin_Name;
}

bool Vle02AudioProcessor::acceptsMidi() const
{
#if JucePlugin_WantsMidiInput
return true;
#else
return false;
#endif
}

bool Vle02AudioProcessor::producesMidi() const
{
#if JucePlugin_ProducesMidiOutput
return true;
#else
return false;
#endif
}

bool Vle02AudioProcessor::isMidiEffect() const
{
#if JucePlugin_IsMidiEffect
return true;
#else
return false;
#endif
}

double Vle02AudioProcessor::getTailLengthSeconds() const
{
return 0.0;
}

int Vle02AudioProcessor::getNumPrograms()
{
return 1; // NB: some hosts don’t cope very well if you tell them there are 0 programs,
// so this should be at least 1, even if you’re not really implementing programs.
}

int Vle02AudioProcessor::getCurrentProgram()
{
return 0;
}

void Vle02AudioProcessor::setCurrentProgram (int index)
{
}

const String Vle02AudioProcessor::getProgramName (int index)
{
return {};
}

void Vle02AudioProcessor::changeProgramName (int index, const String& newName)
{
}

//=================================================================
void Vle02AudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
dsp::ProcessSpec spec;
spec.sampleRate = sampleRate;
spec.maximumBlockSize = samplesPerBlock;
spec.numChannels = getMainBusNumInputChannels();

convolution.reset();
convolution.prepare(spec);

}

void Vle02AudioProcessor::releaseResources()
{
// When playback stops, you can use this as an opportunity to free up any
// spare memory, etc.
}

#ifndef JucePlugin_PreferredChannelConfigurations
bool Vle02AudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
{
#if JucePlugin_IsMidiEffect
ignoreUnused (layouts);
return true;
#else
// This is the place where you check if the layout is supported.
// In this template code we only support mono or stereo.
if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
&& layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
return false;

// This checks if the input layout matches the output layout

#if ! JucePlugin_IsSynth
if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
return false;
#endif

return true;

#endif
}
#endif

void Vle02AudioProcessor::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages)
{
ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();

for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
    buffer.clear (i, 0, buffer.getNumSamples());

// This is the place where you'd normally do the guts of your plugin's
// audio processing...
// Make sure to reset the state if your inner loop is processing
// the samples and the outer loop is handling the channels.
// Alternatively, you can process the samples with the channels
// interleaved by keeping the same state.
dsp::AudioBlock <float> block;

dsp::ProcessContextReplacing<float>::SampleType context;


convolution.loadImpulseResponse (impulseResponse01, 0, true, true, 0);
process(dsp::ProcessContextReplacing<float>(block));

}

//=================================================================
bool Vle02AudioProcessor::hasEditor() const
{
return true; // (change this to false if you choose to not supply an editor)
}

AudioProcessorEditor* Vle02AudioProcessor::createEditor()
{
return new Vle02AudioProcessorEditor (*this);
}

//=================================================================
void Vle02AudioProcessor::getStateInformation (MemoryBlock& destData)
{
// You should use this method to store your parameters in the memory block.
// You could do that either as raw data, or use the XML or ValueTree classes
// as intermediaries to make it easy to save and load complex data.
}

void Vle02AudioProcessor::setStateInformation (const void* data, int sizeInBytes)
{
// You should use this method to restore your parameters from this memory block,
// whose contents will have been created by the getStateInformation() call.
}

//=================================================================
// This creates new instances of the plugin…
AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
return new Vle02AudioProcessor();
}

I can’t find ProcessContext in that code, I can only find ProcessContextReplacing, so it’s going to be very hard to help you…
I also can’t find the declaration or definition of the process function. Is it in another file?

did you mean to call

convolution.process(dsp::ProcessContextReplacing<float>(block));

instead of

process(dsp::ProcessContextReplacing<float>(block));

maybe?

And you shouldn’t load the impulse in processBlock, do it in prepareToPlay.

N.B. please put three backticks ``` on a single line before and after a block of code, that way it is displayed correctly…

yes, I was, thank you, but having just changed, I’ve got an error saying ‘‘juce::dsp::Convolution::process’: cannot access private member declared in class ‘juce::dsp::Convolution’’.

And thank you for the loadimpulse and backticks comment.