+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);
+ }
+}
+