Hello,
I keep getting random asserts both on release and debug of running my project in VS 2019 or in a host.
It seems to be related to parameters (ValueTree) and listeners of knobs / sliders.
Error happens in juce_ArrayBase:
inline const ElementType& operator[] (const int index) const noexcept
{
jassert (elements != nullptr);
// Breakpoint hits below
jassert (isPositiveAndBelow (index, numUsed));
return elements[index];
}
Here’s the call stack:
Here’s how I’m making parameters / GUI code:
-
In AudioProcessor’s constructor:
, m_treestate(*this, nullptr, “PARAMETERS”, CreateParameters())
and inside the AudioProcessor::CreateParameters() :
juce::AudioProcessorValueTreeState::ParameterLayout NewProjectAudioProcessor::CreateParameters()
{
juce::AudioProcessorValueTreeState::ParameterLayout params;
params.add(std::make_unique<AudioParameterFloat>(Ids::Gain::id, Ids::Gain::text, NormalisableRange<float>(0.0f, 1.0f), 0.5f));
// The rest of the params.add
return params;
}
-
in AudioProcessorEditor (PluginEditor.cpp):
constructor:{ // m_gainValue is a ScopedPointer<AudioProcessorValueTreeState::SliderAttachment> m_gainValue = SetSlider(m_gainSlider, "gain", 0.0f, 1.0f, 0.5f, 10, 10, 75, 75); addAndMakeVisible(m_gainSlider); // Filter addAndMakeVisible(m_filter); m_filter.setBounds(0, 160, 220, 150); }
where SetSlider() is a static method that is either used directly from processor editor or called by the member components:
AudioProcessorValueTreeState::SliderAttachment* NewProjectAudioProcessorEditor::SetSlider(Slider& slider, const juce::String name, double min, double max, double default, double x, double y, double w, double h, Slider::SliderStyle style /*= Slider::RotaryVerticalDrag*/, Slider::TextEntryBoxPosition textPosition /*= juce::Slider::NoTextBox*/)
{
slider.setName(name);
slider.setNormalisableRange(NormalisableRange<double>(min, max));
slider.setValue(default);
slider.setSliderStyle(style);
slider.setTextBoxStyle(textPosition, true, 80, 20);
slider.setBounds(x, y, w, h);
return new AudioProcessorValueTreeState::SliderAttachment(m_audioProcessor.m_treestate, name, slider);
}
Example for Filters (m_filter is a member in AudioProcessorEditor and its type is CFilter)
CFilter::CFilter (NewProjectAudioProcessor& p)
: m_processor(p)
{
const float verticalOffset = 10;
// m_cutoffValue is a ScopedPointer<AudioProcessorValueTreeState::SliderAttachment>
m_cutoffValue = NewProjectAudioProcessorEditor::SetSlider(m_cutOffSlider, p, Ids::Filter::Cutoff::id, 20.0f, 20000.0f, 10000.0f, 0, verticalOffset, 100, 100);
addAndMakeVisible(m_cutOffSlider);
}
What do you think is the cause of this? race conditions? Cross Thread Access?
Thanks!