diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 9347486dd1..ef304b2d1c 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -2881,32 +2881,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) { @@ -2942,7 +2922,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; } @@ -4745,11 +4725,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 { @@ -4792,7 +4797,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, std::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 0a8b2a43b5..0d1faa59c3 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -74,9 +74,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); @@ -447,7 +447,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 (); } @@ -475,7 +475,7 @@ OSCSelectObserver::renew_plugin () { void OSCSelectObserver::plugin_init() { - if (plug_id < 0) { + if (!selected_piid) { plugin_end (); return; } @@ -486,12 +486,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, std::bind (&OSCSelectObserver::plug_enable, this, X_("/select/plugin/activate"), proc), &_osc); @@ -564,6 +566,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 9691d3fe53..0d3d77c705 100644 --- a/libs/surfaces/osc/osc_select_observer.h +++ b/libs/surfaces/osc/osc_select_observer.h @@ -92,7 +92,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;