Krotos Modules 3
Loading...
Searching...
No Matches
KParameter.cpp
Go to the documentation of this file.
1namespace krotos
2{
3 KParameter::AudioListenerObject::AudioListenerObject(std::shared_ptr<KParameter> parameterToListenTo,
4 std::function<void(float)> onChangeFunction)
5 : parameter(parameterToListenTo), onChange(std::move(onChangeFunction))
6 {
7 jassert(onChange != nullptr && parameterToListenTo != nullptr);
8 if (auto parameterPtr = parameter.lock())
9 {
10 parameterPtr->addListener(this);
11 }
12 }
13
15 {
16 if (auto parameterPtr = parameter.lock())
17 {
18 parameterPtr->removeListener(this);
19 }
20 }
21
23 {
24 if (onChange)
25 {
26 if (auto parameterPtr = parameter.lock())
27 {
28 onChange(parameterPtr->convertFrom0to1(newValue));
29 }
30 }
31 }
32
33 KParameter::AsyncListenerObject::AsyncListenerObject(std::shared_ptr<KParameter> parameterToListenTo,
34 std::function<void(float)> onChangeFunction)
35 : parameter(parameterToListenTo), onChange(std::move(onChangeFunction))
36 {
37 jassert(onChange != nullptr && parameterToListenTo != nullptr);
38 if (auto parameterPtr = parameter.lock())
39 {
40 parameterPtr->addListener(this);
41 }
42 }
43
45 {
46 if (auto parameterPtr = parameter.lock())
47 {
48 parameterPtr->removeListener(this);
49 }
50 masterReference.clear();
51 }
52
54 {
55 lastValue = newValue;
56
57 if (MessageManager::getInstance()->isThisTheMessageThread())
58 {
59 cancelPendingUpdate();
60 handleAsyncUpdate();
61 }
62 else
63 {
64 triggerAsyncUpdate();
65 }
66 }
67
69 {
70 WeakReference<KParameter::AsyncListenerObject> kParamListener(this);
71 if (onChange != nullptr && kParamListener)
72 {
73 if (auto parameterPtr = parameter.lock())
74 {
75 onChange(parameterPtr->convertFrom0to1(lastValue));
76 }
77 }
78 }
79
80 KParameter::KParameter(const String& parameterID, const String& parameterName,
81 const NormalisableRange<float>& normalisableRange, float defaultValue,
82 const String& parameterLabel,
83 std::function<String(float value, int maximumStringLength)> stringFromValue,
84 std::function<float(const String& text)> valueFromString)
85 : RangedAudioParameter(parameterID, parameterName, parameterLabel, AudioProcessorParameter::genericParameter),
86 m_range(normalisableRange), m_value(defaultValue), m_normalisedValue(m_range.convertTo0to1(defaultValue)),
87 m_defaultValue(defaultValue), m_stringFromValueFunction(stringFromValue),
88 m_valueFromStringFunction(valueFromString)
89 {
90 if (m_stringFromValueFunction == nullptr)
91 {
92 auto numDecimalPlacesToDisplay = [this] {
93 int numDecimalPlaces = 7;
94 if (m_range.interval != 0.0f)
95 {
96 if (approximatelyEqual(std::abs(m_range.interval - std::floor(m_range.interval)), 0.0f))
97 return 0;
98
99 auto v = std::abs(roundToInt(m_range.interval * pow(10, numDecimalPlaces)));
100 while ((v % 10) == 0 && numDecimalPlaces > 0)
101 {
102 --numDecimalPlaces;
103 v /= 10;
104 }
105 }
106
107 return numDecimalPlaces;
108 }();
109
110 m_stringFromValueFunction = [numDecimalPlacesToDisplay](float v, int length) {
111 String asText(v, numDecimalPlacesToDisplay);
112 return length > 0 ? asText.substring(0, length) : asText;
113 };
114 }
115
116 if (m_valueFromStringFunction == nullptr)
117 m_valueFromStringFunction = [](const String& text) { return text.getFloatValue(); };
118 }
119
120 void KParameter::parameterValueChanged(int /*parameterIndex*/, float newValue)
121 {
122 if (m_normalisedValue != newValue)
123 setValueNotifyingHost(newValue);
124 }
125
126 float KParameter::get() const { return m_value; }
127
128 void KParameter::set(float newValue)
129 {
130 if (std::isnan(newValue) == false)
131 {
132 auto normalised = convertTo0to1(newValue);
134 m_attachedParameter->setValueNotifyingHost(normalised);
135 else
136 setValueNotifyingHost(normalised);
137 }
138 else
139 {
140 jassertfalse; // new param value is NaN, shouldn't get here
141 }
142 }
143
144 void KParameter::notifyListeners() { sendValueChangedMessageToListeners(getValue()); }
145
147 {
148 jassert(p != nullptr);
149
151 detach();
152
153 p->link(this);
154 p->addListener(this);
155 p->setValueNotifyingHost(getValue());
156
158 }
159
161 {
163 {
164 m_attachedParameter->removeListener(this);
166 m_attachedParameter = nullptr;
167 }
168 }
169
171 {
172 // This parameter can only be attached to a GUI element if it is currently
173 // attached to a GenericParameter.
174 jassert(m_attachedParameter != nullptr);
175
176 return m_attachedParameter;
177 }
178
179 const NormalisableRange<float>& KParameter::getNormalisableRange() const { return m_range; }
180
181 float KParameter::getValue() const { return m_normalisedValue; }
182
183 bool KParameter::isOn() const { return m_normalisedValue > 0.5f; };
184
185 void KParameter::setValue(float newValue)
186 {
187 m_normalisedValue = newValue;
188 m_value = convertFrom0to1(newValue);
189 }
190
191 float KParameter::getDefaultValue() const { return convertTo0to1(m_defaultValue); }
192
193 String KParameter::getText(float value, int length) const
194 {
195 return m_stringFromValueFunction(convertFrom0to1(value), length);
196 }
197
198 float KParameter::getValueForText(const String& text) const
199 {
200 return convertTo0to1(m_valueFromStringFunction(text));
201 }
202} // namespace krotos
A subclass of RangedAudioParameter that can act as an alias for another audio parameter,...
Definition GenericParameter.h:15
void link(RangedAudioParameter *paramToAttach)
Definition GenericParameter.cpp:16
void unlink()
Definition GenericParameter.cpp:18
GenericParameter * m_attachedParameter
Definition KParameter.h:148
GenericParameter * getAttachedParameter()
Definition KParameter.cpp:170
std::atomic< float > m_value
Definition KParameter.h:144
std::function< String(float, int)> m_stringFromValueFunction
Definition KParameter.h:150
float getValueForText(const String &text) const override
Definition KParameter.cpp:198
void parameterValueChanged(int, float newValue) override
Definition KParameter.cpp:120
void setValue(float newValue) override
Definition KParameter.cpp:185
float get() const
Definition KParameter.cpp:126
KParameter(const String &parameterID, const String &parameterName, const NormalisableRange< float > &normalisableRange, float defaultValue, const String &parameterLabel=String(), std::function< String(float value, int maximumStringLength)> stringFromValue=nullptr, std::function< float(const String &text)> valueFromString=nullptr)
Definition KParameter.cpp:80
std::atomic< float > m_normalisedValue
Definition KParameter.h:145
void attach(GenericParameter *p)
Definition KParameter.cpp:146
float getDefaultValue() const override
Definition KParameter.cpp:191
void detach()
Definition KParameter.cpp:160
float getValue() const override
Definition KParameter.cpp:181
NormalisableRange< float > m_range
Definition KParameter.h:143
void notifyListeners()
Definition KParameter.cpp:144
void set(float newValue)
Definition KParameter.cpp:128
String getText(float value, int length) const override
Definition KParameter.cpp:193
bool isOn() const
Definition KParameter.cpp:183
std::function< float(const String &)> m_valueFromStringFunction
Definition KParameter.h:151
const NormalisableRange< float > & getNormalisableRange() const override
Definition KParameter.cpp:179
const float m_defaultValue
Definition KParameter.h:146
Definition AirAbsorptionFilter.cpp:2
~AsyncListenerObject() override
Definition KParameter.cpp:44
AsyncListenerObject(std::shared_ptr< KParameter > parameterToListenTo, std::function< void(float)> onChangeFunction)
Definition KParameter.cpp:33
const std::function< void(float)> onChange
Definition KParameter.h:78
std::weak_ptr< KParameter > const parameter
Definition KParameter.h:77
void parameterValueChanged(int, float newValue) override
Definition KParameter.cpp:53
void handleAsyncUpdate() override
Definition KParameter.cpp:68
std::weak_ptr< KParameter > const parameter
Definition KParameter.h:36
const std::function< void(float)> onChange
Definition KParameter.h:47
void parameterValueChanged(int, float newValue) override
Definition KParameter.cpp:22
~AudioListenerObject() override
Definition KParameter.cpp:14
AudioListenerObject(std::shared_ptr< KParameter > parameterToListenTo, std::function< void(float)> onChangeFunction)
Definition KParameter.cpp:3