13
0

properly handle integer steps in plugin controls

The integer steps min/max are inclusive. 
e.g the integer range -1 to +1 has three possible values (not two).
This commit is contained in:
Robin Gareus 2015-06-01 21:27:14 +02:00
parent 42915c19a4
commit dd07428c48
4 changed files with 49 additions and 35 deletions

View File

@ -89,6 +89,9 @@ public:
double normal() const { return _desc.normal; }
bool toggled() const { return _desc.toggled; }
double internal_to_interface (double i) const;
double interface_to_internal (double i) const;
const ParameterDescriptor& desc() const { return _desc; }
const ARDOUR::Session& session() const { return _session; }

View File

@ -97,9 +97,6 @@ class LIBARDOUR_API PluginInsert : public Processor
double get_value (void) const;
XMLNode& get_state();
double internal_to_interface (double) const;
double interface_to_internal (double) const;
private:
PluginInsert* _plugin;
};

View File

@ -139,3 +139,49 @@ AutomationControl::stop_touch(bool mark, double when)
}
}
}
double
AutomationControl::internal_to_interface (double val) const
{
if (_desc.integer_step) {
// both upper and lower are inclusive.
val = (val - lower()) / (1 + upper() - lower());
} else {
val = (val - lower()) / (upper() - lower());
}
if (_desc.logarithmic) {
if (val > 0) {
val = pow (val, 1/1.5);
} else {
val = 0;
}
}
return val;
}
double
AutomationControl::interface_to_internal (double val) const
{
if (_desc.logarithmic) {
if (val <= 0) {
val = 0;
} else {
val = pow (val, 1.5);
}
}
if (_desc.integer_step) {
val = lower() + val * (1 + upper() - lower());
} else {
val = lower() + val * (upper() - lower());
}
if (val < lower()) val = lower();
if (val > upper()) val = upper();
return val;
}

View File

@ -1296,38 +1296,6 @@ PluginInsert::PluginControl::set_value (double user_val)
AutomationControl::set_value (user_val);
}
double
PluginInsert::PluginControl::internal_to_interface (double val) const
{
val = Controllable::internal_to_interface(val);
if (_desc.logarithmic) {
if (val > 0) {
val = pow (val, 1/1.5);
} else {
val = 0;
}
}
return val;
}
double
PluginInsert::PluginControl::interface_to_internal (double val) const
{
if (_desc.logarithmic) {
if (val <= 0) {
val = 0;
} else {
val = pow (val, 1.5);
}
}
val = Controllable::interface_to_internal(val);
return val;
}
XMLNode&
PluginInsert::PluginControl::get_state ()
{