// 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);
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);
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;
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;
}
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;
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;
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);
}
}