use mpeg4 for internal video format (not mjpeg)
[ardour.git] / gtk2_ardour / automation_line.cc
index 43245f58d8afb03f1366154e1e4ef780a74429cb..069a82315508f8af9b5394d92ba1e54428b900b8 100644 (file)
@@ -119,6 +119,7 @@ AutomationLine::AutomationLine (const string&                              name,
        trackview.session()->register_with_memento_command_factory(alist->id(), this);
 
        if (alist->parameter().type() == GainAutomation ||
+           alist->parameter().type() == TrimAutomation ||
            alist->parameter().type() == EnvelopeAutomation ||
            desc.unit == ParameterDescriptor::DB) {
                set_uses_gain_mapping (true);
@@ -375,10 +376,16 @@ AutomationLine::fraction_to_string (double fraction) const
 {
        if (_uses_gain_mapping) {
                char buf[32];
-               if (fraction == 0.0) {
-                       snprintf (buf, sizeof (buf), "-inf");
+               if (_desc.type == GainAutomation || _desc.type == EnvelopeAutomation || _desc.lower == 0) {
+                       if (fraction == 0.0) {
+                               snprintf (buf, sizeof (buf), "-inf");
+                       } else {
+                               snprintf (buf, sizeof (buf), "%.1f", accurate_coefficient_to_dB (slider_position_to_gain_with_max (fraction, _desc.upper)));
+                       }
                } else {
-                       snprintf (buf, sizeof (buf), "%.1f", accurate_coefficient_to_dB (slider_position_to_gain_with_max (fraction, Config->get_max_gain())));
+                       const double lower_db = accurate_coefficient_to_dB (_desc.lower);
+                       const double range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
+                       snprintf (buf, sizeof (buf), "%.1f", lower_db + fraction * range_db);
                }
                return buf;
        } else {
@@ -1185,12 +1192,22 @@ AutomationLine::view_to_model_coord (double& x, double& y) const
 void
 AutomationLine::view_to_model_coord_y (double& y) const
 {
-       /* TODO: This should be more generic (use ParameterDescriptor) */
-       if (alist->parameter().type() == GainAutomation ||
-           alist->parameter().type() == EnvelopeAutomation) {
-               y = slider_position_to_gain_with_max (y, Config->get_max_gain());
+       /* TODO: This should be more generic (use ParameterDescriptor)
+        * or better yet:  Controllable -> set_interface();
+        */
+       if (   alist->parameter().type() == GainAutomation
+           || alist->parameter().type() == EnvelopeAutomation
+           || (_desc.unit == ParameterDescriptor::DB && _desc.lower == 0.)) {
+               y = slider_position_to_gain_with_max (y, _desc.upper);
+               y = max ((double)_desc.lower, y);
+               y = min ((double)_desc.upper, y);
+       } else if (alist->parameter().type() == TrimAutomation
+                  || (_desc.unit == ParameterDescriptor::DB && _desc.lower > 0 && _desc.upper > _desc.lower)) {
+               const double lower_db = accurate_coefficient_to_dB (_desc.lower);
+               const double range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
                y = max (0.0, y);
-               y = min (2.0, y);
+               y = min (1.0, y);
+               y = dB_to_coefficient (lower_db + y * range_db);
        } else if (alist->parameter().type() == PanAzimuthAutomation ||
                   alist->parameter().type() == PanElevationAutomation) {
                y = 1.0 - y;
@@ -1210,9 +1227,15 @@ void
 AutomationLine::model_to_view_coord_y (double& y) const
 {
        /* TODO: This should be more generic (use ParameterDescriptor) */
-       if (alist->parameter().type() == GainAutomation ||
-           alist->parameter().type() == EnvelopeAutomation) {
+       if (   alist->parameter().type() == GainAutomation
+           || alist->parameter().type() == EnvelopeAutomation
+           || (_desc.unit == ParameterDescriptor::DB && _desc.lower == 0.)) {
                y = gain_to_slider_position_with_max (y, Config->get_max_gain());
+       } else if (alist->parameter().type() == TrimAutomation
+                  || (_desc.unit == ParameterDescriptor::DB && _desc.lower > 0 && _desc.upper > _desc.lower)) {
+               const double lower_db = accurate_coefficient_to_dB (_desc.lower);
+               const double range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
+               y = (accurate_coefficient_to_dB (y) - lower_db) / range_db;
        } else if (alist->parameter().type() == PanAzimuthAutomation ||
                   alist->parameter().type() == PanElevationAutomation) {
                y = 1.0 - y;