From 69752813db02634037734851f38922ff023cfafd Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Tue, 26 Jul 2016 14:11:06 -0700 Subject: [PATCH] OSC: Make sends work for MB. Add pan to /path/strip --- libs/surfaces/osc/osc.cc | 136 ++++++++++++----------- libs/surfaces/osc/osc.h | 13 +-- libs/surfaces/osc/osc_global_observer.cc | 12 +- libs/surfaces/osc/osc_route_observer.cc | 11 +- libs/surfaces/osc/osc_select_observer.cc | 23 ++-- 5 files changed, 95 insertions(+), 100 deletions(-) diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 71e0dd5538..a696ea884b 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -524,12 +524,12 @@ OSC::register_callbacks() // controls for "special" strips REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain); - REGISTER_CALLBACK (serv, "/master/fader", "i", master_set_fader); + REGISTER_CALLBACK (serv, "/master/fader", "f", master_set_fader); 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", "i", monitor_set_fader); + REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader); // Controls for the Selected strip REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable); @@ -585,7 +585,6 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter); // prints to cerr only REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print); - REGISTER_CALLBACK (serv, "/strip/send/gainabs", "iif", route_set_send_gain_abs); REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB); REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader); REGISTER_CALLBACK (serv, "/strip/send/enable", "iif", route_set_send_enable); @@ -895,6 +894,11 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_ route_set_trim_dB (ssid, argv[0]->f, msg); ret = 0; } + else if (!strncmp (path, "/strip/pan_stereo_position/", 27) && strlen (path) > 27) { + int ssid = atoi (&path[27]); + route_set_pan_stereo_position (ssid, argv[0]->f, msg); + ret = 0; + } else if (!strncmp (path, "/strip/mute/", 12) && strlen (path) > 12) { int ssid = atoi (&path[12]); route_mute (ssid, argv[0]->f == 1.0, msg); @@ -937,12 +941,17 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_ } else if (!strncmp (path, "/select/send_gain/", 18) && strlen (path) > 18) { int ssid = atoi (&path[18]); - route_mute (ssid, argv[0]->f == 1.0, msg); + sel_sendgain (ssid, argv[0]->f, msg); ret = 0; } else if (!strncmp (path, "/select/send_fader/", 19) && strlen (path) > 19) { int ssid = atoi (&path[19]); - route_solo (ssid, argv[0]->f == 1.0, msg); + sel_sendfader (ssid, argv[0]->f, msg); + ret = 0; + } + else if (!strncmp (path, "/select/send_enable/", 20) && strlen (path) > 20) { + int ssid = atoi (&path[20]); + sel_sendenable (ssid, argv[0]->f, msg); ret = 0; } else if (!strncmp (path, "/select/eq_gain/", 16) && strlen (path) > 16) { @@ -1324,14 +1333,14 @@ OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode) void OSC::notify_routes_added (ARDOUR::RouteList &) { - // not sure if we need this + // not sure if we need this PI change seems to cover //recalcbanks(); } void OSC::notify_vca_added (ARDOUR::VCAList &) { - // not sure if we need this + // not sure if we need this PI change seems to cover //recalcbanks(); } @@ -1594,16 +1603,12 @@ OSC::master_set_gain (float dB) } int -OSC::master_set_fader (uint32_t position) +OSC::master_set_fader (float position) { if (!session) return -1; boost::shared_ptr s = session->master_out(); if (s) { - if ((position > 799.5) && (position < 800.5)) { - s->gain_control()->set_value (1.0, PBD::Controllable::NoGroup); - } else { - s->gain_control()->set_value (slider_position_to_gain_with_max (((float)position/1023), 2.0), PBD::Controllable::NoGroup); - } + s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup); } return 0; } @@ -1679,16 +1684,12 @@ OSC::monitor_set_gain (float dB) } int -OSC::monitor_set_fader (uint32_t position) +OSC::monitor_set_fader (float position) { if (!session) return -1; boost::shared_ptr s = session->monitor_out(); if (s) { - if ((position > 799.5) && (position < 800.5)) { - s->gain_control()->set_value (1.0, PBD::Controllable::NoGroup); - } else { - s->gain_control()->set_value (slider_position_to_gain_with_max (((float)position/1023), 2.0), PBD::Controllable::NoGroup); - } + s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup); } return 0; } @@ -2220,11 +2221,7 @@ OSC::route_set_gain_fader (int ssid, float pos, lo_message msg) return -1; } int ret; - if ((pos > 799.5) && (pos < 800.5)) { - ret = route_set_gain_abs (ssid, 1.0, msg); - } else { - ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg); - } + ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max (pos, 2.0), msg); if (ret != 0) { return route_send_fail ("fader", ssid, 0, lo_message_get_source (msg)); } @@ -2243,11 +2240,7 @@ OSC::sel_fader (float val, lo_message msg) } if (s) { float abs; - if ((val > 799.5) && (val < 800.5)) { - abs = 1.0; - } else { - abs = slider_position_to_gain_with_max ((val/1023), 2.0); - } + abs = slider_position_to_gain_with_max (val, 2.0); if (s->gain_control()) { s->gain_control()->set_value (abs, PBD::Controllable::NoGroup); return 0; @@ -2376,48 +2369,59 @@ OSC::route_set_pan_stereo_width (int ssid, float pos, lo_message msg) } int -OSC::route_set_send_gain_abs (int ssid, int sid, float val, lo_message msg) +OSC::route_set_send_gain_dB (int ssid, int id, float val, lo_message msg) { if (!session) { return -1; } boost::shared_ptr s = get_strip (ssid, lo_message_get_source (msg)); - - if (!s) { - return -1; - } - - /* revert to zero-based counting */ - - if (sid > 0) { - --sid; - } - - if (s->send_level_controllable (sid)) { - s->send_level_controllable (sid)->set_value (val, PBD::Controllable::NoGroup); - return 0; + float abs; + if (s) { +#ifdef MIXBUS + abs = val; +#else + if (val < -192) { + abs = 0; + } else { + abs = dB_to_coefficient (val); + } + if (id > 0) { + --id; + } +#endif + if (s->send_level_controllable (id)) { + s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup); + return 0; + } } - - return -1; -} - -int -OSC::route_set_send_gain_dB (int ssid, int sid, float val, lo_message msg) -{ - return route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg); + return 0; } int -OSC::route_set_send_fader (int ssid, int sid, float pos, lo_message msg) +OSC::route_set_send_fader (int ssid, int id, float val, lo_message msg) { if (!session) { return -1; } - if ((pos > 799.5) && (pos < 800.5)) { - return route_set_send_gain_abs (ssid, sid, 1.0, msg); - } else { - return route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg); + boost::shared_ptr s = get_strip (ssid, lo_message_get_source (msg)); + float abs; + if (s) { + + if (id > 0) { + --id; + } + + if (s->send_level_controllable (id)) { +#ifdef MIXBUS + abs = s->send_level_control(id)->interface_to_internal (val); +#else + abs = slider_position_to_gain_with_max (val, 2.0); +#endif + s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup); + return 0; + } } + return 0; } int @@ -2432,6 +2436,9 @@ OSC::sel_sendgain (int id, float val, lo_message msg) } float abs; if (s) { +#ifdef MIXBUS + abs = val; +#else if (val < -192) { abs = 0; } else { @@ -2440,7 +2447,7 @@ OSC::sel_sendgain (int id, float val, lo_message msg) if (id > 0) { --id; } - +#endif if (s->send_level_controllable (id)) { s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup); return 0; @@ -2461,21 +2468,22 @@ OSC::sel_sendfader (int id, float val, lo_message msg) } float abs; if (s) { - if ((val > 799.5) && (val < 800.5)) { - abs = 1.0; - } else { - abs = slider_position_to_gain_with_max ((val/1023), 2.0); - } + if (id > 0) { --id; } if (s->send_level_controllable (id)) { +#ifdef MIXBUS + abs = s->send_level_control(id)->interface_to_internal (val); +#else + abs = slider_position_to_gain_with_max (val, 2.0); +#endif s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup); return 0; } } - return sel_send_fail ("send_gain", id, 0, lo_message_get_source (msg)); + return sel_send_fail ("send_fader", id, 0, lo_message_get_source (msg)); } int diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 005cac2b5f..a30d84ee04 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -108,7 +108,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI std::bitset<32> strip_types;// what strip types are a part of this bank uint32_t nstrips; // how many strips are there for strip_types std::bitset<32> feedback; // What is fed back? strips/meters/timecode/bar_beat/global - int gainmode; // what kind of faders do we have Gain db or position 0 to 1023? + int gainmode; // what kind of faders do we have Gain db or position 0 to 1? uint32_t expand; // Used by /select/select bool expand_enable; // use expand instead of select OSCSelectObserver* sel_obs; // So we can sync select feedback with selected channel @@ -301,11 +301,11 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI PATH_CALLBACK1(jump_by_bars,f,); PATH_CALLBACK1(jump_by_seconds,f,); PATH_CALLBACK1(master_set_gain,f,); - PATH_CALLBACK1(master_set_fader,i,); + PATH_CALLBACK1(master_set_fader,f,); PATH_CALLBACK1(master_set_trim,f,); PATH_CALLBACK1(master_set_mute,i,); PATH_CALLBACK1(monitor_set_gain,f,); - PATH_CALLBACK1(monitor_set_fader,i,); + PATH_CALLBACK1(monitor_set_fader,f,); #define PATH_CALLBACK1_MSG(name,arg1type) \ static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \ @@ -422,13 +422,11 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI PATH_CALLBACK2_MSG(strip_phase,i,i); PATH_CALLBACK2_MSG(strip_expand,i,i); PATH_CALLBACK2_MSG(strip_gui_select,i,i); - PATH_CALLBACK2_MSG(route_set_gain_abs,i,f); PATH_CALLBACK2_MSG(route_set_gain_dB,i,f); PATH_CALLBACK2_MSG(route_set_gain_fader,i,f); PATH_CALLBACK2_MSG(route_set_trim_dB,i,f); PATH_CALLBACK2_MSG(route_set_pan_stereo_position,i,f); PATH_CALLBACK2_MSG(route_set_pan_stereo_width,i,f); - PATH_CALLBACK3(route_set_send_gain_abs,i,i,f); PATH_CALLBACK3(route_set_send_gain_dB,i,i,f); PATH_CALLBACK3(route_set_send_fader,i,i,f); PATH_CALLBACK3(route_set_send_enable,i,i,f); @@ -454,7 +452,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI int route_set_trim_dB (int rid, float dB, lo_message msg); int route_set_pan_stereo_position (int rid, float left_right_fraction, lo_message msg); int route_set_pan_stereo_width (int rid, float percent, lo_message msg); - int route_set_send_gain_abs (int rid, int sid, float val, lo_message msg); int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg); int route_set_send_fader (int rid, int sid, float val, lo_message msg); int route_set_send_enable (int rid, int sid, float val, lo_message msg); @@ -473,12 +470,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI int set_surface_gainmode (uint32_t gm, lo_message msg); int master_set_gain (float dB); - int master_set_fader (uint32_t position); + int master_set_fader (float position); int master_set_trim (float dB); int master_set_pan_stereo_position (float position, lo_message msg); int master_set_mute (uint32_t state); int monitor_set_gain (float dB); - int monitor_set_fader (uint32_t position); + int monitor_set_fader (float position); int sel_recenable (uint32_t state, lo_message msg); int sel_recsafe (uint32_t state, lo_message msg); int sel_mute (uint32_t state, lo_message msg); diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc index 721cb0e66b..72928e310d 100644 --- a/libs/surfaces/osc/osc_global_observer.cc +++ b/libs/surfaces/osc/osc_global_observer.cc @@ -232,13 +232,13 @@ OSCGlobalObserver::tick () if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled // the only meter here is master float now_meter = session->master_out()->peak_meter()->meter_level(0, MeterMCP); - if (now_meter < -120) now_meter = -193; + if (now_meter < -94) now_meter = -193; if (_last_meter != now_meter) { if (feedback[7] || feedback[8]) { lo_message msg = lo_message_new (); if (gainmode && feedback[7]) { - uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05); - lo_message_add_int32 (msg, lev1023); + // change from db to 0-1 + lo_message_add_float (msg, ((now_meter + 94) / 100)); lo_send_message (addr, "/master/meter", msg); } else if ((!gainmode) && feedback[7]) { lo_message_add_float (msg, now_meter); @@ -287,11 +287,7 @@ OSCGlobalObserver::send_gain_message (string path, boost::shared_ptrget_value() == 1) { - lo_message_add_int32 (msg, 800); - } else { - lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023); - } + lo_message_add_float (msg, gain_to_slider_position (controllable->get_value())); } else { if (controllable->get_value() < 1e-15) { lo_message_add_float (msg, -200); diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index dc981534dc..7c9374aeb2 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -161,7 +161,7 @@ OSCRouteObserver::tick () } else { now_meter = -193; } - if (now_meter < -144) now_meter = -193; + if (now_meter < -120) now_meter = -193; if (_last_meter != now_meter) { if (feedback[7] || feedback[8]) { string path = "/strip/meter"; @@ -172,8 +172,7 @@ OSCRouteObserver::tick () lo_message_add_int32 (msg, ssid); } if (gainmode && feedback[7]) { - uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05); - lo_message_add_int32 (msg, lev1023); + lo_message_add_float (msg, ((now_meter + 94) / 100)); lo_send_message (addr, path.c_str(), msg); } else if ((!gainmode) && feedback[7]) { lo_message_add_float (msg, now_meter); @@ -327,11 +326,7 @@ OSCRouteObserver::send_gain_message (string path, boost::shared_ptrget_value() == 1) { - lo_message_add_int32 (msg, 800); - } else { - lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023); - } + lo_message_add_float (msg, gain_to_slider_position (controllable->get_value())); } else { if (controllable->get_value() < 1e-15) { lo_message_add_float (msg, -200); diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index 2a42f0346c..7f50c71106 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -302,8 +302,7 @@ OSCSelectObserver::tick () string path = "/select/meter"; lo_message msg = lo_message_new (); if (gainmode && feedback[7]) { - uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05); - lo_message_add_int32 (msg, lev1023); + lo_message_add_float (msg, ((now_meter + 94) / 100)); lo_send_message (addr, path.c_str(), msg); } else if ((!gainmode) && feedback[7]) { lo_message_add_float (msg, now_meter); @@ -439,17 +438,21 @@ OSCSelectObserver::gain_message (string path, boost::shared_ptr co lo_message msg = lo_message_new (); if (gainmode) { - if (controllable->get_value() == 1) { - lo_message_add_int32 (msg, 800); - } else { - lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023); - } +#ifdef MIXBUS + lo_message_add_float (msg, controllable->internal_to_interface (val)); +#else + lo_message_add_float (msg, gain_to_slider_position (controllable->get_value())); +#endif } else { +#ifdef MIXBUS + lo_message_add_float (msg, val); +#else if (controllable->get_value() < 1e-15) { lo_message_add_float (msg, -200); } else { lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value())); } +#endif } lo_send_message (addr, path.c_str(), msg); @@ -465,11 +468,7 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr if (gainmode) { path = "/select/send_fader"; - if (controllable->get_value() == 1) { - value = 800; - } else { - value = gain_to_slider_position (controllable->get_value()); - } + value = gain_to_slider_position (controllable->get_value()); } else { path = "/select/send_gain"; if (controllable->get_value() < 1e-15) { -- 2.30.2