Remove LocaleGuard from Plugin::get_state
[ardour.git] / libs / ardour / parameter_descriptor.cc
index 7ed0c785126d6a9808182a37aa3123e1aaaa48ae..310ec1a4832c0346a95c76237756c38483e16847 100644 (file)
@@ -143,6 +143,17 @@ ParameterDescriptor::ParameterDescriptor()
 void
 ParameterDescriptor::update_steps()
 {
+       /* sanitize flags */
+       if (toggled || enumeration) {
+               logarithmic = false;
+       }
+       if (logarithmic && (upper <= lower || lower * upper <= 0)) {
+               logarithmic = false;
+       }
+       if (rangesteps < 2) {
+               rangesteps = 0;
+       }
+
        if (unit == ParameterDescriptor::MIDI_NOTE) {
                step      = smallstep = 1;  // semitone
                largestep = 12;             // octave
@@ -153,10 +164,22 @@ ParameterDescriptor::update_steps()
                largestep = position_to_gain (dB_coeff_step(upper));
                step      = position_to_gain (largestep / 10.0);
                smallstep = step;
+       } else if (rangesteps > 1) {
+               const float delta = upper - lower;
+
+               step = smallstep = (delta / (rangesteps - 1)); // XXX
+               largestep = std::min ((delta / 5.0f), 10.f * smallstep); // XXX
+
+               if (logarithmic) {
+                       smallstep = smallstep / logf (rangesteps); // XXX
+                       step      = step      / logf (rangesteps);
+                       largestep = largestep / logf (rangesteps);
+               } else if (integer_step) {
+                       smallstep = 1.0;
+                       step      = std::max(1.f, rintf (rangesteps));
+                       largestep = std::max(1.f, rintf (largestep));
+               }
        } else {
-               /* note that LV2Plugin::get_parameter_descriptor ()
-                * overrides this is lv2:rangeStep is set for a port.
-                */
                const float delta = upper - lower;
 
                /* 30 happens to be the total number of steps for a fader with default
@@ -354,4 +377,43 @@ ParameterDescriptor::from_interface (float val) const
        return val;
 }
 
+bool
+ParameterDescriptor::is_linear () const
+{
+       if (logarithmic) {
+               return false;
+       }
+       switch(type) {
+               case GainAutomation:
+               case EnvelopeAutomation:
+               case BusSendLevel:
+                       return false;
+               default:
+                       break;
+       }
+       return true;
+}
+
+float
+ParameterDescriptor::compute_delta (float from, float to) const
+{
+       if (is_linear ()) {
+               return to - from;
+       }
+       if (from == 0) {
+               return 0;
+       }
+       return to / from;
+}
+
+float
+ParameterDescriptor::apply_delta (float val, float delta) const
+{
+       if (is_linear ()) {
+               return val + delta;
+       } else {
+               return val * delta;
+       }
+}
+
 } // namespace ARDOUR