summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-06-20 13:58:33 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-06-20 13:58:33 +0000
commitb27233293306324c6a2ee598dcb5d0248c7e1e16 (patch)
treebb46e36eea16d1086e9139c8a846759eccc03eb8
parent12c844dd8de41e8ba55db2598d30000fcce45cc1 (diff)
change VolumeController::adjust() to do discrete dB increments+decrements
git-svn-id: svn://localhost/ardour2/branches/3.0@9750 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/monitor_section.cc8
-rw-r--r--gtk2_ardour/volume_controller.cc31
2 files changed, 29 insertions, 10 deletions
diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc
index ecd1e5c259..4c40a65504 100644
--- a/gtk2_ardour/monitor_section.cc
+++ b/gtk2_ardour/monitor_section.cc
@@ -70,7 +70,7 @@ MonitorSection::MonitorSection (Session* s)
/* 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 ();
@@ -134,7 +134,7 @@ MonitorSection::MonitorSection (Session* s)
/* 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);
@@ -151,7 +151,7 @@ MonitorSection::MonitorSection (Session* s)
/* 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);
@@ -234,7 +234,7 @@ MonitorSection::MonitorSection (Session* s)
/* 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);
diff --git a/gtk2_ardour/volume_controller.cc b/gtk2_ardour/volume_controller.cc
index 365379933d..7d6a3362de 100644
--- a/gtk2_ardour/volume_controller.cc
+++ b/gtk2_ardour/volume_controller.cc
@@ -133,11 +133,11 @@ VolumeController::to_display_value (double control_value)
{
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;
}
@@ -145,6 +145,25 @@ VolumeController::to_display_value (double control_value)
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);
+}