diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp index 48686bb218..01bc0e777c 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp @@ -33,8 +33,8 @@ AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID, const String& labelText, NormalisableRange valueRange, float defaultValue, - std::function valueToTextFunction, - std::function textToValueFunction, + std::function valueToTextFunction, + std::function textToValueFunction, bool isMetaParameter, bool isAutomatableParameter, bool isDiscrete, @@ -46,9 +46,10 @@ AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID, defaultValue, labelText, category, - valueToTextFunction == nullptr ? std::function() - : [valueToTextFunction](float v, int) { return valueToTextFunction (v); }, + valueToTextFunction == nullptr ? std::function() + : [valueToTextFunction](float v, int) { return valueToTextFunction (v); }, std::move (textToValueFunction)), + unsnappedDefault (valueRange.convertTo0to1 (defaultValue)), metaParameter (isMetaParameter), automatable (isAutomatableParameter), discrete (isDiscrete), @@ -56,12 +57,13 @@ AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID, { } - int AudioProcessorValueTreeState::Parameter::getNumSteps() const { return RangedAudioParameter::getNumSteps(); } +float AudioProcessorValueTreeState::Parameter::getDefaultValue() const { return unsnappedDefault; } +int AudioProcessorValueTreeState::Parameter::getNumSteps() const { return RangedAudioParameter::getNumSteps(); } - bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const { return metaParameter; } - bool AudioProcessorValueTreeState::Parameter::isAutomatable() const { return automatable; } - bool AudioProcessorValueTreeState::Parameter::isDiscrete() const { return discrete; } - bool AudioProcessorValueTreeState::Parameter::isBoolean() const { return boolean; } +bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const { return metaParameter; } +bool AudioProcessorValueTreeState::Parameter::isAutomatable() const { return automatable; } +bool AudioProcessorValueTreeState::Parameter::isDiscrete() const { return discrete; } +bool AudioProcessorValueTreeState::Parameter::isBoolean() const { return boolean; } //============================================================================== class AudioProcessorValueTreeState::ParameterAdapter : private AudioProcessorParameter::Listener @@ -71,7 +73,9 @@ private: public: explicit ParameterAdapter (RangedAudioParameter& parameterIn) - : parameter (parameterIn) + : parameter (parameterIn), + // For legacy reasons, the unnormalised value should *not* be snapped on construction + unnormalisedValue (getRange().convertFrom0to1 (parameter.getDefaultValue())) { parameter.addListener (this); } @@ -1030,6 +1034,24 @@ public: expectEquals (*proc.state.getRawParameterValue (key), value); } + beginTest ("After adding an APVTS::Parameter, its value is the default value"); + { + TestAudioProcessor proc; + const auto key = "id"; + const auto value = 5.0f; + + proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + String(), + juce::NormalisableRange (0.0f, 100.0f, 10.0f), + value, + nullptr, + nullptr)); + + expectEquals (*proc.state.getRawParameterValue (key), value); + } + beginTest ("Listeners receive notifications when parameters change"); { Listener listener; diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h index 52b5c84d05..9ad743bf3f 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h @@ -366,6 +366,7 @@ public: AudioProcessorParameter::Category category = AudioProcessorParameter::genericParameter, bool isBoolean = false); + float getDefaultValue() const override; int getNumSteps() const override; bool isMetaParameter() const override; @@ -374,6 +375,7 @@ public: bool isBoolean() const override; private: + const float unsnappedDefault; const bool metaParameter, automatable, discrete, boolean; };