summaryrefslogtreecommitdiff
path: root/libs/ardour/parameter_descriptor.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-07-02 21:04:22 +0200
committerRobin Gareus <robin@gareus.org>2017-07-02 21:04:22 +0200
commit7ed775a716de655cee496e925fe062f6603abc0e (patch)
treed620422e9c6082efc1a39c16b244ebe06ef90e91 /libs/ardour/parameter_descriptor.cc
parent0310f8997147cc50600a98f05ef1a6c486e688c7 (diff)
Add API to step though parameter enumerations
Diffstat (limited to 'libs/ardour/parameter_descriptor.cc')
-rw-r--r--libs/ardour/parameter_descriptor.cc48
1 files changed, 48 insertions, 0 deletions
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 1a79191e56..9e02bc01ab 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -17,6 +17,7 @@
675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <algorithm>
#include <boost/algorithm/string.hpp>
#include "pbd/control_math.h"
@@ -162,6 +163,16 @@ ParameterDescriptor::update_steps()
if (rangesteps < 2) {
rangesteps = 0;
}
+ if (enumeration) {
+ if (!scale_points || scale_points->empty ()) {
+ enumeration = false;
+ }
+ }
+ if (integer_step) {
+ if (lower >= upper) {
+ integer_step = false;
+ }
+ }
if (unit == ParameterDescriptor::MIDI_NOTE) {
step = smallstep = 1; // semitone
@@ -425,4 +436,41 @@ ParameterDescriptor::apply_delta (float val, float delta) const
}
}
+float
+ParameterDescriptor::step_enum (float val, bool prev) const
+{
+ if (!enumeration) {
+ return val;
+ }
+ assert (scale_points && !scale_points->empty ());
+ float rv = scale_points->begin()->second;
+ float delta = fabsf (val - rv);
+ std::vector<float> avail;
+
+ for (ScalePoints::const_iterator i = scale_points->begin (); i != scale_points->end (); ++i) {
+ float s = i->second;
+ avail.push_back (s);
+ if (fabsf (val - s) < delta) {
+ rv = s;
+ delta = fabsf (val - s);
+ }
+ }
+ /* ScalePoints map is sorted by text string */
+ std::sort (avail.begin (), avail.end ());
+ std::vector<float>::const_iterator it = std::find (avail.begin (), avail.end (), rv);
+ assert (it != avail.end());
+
+ if (prev) {
+ if (it == avail.begin()) {
+ return rv;
+ }
+ return *(--it);
+ } else {
+ if (++it == avail.end()) {
+ return rv;
+ }
+ return *(it);
+ }
+}
+
} // namespace ARDOUR