diff options
author | Len Ovens <len@ovenwerks.net> | 2018-06-19 09:45:20 -0700 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2018-06-19 09:46:29 -0700 |
commit | 6edea6064eecbc732ee3018b50d17828c02aba02 (patch) | |
tree | 8cc69933ff440b34e498dd7b0b8040b46a26c901 | |
parent | 2fa49c51b27a128e1e545bced6f9c520c49a71cf (diff) |
OSC: reworking of previous/next select
-rw-r--r-- | libs/surfaces/osc/osc.cc | 252 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 2 |
2 files changed, 120 insertions, 134 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index b82c442957..8e7351e3f8 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -1737,7 +1737,6 @@ OSC::surface_parse (const char *path, const char* types, lo_arg **argv, int argc int se_page = sur->send_page_size; int fadermode = sur->gainmode; int feedback = sur->feedback.to_ulong(); - sur->feedback = 0; int strip_types = sur->strip_types.to_ulong(); int bank_size = sur->bank_size; int linkset = sur->linkset; @@ -1803,48 +1802,56 @@ OSC::surface_parse (const char *path, const char* types, lo_arg **argv, int argc } else { linkid = argv[8]->i; } + [[fallthrough]]; case 8: if (types[7] == 'f') { linkset = (int) argv[7]->f; } else { linkset = argv[7]->i; } + [[fallthrough]]; case 7: if (types[6] == 'f') { port = (int) argv[6]->f; } else { port = argv[6]->i; } + [[fallthrough]]; case 6: if (types[5] == 'f') { pi_page = (int) argv[5]->f; } else { pi_page = argv[5]->i; } + [[fallthrough]]; case 5: if (types[4] == 'f') { se_page = (int) argv[4]->f; } else { se_page = argv[4]->i; } + [[fallthrough]]; case 4: if (types[3] == 'f') { fadermode = (int) argv[3]->f; } else { fadermode = argv[3]->i; } + [[fallthrough]]; case 3: if (types[2] == 'f') { feedback = (int) argv[2]->f; } else { feedback = argv[2]->i; } + [[fallthrough]]; case 2: if (types[1] == 'f') { strip_types = (int) argv[1]->f; } else { strip_types = argv[1]->i; } + [[fallthrough]]; case 1: if (types[0] == 'f') { bank_size = (int) argv[0]->f; @@ -2001,6 +2008,7 @@ OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, ui // set bank and strip feedback strip_feedback(s, true); _set_bank (1, get_address (msg)); + _strip_select (boost::shared_ptr<Stripable> (), get_address (msg)); } global_feedback (s); @@ -2046,9 +2054,10 @@ OSC::set_surface_strip_types (uint32_t st, lo_message msg) if (s->linkset) { link_strip_types (s->linkset, st); } - // set bank and strip feedback - _set_bank (1, get_address (msg)); + strip_feedback(s, false); + set_bank (1, msg); + _strip_select (boost::shared_ptr<Stripable> (), get_address (msg)); return 0; } @@ -2613,27 +2622,9 @@ OSC::parse_sel_group (const char *path, const char* types, lo_arg **argv, int ar } if ((argc == 1 && value) || !argc) { // fill sur->strips with routes from this group and hit bank1 - sur->temp_strips.clear(); - boost::shared_ptr<RouteList> rl = rg->route_list(); - for (RouteList::iterator it = rl->begin(); it != rl->end(); ++it) { - boost::shared_ptr<Route> r = *it; - boost::shared_ptr<Stripable> s = boost::dynamic_pointer_cast<Stripable> (r); - sur->temp_strips.push_back(s); - } sur->temp_mode = GroupOnly; - sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); - sur->nstrips = sur->custom_strips.size(); - LinkSet *set; - uint32_t ls = sur->linkset; - if (ls) { - set = &(link_sets[ls]); - set->temp_mode = GroupOnly; - set->temp_strips.clear (); - set->temp_strips = sur->temp_strips; - set->strips = sur->strips; - } + ret = set_temp_mode (get_address (msg)); set_bank (1, msg); - ret = 0; } else { // key off is ignored ret = 0; @@ -2791,30 +2782,9 @@ OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc boost::shared_ptr<VCA> vca = boost::dynamic_pointer_cast<VCA> (s); if (vca) { if ((argc == 1 && ivalue) || !argc) { - sur->temp_strips.clear(); - StripableList stripables; - session->get_stripables (stripables); - for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) { - boost::shared_ptr<Stripable> st = *it; - if (st->slaved_to (vca)) { - sur->temp_strips.push_back(st); - } - } - sur->temp_strips.push_back(s); sur->temp_mode = VCAOnly; - sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); - sur->nstrips = sur->custom_strips.size(); - LinkSet *set; - uint32_t ls = sur->linkset; - if (ls) { - set = &(link_sets[ls]); - set->temp_mode = VCAOnly; - set->temp_strips.clear (); - set->temp_strips = sur->temp_strips; - set->strips = sur->strips; - } + ret = set_temp_mode (get_address (msg)); set_bank (1, msg); - ret = 0; } else { // key off is ignored ret = 0; @@ -2847,49 +2817,122 @@ OSC::get_vca_by_name (std::string vname) int OSC::sel_bus_only (lo_message msg) { - return _sel_bus_only (get_address (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; + set_temp_mode (get_address (msg)); + set_bank (1, msg); + return 0; + } + } + } + return 1; } int -OSC::_sel_bus_only (lo_address addr) +OSC::set_temp_mode (lo_address addr) { + bool ret = 1; OSCSurface *sur = get_surface(addr); 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 + if (sur->temp_mode == GroupOnly) { + boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s); + if (rt) { + RouteGroup *rg = rt->route_group(); + if (rg) { + sur->temp_strips.clear(); + boost::shared_ptr<RouteList> rl = rg->route_list(); + for (RouteList::iterator it = rl->begin(); it != rl->end(); ++it) { + boost::shared_ptr<Route> r = *it; + boost::shared_ptr<Stripable> st = boost::dynamic_pointer_cast<Stripable> (r); + sur->temp_strips.push_back(st); + } + sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); + sur->nstrips = sur->temp_strips.size(); + LinkSet *set; + uint32_t ls = sur->linkset; + if (ls) { + set = &(link_sets[ls]); + set->temp_mode = GroupOnly; + set->temp_strips.clear (); + set->temp_strips = sur->temp_strips; + set->strips = sur->strips; + } + ret = 0; + } + } + } else if (sur->temp_mode == VCAOnly) { + boost::shared_ptr<VCA> vca = boost::dynamic_pointer_cast<VCA> (s); + if (vca) { sur->temp_strips.clear(); StripableList stripables; session->get_stripables (stripables); for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) { boost::shared_ptr<Stripable> st = *it; - boost::shared_ptr<Route> ri = boost::dynamic_pointer_cast<Route> (st); - bool sends = true; - if (ri && ri->direct_feeds_according_to_graph (rt, &sends)) { + if (st->slaved_to (vca)) { sur->temp_strips.push_back(st); } } sur->temp_strips.push_back(s); - sur->temp_mode = BusOnly; sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); - sur->nstrips = sur->custom_strips.size(); + sur->nstrips = sur->temp_strips.size(); LinkSet *set; uint32_t ls = sur->linkset; if (ls) { set = &(link_sets[ls]); - set->temp_mode = BusOnly; + set->temp_mode = VCAOnly; set->temp_strips.clear (); set->temp_strips = sur->temp_strips; set->strips = sur->strips; } - _set_bank (1, addr); - return 0; + ret = 0; + } + } else if (sur->temp_mode == BusOnly) { + 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_strips.clear(); + StripableList stripables; + session->get_stripables (stripables); + for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) { + boost::shared_ptr<Stripable> st = *it; + boost::shared_ptr<Route> ri = boost::dynamic_pointer_cast<Route> (st); + bool sends = true; + if (ri && ri->direct_feeds_according_to_graph (rt, &sends)) { + sur->temp_strips.push_back(st); + } + } + sur->temp_strips.push_back(s); + sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); + sur->nstrips = sur->temp_strips.size(); + LinkSet *set; + uint32_t ls = sur->linkset; + if (ls) { + set = &(link_sets[ls]); + set->temp_mode = BusOnly; + set->temp_strips.clear (); + set->temp_strips = sur->temp_strips; + set->strips = sur->strips; + } + ret = 0; + } } + } else if (sur->temp_mode == TempOff) { + sur->temp_mode = TempOff; + ret = 0; } } - return 1; + if (ret) { + sur->temp_mode = TempOff; + } + return ret; } boost::shared_ptr<Send> @@ -4464,8 +4507,8 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr) boost::weak_ptr<Stripable> o_expand = sur->expand_strip; boost::shared_ptr<Stripable> old_expand= o_expand.lock (); + // we got a null strip check that old strips are valid if (!s) { - // we got a null strip check that old strips are valid if (old_expand && sur->expand_enable) { sur->expand = get_sid (old_expand, addr); if (sur->strip_types[11] || sur->expand) { @@ -4487,12 +4530,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr) } if (s != old_sel) { sur->select = s; - -/* - return parse_sel_group ("/select/group/only", "", lo_message_get_argv (msg), 0, msg); - return parse_sel_vca ("/select/vca/only", "", lo_message_get_argv (msg), 0, msg); - return sel_bus_only (msg); -*/ } bool sends; uint32_t nsends = 0; @@ -4516,6 +4553,13 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr) sur->sel_obs = sel_fb; } sur->sel_obs->set_expand (sur->expand_enable); + } else { + if (so != 0) { + delete so; + sur->sel_obs = 0; + } + } + if (sur->feedback[0] || sur->feedback[1]) { uint32_t obs_expand = 0; if (sur->expand_enable) { sur->expand = get_sid (s, addr); @@ -4526,74 +4570,15 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr) for (uint32_t i = 0; i < sur->observers.size(); i++) { sur->observers[i]->set_expand (obs_expand); } - } else { - if (so != 0) { - delete so; - sur->sel_obs = 0; - } } if (s != old_sel) { - sur->select = s; - if (sur->temp_mode == GroupOnly) { - boost::shared_ptr<Route> ort = boost::dynamic_pointer_cast<Route> (old_sel); - bool grp_ok = false; - if (ort) { - RouteGroup *org = ort->route_group(); - boost::shared_ptr<Route> nrt = boost::dynamic_pointer_cast<Route> (s); - if (nrt) { - RouteGroup *nrg = nrt->route_group(); - if (nrg == org) { - grp_ok = true; - } - } - } - if (!grp_ok) { - sur->temp_mode = TempOff; - _set_bank (1, addr); - } - } else if (sur->temp_mode == VCAOnly) { - boost::shared_ptr<VCA> vca = boost::dynamic_pointer_cast<VCA> (s); - if (vca) { - sur->temp_strips.clear(); - StripableList stripables; - session->get_stripables (stripables); - for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) { - boost::shared_ptr<Stripable> st = *it; - if (st->slaved_to (vca)) { - sur->temp_strips.push_back(st); - } - } - sur->temp_strips.push_back(s); - sur->strips = get_sorted_stripables(sur->strip_types, sur->cue, 1, sur->temp_strips); - sur->nstrips = sur->custom_strips.size(); - LinkSet *set; - uint32_t ls = sur->linkset; - if (ls) { - set = &(link_sets[ls]); - set->temp_mode = VCAOnly; - set->temp_strips.clear (); - set->temp_strips = sur->temp_strips; - set->strips = sur->strips; - } - _set_bank (1, addr); - } - } else if (sur->temp_mode == BusOnly) { - boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s); - if (rt) { - if (!rt->is_track () && rt->can_solo ()) { - _sel_bus_only (addr); - } - } else { - sur->temp_mode = TempOff; - _set_bank (1, addr); + if (sur->temp_mode) { + set_temp_mode (addr); + if (sur->temp_mode > GroupOnly) { + sur->bank = 1; + strip_feedback (sur, false); } } - -/* - return parse_sel_group ("/select/group/only", "", lo_message_get_argv (msg), 0, msg); - return parse_sel_vca ("/select/vca/only", "", lo_message_get_argv (msg), 0, msg); - return sel_bus_only (msg); -*/ } // need to set monitor for processor changed signal (for paging) string address = lo_address_get_url (addr); @@ -4699,20 +4684,21 @@ OSC::sel_delta (int delta, lo_message msg) return -1; } boost::shared_ptr<Stripable> new_sel = boost::shared_ptr<Stripable> (); - if (nstps == 1) { - new_sel = sel_strips[0]; - } boost::weak_ptr<Stripable> o_sel = sur->select; boost::shared_ptr<Stripable> old_sel= o_sel.lock (); for (uint32_t i = 0; i < nstps; i++) { if (old_sel == sel_strips[i]) { if (i && delta < 0) { + // i is > 0 and delta is -1 new_sel = sel_strips[i - 1]; } else if ((i + 1) < nstps && delta > 0) { + // i is at least 1 less than greatest and delta = 1 new_sel = sel_strips[i + 1]; } else if ((i + 1) >= nstps && delta > 0) { + // i is greatest strip and delta 1 new_sel = sel_strips[0]; } else if (!i && delta < 0) { + // i = 0 and delta -1 new_sel = sel_strips[nstps - 1]; } else { // should not happen diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index fb721f2b1c..58b7a2eaaa 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -766,7 +766,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> 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_bus_only (lo_address addr); int sel_previous (lo_message msg); int sel_next (lo_message msg); int sel_delta (int delta, lo_message msg); @@ -797,6 +796,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int sel_eq_freq (int id, float val, lo_message msg); int sel_eq_q (int id, float val, lo_message msg); int sel_eq_shape (int id, float val, lo_message msg); + int set_temp_mode (lo_address addr); int parse_sel_group (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); int parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); boost::shared_ptr<ARDOUR::VCA> get_vca_by_name (std::string vname); |