+VolumeController::dB_printer (char buf[32], const boost::shared_ptr<PBD::Controllable>& c)
+{
+ if (c) {
+
+ if (_linear) {
+
+ double val = accurate_coefficient_to_dB (c->get_value());
+
+ if (step_inc < 1.0) {
+ if (val >= 0.0) {
+ snprintf (buf, 32, "+%5.2f dB", val);
+ } else {
+ snprintf (buf, 32, "%5.2f dB", val);
+ }
+ } else {
+ if (val >= 0.0) {
+ snprintf (buf, 32, "+%2ld dB", lrint (val));
+ } else {
+ snprintf (buf, 32, "%2ld dB", lrint (val));
+ }
+ }
+
+ } else {
+
+ double dB = accurate_coefficient_to_dB (c->get_value());
+
+ if (step_inc < 1.0) {
+ if (dB >= 0.0) {
+ snprintf (buf, 32, "+%5.2f dB", dB);
+ } else {
+ snprintf (buf, 32, "%5.2f dB", dB);
+ }
+ } else {
+ if (dB >= 0.0) {
+ snprintf (buf, 32, "+%2ld dB", lrint (dB));
+ } else {
+ snprintf (buf, 32, "%2ld dB", lrint (dB));
+ }
+ }
+ }
+ } else {
+ snprintf (buf, 32, "--");
+ }
+}
+
+double
+VolumeController::to_control_value (double display_value)
+{
+ double v;
+
+ /* display value is always clamped to 0.0 .. 1.0 */
+ display_value = std::max (0.0, std::min (1.0, display_value));
+
+ if (_linear) {
+ v = _controllable->lower() + ((_controllable->upper() - _controllable->lower()) * display_value);
+ } else {
+ v = slider_position_to_gain_with_max (display_value, ARDOUR::Config->get_max_gain());
+ }
+
+ return v;
+}
+
+double
+VolumeController::to_display_value (double control_value)