diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 9eb60147f43..ac5ff8e6d6e 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -2883,32 +2883,12 @@ OSC::_sel_plugin (int id, lo_address addr) return 1; } - /* find out how many plugins we have */ - sur->plugins.clear(); - for (int nplugs = 0; true; ++nplugs) { - std::shared_ptr proc = r->nth_plugin (nplugs); - if (!proc) { - break; - } - if (!r->nth_plugin(nplugs)->display_to_user()) { - continue; - } -#ifdef MIXBUS - /* need to check for mixbus channel strips (and exclude them) */ - std::shared_ptr pi = std::dynamic_pointer_cast(proc); - if (pi && pi->is_channelstrip()) { - continue; - } -#endif - sur->plugins.push_back (nplugs); - } - // limit plugin_id to actual plugins if (sur->plugins.size() < 1) { sur->plugin_id = 0; sur->plug_page = 1; if (sur->sel_obs) { - sur->sel_obs->set_plugin_id(-1, 1); + sur->sel_obs->set_plugin_id(0, 1); } return 0; } else if (id < 1) { @@ -2944,7 +2924,7 @@ OSC::_sel_plugin (int id, lo_address addr) sur->plug_page = 1; if (sur->sel_obs) { - sur->sel_obs->set_plugin_id(sur->plugins[sur->plugin_id - 1], sur->plug_page); + sur->sel_obs->set_plugin_id(sur->plugin_id, sur->plug_page); } return 0; } @@ -4760,11 +4740,36 @@ OSC::_strip_select2 (std::shared_ptr s, OSCSurface *sur, lo_address a _select = s; } if (!s) { + sur->plugins.clear(); return 0; } if (s != old_sel) { sur->select = s; } + + /* Create list of user-visible plugins (into which piid indexes) */ + sur->plugins.clear(); + std::shared_ptr r = std::dynamic_pointer_cast(s); + if (r) { + for (int nplugs = 0; true; ++nplugs) { + std::shared_ptr proc = r->nth_plugin (nplugs); + if (!proc) { + break; + } + if (!r->nth_plugin(nplugs)->display_to_user()) { + continue; + } +#ifdef MIXBUS + /* need to check for mixbus channel strips (and exclude them) */ + std::shared_ptr pi = std::dynamic_pointer_cast(proc); + if (pi && pi->is_channelstrip()) { + continue; + } +#endif + sur->plugins.push_back (nplugs); + } + } + bool sends; uint32_t nsends = 0; do { @@ -4807,7 +4812,6 @@ OSC::_strip_select2 (std::shared_ptr s, OSCSurface *sur, lo_address a } // need to set monitor for processor changed signal (for paging) string address = lo_address_get_url (addr); - std::shared_ptr r = std::dynamic_pointer_cast(s); if (r) { r->processors_changed.connect (sur->proc_connection, MISSING_INVALIDATOR, boost::bind (&OSC::processor_changed, this, address), this); _sel_plugin (sur->plugin_id, addr); diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index a965b2f322c..686175f2348 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -77,9 +77,9 @@ OSCSelectObserver::OSCSelectObserver (OSC& o, ARDOUR::Session& s, ArdourSurface: plug_size = plug_page_size; plug_page = sur->plug_page; if (sur->plugins.size () > 0) { - plug_id = sur->plugins[sur->plugin_id - 1]; + selected_piid = sur->plugin_id; } else { - plug_id = -1; + selected_piid = 0; } _group_sharing[15] = 1; refresh_strip (sur->select, sur->nsends, gainmode, true); @@ -441,7 +441,7 @@ OSCSelectObserver::send_end () void OSCSelectObserver::set_plugin_id (int id, uint32_t page) { - plug_id = id; + selected_piid = id; plug_page = page; renew_plugin (); } @@ -469,7 +469,7 @@ OSCSelectObserver::renew_plugin () { void OSCSelectObserver::plugin_init() { - if (plug_id < 0) { + if (!selected_piid) { plugin_end (); return; } @@ -480,12 +480,14 @@ OSCSelectObserver::plugin_init() } // we have a plugin number now get the processor - std::shared_ptr proc = r->nth_plugin (plug_id); + std::shared_ptr proc = r->nth_plugin (sur->plugins[selected_piid - 1]); std::shared_ptr pi; if (!(pi = std::dynamic_pointer_cast(proc))) { plugin_end (); return; } + _osc.float_message (X_("/select/plugin"), selected_piid, addr); + std::shared_ptr pip = pi->plugin(); // we have a plugin we can ask if it is activated proc->ActiveChanged.connect (plugin_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::plug_enable, this, X_("/select/plugin/activate"), proc), OSC::instance()); @@ -558,6 +560,7 @@ void OSCSelectObserver::plugin_end () { plugin_connections.drop_connections (); + _osc.float_message (X_("/select/plugin"), 0, addr); _osc.float_message (X_("/select/plugin/activate"), 0, addr); _osc.text_message (X_("/select/plugin/name"), " ", addr); for (uint32_t i = 1; i <= plug_size; i++) { diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h index 171a985ddc6..30ff9978335 100644 --- a/libs/surfaces/osc/osc_select_observer.h +++ b/libs/surfaces/osc/osc_select_observer.h @@ -89,7 +89,7 @@ class OSCSelectObserver uint32_t nplug_params; uint32_t plug_page_size; uint32_t plug_page; - int plug_id; + uint32_t selected_piid; uint32_t plug_size; std::vector plug_params; int eq_bands;