/* Dim */
- dim_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.1, 1.0, true, 30, 30, true);
+ dim_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.01, 0.1, true, 30, 30, true);
HBox* dim_packer = manage (new HBox);
dim_packer->show ();
/* Solo Boost */
- solo_boost_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.1, 1.0, true, 30, 30, true);
+ solo_boost_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.01, 0.1, true, 30, 30, true);
HBox* solo_packer = manage (new HBox);
solo_packer->set_spacing (12);
/* Solo (SiP) cut */
- solo_cut_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.1, 1.0, true, 30, 30, true);
+ solo_cut_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr<Controllable>(), 0.0, 0.01, 0.1, true, 30, 30, true);
spin_label = manage (new Label (_("SiP Cut")));
spin_packer = manage (new VBox);
/* Gain */
- gain_control = new VolumeController (big_knob_pixbuf, boost::shared_ptr<Controllable>(), 1.0, 0.1, 1.0, true, 80, 80, false);
+ gain_control = new VolumeController (big_knob_pixbuf, boost::shared_ptr<Controllable>(), 1.0, 0.01, 0.1, true, 80, 80, false);
spin_label = manage (new Label (_("Monitor")));
spin_packer = manage (new VBox);
{
double v;
-// if (_linear) {
+ if (_linear) {
v = (control_value - _controllable->lower ()) / (_controllable->upper() - _controllable->lower());
-// } else {
-// v = gain_to_slider_position_with_max (control_value, ARDOUR::Config->get_max_gain());
-// }
+ } else {
+ v = gain_to_slider_position_with_max (control_value, ARDOUR::Config->get_max_gain());
+ }
return v;
}
double
VolumeController::adjust (double control_delta)
{
- return std::max (_controllable->lower(), std::min (_controllable->upper(), _controllable->get_value() + control_delta));
-}
+ double v = _controllable->get_value ();
+ double abs_delta = fabs (control_delta);
+
+ /* convert to linear/fractional slider position domain */
+ v = gain_to_slider_position_with_max (v, ARDOUR::Config->get_max_gain());
+ /* adjust in this domain */
+ v += control_delta;
+ /* convert back to gain coefficient domain */
+ v = slider_position_to_gain_with_max (v, ARDOUR::Config->get_max_gain());
+ /* now round to some precision in the dB domain */
+ v = accurate_coefficient_to_dB (v);
+
+ if (abs_delta <= 0.01) {
+ v -= fmod (v, 0.05);
+ } else {
+ v -= fmod (v, 0.1);
+ }
+
+ /* and return it */
+ return dB_to_coefficient (v);
+}