From 7ed775a716de655cee496e925fe062f6603abc0e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 2 Jul 2017 21:04:22 +0200 Subject: Add API to step though parameter enumerations --- libs/ardour/parameter_descriptor.cc | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'libs/ardour/parameter_descriptor.cc') 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 #include #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 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::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 -- cgit v1.2.3