diff options
author | Len Ovens <len@ovenwerks.net> | 2018-06-29 14:47:34 -0700 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2018-06-30 15:25:17 -0700 |
commit | 6e082b16b276ba648cc542ffe383e4a9b9c12bb8 (patch) | |
tree | 4e9618d7dd2ea7bf7c0f3b5e1288bcc6645c2666 /libs/surfaces/osc | |
parent | baa00942a20856cf332f547086ed5ebd2ff9078e (diff) |
OSC: Add collect of groups or subgroups
Diffstat (limited to 'libs/surfaces/osc')
-rw-r--r-- | libs/surfaces/osc/osc.cc | 181 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 4 |
2 files changed, 121 insertions, 64 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index a7daaca847..bf673981d8 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -586,8 +586,6 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, X_("/select/db_delta"), "f", sel_dB_delta); REGISTER_CALLBACK (serv, X_("/select/trimdB"), "f", sel_trim); REGISTER_CALLBACK (serv, X_("/select/hide"), "i", sel_hide); - REGISTER_CALLBACK (serv, X_("/select/bus/only"), "f", sel_bus_only); - REGISTER_CALLBACK (serv, X_("/select/bus/only"), "", sel_bus_only); REGISTER_CALLBACK (serv, X_("/select/previous"), "f", sel_previous); REGISTER_CALLBACK (serv, X_("/select/previous"), "", sel_previous); REGISTER_CALLBACK (serv, X_("/select/next"), "f", sel_next); @@ -836,6 +834,10 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_ ret = touch_detect (path, types, argv, argc, msg); } else + if (strstr (path, X_("/collect"))) { + ret = collect (path, types, argv, argc, msg); + + } else if (len >= 17 && !strcmp (&path[len-15], X_("/#current_value"))) { current_value_query (path, len, argv, argc, msg); ret = 0; @@ -2609,22 +2611,7 @@ OSC::parse_sel_group (const char *path, const char* types, lo_arg **argv, int ar value = (uint32_t) argv[0]->i; } } - if (!strncmp (path, X_("/select/group/only"), 18)) { - if (!rg) { - return ret; - } - if ((argc == 1 && value) || !argc) { - // fill sur->strips with routes from this group and hit bank1 - sur->temp_mode = GroupOnly; - sur->temp_master = sur->select; - ret = set_temp_mode (get_address (msg)); - set_bank (1, msg); - } else { - // key off is ignored - ret = 0; - } - } - else if (!strncmp (path, X_("/select/group/enable"), 20)) { + if (!strncmp (path, X_("/select/group/enable"), 20)) { if (rg) { if (argc == 1) { rg->set_active (value, this); @@ -2785,29 +2772,6 @@ OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc } } - else if (!strncmp (path, X_("/select/vca/only"), 16)) { - if (argc == 1) { - if (types[0] == 'f') { - ivalue = (uint32_t) argv[0]->f; - } else if (types[0] == 'i') { - ivalue = (uint32_t) argv[0]->i; - } - } - boost::shared_ptr<VCA> vca = boost::dynamic_pointer_cast<VCA> (s); - if (vca) { - if ((argc == 1 && ivalue) || !argc) { - sur->temp_mode = VCAOnly; - sur->temp_master = sur->select; - ret = set_temp_mode (get_address (msg)); - set_bank (1, msg); - } else { - // key off is ignored - ret = 0; - } - } else { - PBD::warning << "OSC: Select is not a VCA right now" << endmsg; - } - } } return ret; } @@ -2830,27 +2794,6 @@ OSC::get_vca_by_name (std::string vname) } int -OSC::sel_bus_only (lo_message msg) -{ - OSCSurface *sur = get_surface(get_address (msg)); - boost::shared_ptr<Stripable> s = sur->select; - if (s) { - boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s); - if (rt) { - if (!rt->is_track () && rt->can_solo ()) { - // this is a bus, but not master, monitor or audition - sur->temp_mode = BusOnly; - sur->temp_master = sur->select; - set_temp_mode (get_address (msg)); - set_bank (1, msg); - return 0; - } - } - } - return 1; -} - -int OSC::set_temp_mode (lo_address addr) { bool ret = 1; @@ -2869,6 +2812,22 @@ OSC::set_temp_mode (lo_address addr) boost::shared_ptr<Stripable> st = boost::dynamic_pointer_cast<Stripable> (r); sur->temp_strips.push_back(st); } + // check if this group feeds a bus or is slaved + boost::shared_ptr<Stripable> mstr = boost::shared_ptr<Stripable> (); + if (rg->has_control_master()) { + boost::shared_ptr<VCA> vca = session->vca_manager().vca_by_number (rg->group_master_number()); + if (vca) { + mstr = boost::dynamic_pointer_cast<Stripable> (vca); + } + } else if (rg->has_subgroup()) { + boost::shared_ptr<Route> sgr = rg->subgroup_bus().lock(); + if (sgr) { + mstr = boost::dynamic_pointer_cast<Stripable> (sgr); + } + } + if (mstr) { + sur->temp_strips.push_back(mstr); + } sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); sur->nstrips = sur->temp_strips.size(); LinkSet *set; @@ -3997,6 +3956,104 @@ OSC::fake_touch (boost::shared_ptr<ARDOUR::AutomationControl> ctrl) } int +OSC::collect (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg) +{ + /* + * collect should have the form of: + * /select/collect (may have i or f keypress/release) + * /strip/collect i (may have keypress and i may be inline) + */ + if (!session || argc > 1) return -1; + + int ret = 1; + OSCSurface *sur = get_surface(get_address (msg)); + boost::shared_ptr<Stripable> strp = boost::shared_ptr<Stripable>(); + uint32_t value = 0; + OSCTempMode new_mode = TempOff; + + if (argc) { + if (types[0] == 'f') { + value = (int)argv[0]->f; + } else { + value = argv[0]->i; + } + if (!value) { + // key release ignore + return 0; + } + } + + //parse path first to find stripable + if (!strncmp (path, X_("/strip/"), 7)) { + /* + * we don't know if value is press or ssid + * so we have to check if the last / has an int after it first + * if not then we use value + */ + uint32_t ssid = 0; + ssid = atoi (&(strrchr (path, '/' ))[1]); + if (!ssid) { + ssid = value; + } + strp = get_strip (ssid, get_address (msg)); + } else if (!strncmp (path, X_("/select/"), 8)) { + strp = sur->select; + } else { + return ret; + } + if (strp) { + boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (strp); + boost::shared_ptr<VCA> v = boost::dynamic_pointer_cast<VCA> (strp); + if (strstr (path, X_("/vca")) || v) { + //strp must be a VCA + if (v) { + new_mode = VCAOnly; + } else { + return ret; + } + } else + if (strstr (path, X_("/group"))) { + //strp must be in a group + if (rt) { + RouteGroup *rg = rt->route_group(); + if (rg) { + new_mode = GroupOnly; + } else { + return ret; + } + } + } else + if (strstr (path, X_("/bus"))) { + //strp must be a bus with either sends or no inputs + if (rt) { + if (!rt->is_track () && rt->can_solo ()) { + new_mode = BusOnly; + } + } + } else { + // decide by auto + // vca should never get here + if (rt->is_track ()) { + if (rt->route_group()) { + new_mode = GroupOnly; + } + } else if (!rt->is_track () && rt->can_solo ()) { + new_mode = BusOnly; + } + } + if (new_mode) { + sur->temp_mode = new_mode; + sur->temp_master = strp; + set_temp_mode (get_address (msg)); + set_bank (1, msg); + return 0; + } + + } + return ret; +} + +int OSC::route_mute (int ssid, int yn, lo_message msg) { if (!session) return -1; diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 28ff4da6b6..1999873677 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -326,6 +326,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int touch_detect (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); int fake_touch (boost::shared_ptr<ARDOUR::AutomationControl> ctrl); + int collect (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); + int route_get_sends (lo_message msg); int route_get_receives(lo_message msg); void routes_list (lo_message msg); @@ -378,7 +380,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> PATH_CALLBACK_MSG(route_get_receives); PATH_CALLBACK_MSG(routes_list); PATH_CALLBACK_MSG(group_list); - PATH_CALLBACK_MSG(sel_bus_only); PATH_CALLBACK_MSG(sel_previous); PATH_CALLBACK_MSG(sel_next); PATH_CALLBACK_MSG(surface_list); @@ -766,7 +767,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int sel_dB_delta (float delta, lo_message msg); int sel_trim (float val, lo_message msg); int sel_hide (uint32_t state, lo_message msg); - int sel_bus_only (lo_message msg); int sel_previous (lo_message msg); int sel_next (lo_message msg); int sel_delta (int delta, lo_message msg); |