Here’s a temporary fix that seems to work for our product. Instead of
treeState.getParameterAsValue(ID)
you would write
APVTSValueAdapter::getParameterAsValue(treeState, ID)
.
I would still prefer a true solution to this.
APVTSValueAdapter.h
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
class APVTSValueAdapter : public Value::ValueSource,
private RangedAudioParameter::Listener
{
public:
APVTSValueAdapter(AudioProcessorValueTreeState& treeState, String parameterID);
virtual ~APVTSValueAdapter();
virtual var getValue() const override { return m_currentValue; }
virtual void setValue(const var& newValue) override;
static Value getParameterAsValue(AudioProcessorValueTreeState& treeState, String parameterID)
{
return juce::Value(static_cast<Value::ValueSource*>(new APVTSValueAdapter(treeState, parameterID)));
}
private:
virtual void parameterValueChanged(int parameterIndex, float newValue) override;
virtual void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override {}
RangedAudioParameter* m_parameter;
float m_currentValue; // cached for speed. Required? Maybe not.
};
APVTSValueAdapter.cpp
#include "APVTSValueAdapter.h"
APVTSValueAdapter::APVTSValueAdapter(AudioProcessorValueTreeState& treeState, String parameterID)
{
m_parameter = treeState.getParameter(parameterID);
jassert(m_parameter);
m_parameter->addListener(this);
m_currentValue = m_parameter->convertFrom0to1(m_parameter->getValue());
}
APVTSValueAdapter::~APVTSValueAdapter()
{
m_parameter->removeListener(this);
}
void APVTSValueAdapter::setValue(const var& newValue)
{
m_parameter->setValueNotifyingHost(m_parameter->convertTo0to1(newValue));
}
void APVTSValueAdapter::parameterValueChanged(int parameterIndex, float newValue)
{
m_currentValue = m_parameter->convertFrom0to1(newValue);
sendChangeMessage(false);
}