OSC: add delta controls to master, monitor and select as well
[ardour.git] / libs / surfaces / osc / osc.cc
index a73c2af8801bda6b1b02e9c17d2606d2b48b7e0d..5f757b9105b60c2e19cd72a875b10fe5009d2287 100644 (file)
@@ -538,11 +538,13 @@ OSC::register_callbacks()
                // controls for "special" strips
                REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain);
                REGISTER_CALLBACK (serv, "/master/fader", "f", master_set_fader);
+               REGISTER_CALLBACK (serv, "/master/db_delta", "f", master_delta_gain);
                REGISTER_CALLBACK (serv, "/master/mute", "i", master_set_mute);
                REGISTER_CALLBACK (serv, "/master/trimdB", "f", master_set_trim);
                REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
                REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
                REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader);
+               REGISTER_CALLBACK (serv, "/monitor/db_delta", "f", monitor_delta_gain);
                REGISTER_CALLBACK (serv, "/monitor/mute", "i", monitor_set_mute);
                REGISTER_CALLBACK (serv, "/monitor/dim", "i", monitor_set_dim);
                REGISTER_CALLBACK (serv, "/monitor/mono", "i", monitor_set_mono);
@@ -559,6 +561,7 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/select/polarity", "i", sel_phase);
                REGISTER_CALLBACK (serv, "/select/gain", "f", sel_gain);
                REGISTER_CALLBACK (serv, "/select/fader", "f", sel_fader);
+               REGISTER_CALLBACK (serv, "/select/db_delta", "f", sel_dB_delta);
                REGISTER_CALLBACK (serv, "/select/trimdB", "f", sel_trim);
                REGISTER_CALLBACK (serv, "/select/pan_stereo_position", "f", sel_pan_position);
                REGISTER_CALLBACK (serv, "/select/pan_stereo_width", "f", sel_pan_width);
@@ -2356,7 +2359,33 @@ OSC::master_set_gain (float dB)
                if (dB < -192) {
                        s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
                } else {
-                       s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+                       float abs = dB_to_coefficient (dB);
+                       float top = s->gain_control()->upper();
+                       if (abs > top) {
+                               abs = top;
+                       }
+                       s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+               }
+       }
+       return 0;
+}
+
+int
+OSC::master_delta_gain (float delta)
+{
+       if (!session) return -1;
+       boost::shared_ptr<Stripable> s = session->master_out();
+       if (s) {
+               float dB = accurate_coefficient_to_dB (s->gain_control()->get_value()) + delta;
+               if (dB < -192) {
+                       s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+               } else {
+                       float abs = dB_to_coefficient (dB);
+                       float top = s->gain_control()->upper();
+                       if (abs > top) {
+                               abs = top;
+                       }
+                       s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
                }
        }
        return 0;
@@ -2437,7 +2466,33 @@ OSC::monitor_set_gain (float dB)
                if (dB < -192) {
                        s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
                } else {
-                       s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+                       float abs = dB_to_coefficient (dB);
+                       float top = s->gain_control()->upper();
+                       if (abs > top) {
+                               abs = top;
+                       }
+                       s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+               }
+       }
+       return 0;
+}
+
+int
+OSC::monitor_delta_gain (float delta)
+{
+       if (!session) return -1;
+       boost::shared_ptr<Stripable> s = session->monitor_out();
+       if (s) {
+               float dB = accurate_coefficient_to_dB (s->gain_control()->get_value()) + delta;
+               if (dB < -192) {
+                       s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+               } else {
+                       float abs = dB_to_coefficient (dB);
+                       float top = s->gain_control()->upper();
+                       if (abs > top) {
+                               abs = top;
+                       }
+                       s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
                }
        }
        return 0;
@@ -3334,12 +3389,47 @@ OSC::sel_gain (float val, lo_message msg)
        }
        if (s) {
                float abs;
-               if (val < -192) {
-                       abs = 0;
-               } else {
-                       abs = dB_to_coefficient (val);
+               if (s->gain_control()) {
+                       if (val < -192) {
+                               abs = 0;
+                       } else {
+                               abs = dB_to_coefficient (val);
+                               float top = s->gain_control()->upper();
+                               if (abs > top) {
+                                       abs = top;
+                               }
+                       }
+                       fake_touch (s->gain_control());
+                       s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+                       return 0;
                }
+       }
+       return sel_fail ("gain", -193, get_address (msg));
+}
+
+int
+OSC::sel_dB_delta (float delta, lo_message msg)
+{
+       OSCSurface *sur = get_surface(get_address (msg));
+       boost::shared_ptr<Stripable> s;
+       if (sur->expand_enable) {
+               s = get_strip (sur->expand, get_address (msg));
+       } else {
+               s = _select;
+       }
+       if (s) {
                if (s->gain_control()) {
+                       float dB = accurate_coefficient_to_dB (s->gain_control()->get_value()) + delta;
+                       float abs;
+                       if (dB < -192) {
+                               abs = 0;
+                       } else {
+                               abs = dB_to_coefficient (dB);
+                               float top = s->gain_control()->upper();
+                               if (abs > top) {
+                                       abs = top;
+                               }
+                       }
                        fake_touch (s->gain_control());
                        s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
                        return 0;
@@ -3381,6 +3471,10 @@ OSC::strip_db_delta (int ssid, float delta, lo_message msg)
                        abs = 0;
                } else {
                        abs = dB_to_coefficient (db);
+                       float top = s->gain_control()->upper();
+                       if (abs > top) {
+                               abs = top;
+                       }
                }
                s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
                return 0;
@@ -3941,51 +4035,82 @@ OSC::route_plugin_descriptor (int ssid, int piid, lo_message msg) {
        lo_message reply = lo_message_new();
        lo_message_add_int32 (reply, ssid);
        lo_message_add_int32 (reply, piid);
-       lo_message_add_string (reply, pip->name());
+       lo_message_add_int32(reply, redi->enabled() ? 1 : 0);
+
        for ( uint32_t ppi = 0; ppi < pip->parameter_count(); ppi++) {
 
                uint32_t controlid = pip->nth_parameter(ppi, ok);
                if (!ok) {
                        continue;
                }
-               if ( pip->parameter_is_input(controlid) || pip->parameter_is_control(controlid) ) {
-                       boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid));
-
-                               lo_message_add_int32 (reply, ppi + 1);
-                               ParameterDescriptor pd;
-                               pi->plugin()->get_parameter_descriptor(controlid, pd);
-                               lo_message_add_string (reply, pd.label.c_str());
-
-                               // I've combined those binary descriptor parts in a bit-field to reduce lilo message elements
-                               int flags = 0;
-                               flags |= pd.enumeration ? 1 : 0;
-                               flags |= pd.integer_step ? 2 : 0;
-                               flags |= pd.logarithmic ? 4 : 0;
-                               flags |= pd.sr_dependent ? 32 : 0;
-                               flags |= pd.toggled ? 64 : 0;
-                               flags |= c != NULL ? 128 : 0; // bit 7 indicates in input control
-                               lo_message_add_int32 (reply, flags);
-
-                               lo_message_add_int32 (reply, pd.datatype);
-                               lo_message_add_float (reply, pd.lower);
-                               lo_message_add_float (reply, pd.upper);
-                               lo_message_add_string (reply, pd.print_fmt.c_str());
-                               if ( pd.scale_points ) {
-                                       lo_message_add_int32 (reply, pd.scale_points->size());
-                                       for ( ARDOUR::ScalePoints::const_iterator i = pd.scale_points->begin(); i != pd.scale_points->end(); ++i) {
-                                               lo_message_add_int32 (reply, i->second);
-                                               lo_message_add_string (reply, ((std::string)i->first).c_str());
-                                       }
-                               }
-                               else {
-                                       lo_message_add_int32 (reply, 0);
-                               }
-                               if ( c ) {
-                                       lo_message_add_double (reply, c->get_value());
-                               }
-                               else {
-                                       lo_message_add_double (reply, 0);
+               boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid));
+
+               lo_message_add_int32 (reply, ppi + 1);
+               ParameterDescriptor pd;
+               pi->plugin()->get_parameter_descriptor(controlid, pd);
+               lo_message_add_string (reply, pd.label.c_str());
+
+               // I've combined those binary descriptor parts in a bit-field to reduce lilo message elements
+               int flags = 0;
+               flags |= pd.enumeration ? 1 : 0;
+               flags |= pd.integer_step ? 2 : 0;
+               flags |= pd.logarithmic ? 4 : 0;
+               flags |= pd.sr_dependent ? 32 : 0;
+               flags |= pd.toggled ? 64 : 0;
+               lo_message_add_int32 (reply, flags);
+
+               switch(pd.datatype) {
+                       case ARDOUR::Variant::BEATS:
+                               lo_message_add_string(reply, _("BEATS"));
+                               break;
+                       case ARDOUR::Variant::BOOL:
+                               lo_message_add_string(reply, _("BOOL"));
+                               break;
+                       case ARDOUR::Variant::DOUBLE:
+                               lo_message_add_string(reply, _("DOUBLE"));
+                               break;
+                       case ARDOUR::Variant::FLOAT:
+                               lo_message_add_string(reply, _("FLOAT"));
+                               break;
+                       case ARDOUR::Variant::INT:
+                               lo_message_add_string(reply, _("INT"));
+                               break;
+                       case ARDOUR::Variant::LONG:
+                               lo_message_add_string(reply, _("LONG"));
+                               break;
+                       case ARDOUR::Variant::NOTHING:
+                               lo_message_add_string(reply, _("NOTHING"));
+                               break;
+                       case ARDOUR::Variant::PATH:
+                               lo_message_add_string(reply, _("PATH"));
+                               break;
+                       case ARDOUR::Variant::STRING:
+                               lo_message_add_string(reply, _("STRING"));
+                               break;
+                       case ARDOUR::Variant::URI:
+                               lo_message_add_string(reply, _("URI"));
+                               break;
+                       default:
+                               lo_message_add_string(reply, _("UNKNOWN"));
+                               break;
+               }
+
+               lo_message_add_float (reply, pd.lower);
+               lo_message_add_float (reply, pd.upper);
+               lo_message_add_string (reply, pd.print_fmt.c_str());
+               if ( pd.scale_points ) {
+                       lo_message_add_int32 (reply, pd.scale_points->size());
+                       for ( ARDOUR::ScalePoints::const_iterator i = pd.scale_points->begin(); i != pd.scale_points->end(); ++i) {
+                               lo_message_add_int32 (reply, i->second);
+                               lo_message_add_string (reply, ((std::string)i->first).c_str());
                        }
+               } else {
+                       lo_message_add_int32 (reply, 0);
+               }
+               if ( c ) {
+                       lo_message_add_double (reply, c->get_value());
+               } else {
+                       lo_message_add_double (reply, 0);
                }
        }