From bfb22e2acc99a8398d18622da68d43a68d5a1fc6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 13 Jan 2024 16:18:32 +0100 Subject: [PATCH] Ctrl Surfaces: update bound controllables Note: this only affects surfaces that use mapped_controls, and do not already subscribe to processors_changed/RouteProcessorChange signal. --- libs/surfaces/console1/console1.cc | 2 ++ libs/surfaces/faderport8/faderport8.cc | 2 ++ .../generic_midi/generic_midi_control_protocol.cc | 3 ++- .../generic_midi/generic_midi_control_protocol.h | 2 +- libs/surfaces/generic_midi/midicontrollable.cc | 15 ++++++++++++++- libs/surfaces/generic_midi/midicontrollable.h | 4 ++++ libs/surfaces/osc/osc_select_observer.cc | 3 +++ libs/surfaces/us2400/strip.cc | 1 + 8 files changed, 29 insertions(+), 3 deletions(-) diff --git a/libs/surfaces/console1/console1.cc b/libs/surfaces/console1/console1.cc index b903d22457..498c19e7c6 100644 --- a/libs/surfaces/console1/console1.cc +++ b/libs/surfaces/console1/console1.cc @@ -545,6 +545,8 @@ Console1::set_current_stripable (std::shared_ptr r) if (_current_stripable) { DEBUG_TRACE (DEBUG::Console1, "current_stripable found: \n"); + r->MappedControlsChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Console1::set_current_stripable, this, r), this); + current_plugin_index = -1; PresentationInfo pi = _current_stripable->presentation_info (); diff --git a/libs/surfaces/faderport8/faderport8.cc b/libs/surfaces/faderport8/faderport8.cc index 5a6e95ffe3..55c9dc8e43 100644 --- a/libs/surfaces/faderport8/faderport8.cc +++ b/libs/surfaces/faderport8/faderport8.cc @@ -1459,6 +1459,8 @@ FaderPort8::select_plugin (int num) plugin->PresetLoaded.connect (processor_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::preset_changed, this), this); plugin->PresetDirty.connect (processor_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::preset_changed, this), this); + r->MappedControlsChanged.connect (processor_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::stripable_selection_changed, this), this); + if (_auto_pluginui) { pi->ShowUI (); /* EMIT SIGNAL */ } diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 99fe321535..6f4aff04c9 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -980,7 +980,7 @@ GenericMidiControlProtocol::reset_controllables () } std::shared_ptr -GenericMidiControlProtocol::lookup_controllable (const string & str) const +GenericMidiControlProtocol::lookup_controllable (const string & str, MIDIControllable& mc) const { std::shared_ptr c; @@ -1394,6 +1394,7 @@ GenericMidiControlProtocol::lookup_controllable (const string & str) const if (c) { DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("found controllable \"%1\"\n", c->name())); + mc.bind_remap (r); } else { DEBUG_TRACE (DEBUG::GenericMidi, "no controllable found\n"); } diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index 0e00925a2f..e2ae9267e1 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -82,7 +82,7 @@ public: int set_feedback (bool yn); bool get_feedback () const; - std::shared_ptr lookup_controllable (std::string const &) const; + std::shared_ptr lookup_controllable (std::string const &, MIDIControllable&) const; void maybe_start_touch (std::shared_ptr); diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index 43d07bf360..10005b535b 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -39,6 +39,7 @@ #include "ardour/automation_control.h" #include "ardour/midi_ui.h" #include "ardour/debug.h" +#include "ardour/stripable.h" #include "midicontrollable.h" #include "generic_midi_control_protocol.h" @@ -143,6 +144,7 @@ MIDIControllable::set_controllable (std::shared_ptr c) } else { _controllable.reset(); last_controllable_value = 0.0f; // is there a better value? + controllable_remapped_connection.disconnect (); } last_incoming = 256; @@ -152,6 +154,16 @@ MIDIControllable::set_controllable (std::shared_ptr c) } } +void +MIDIControllable::bind_remap (std::shared_ptr s) +{ + controllable_remapped_connection.disconnect (); + if (!s) { + return; + } + s->MappedControlsChanged.connect (controllable_remapped_connection, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::lookup_controllable, this), this); +} + void MIDIControllable::midi_rebind (channel_t c) { @@ -264,7 +276,8 @@ MIDIControllable::lookup_controllable() return -1; } - std::shared_ptr c = _surface->lookup_controllable (_current_uri); + controllable_remapped_connection.disconnect (); + std::shared_ptr c = _surface->lookup_controllable (_current_uri, *this); if (!c) { set_controllable (std::shared_ptr()); diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h index d429947f45..4d5e5a1655 100644 --- a/libs/surfaces/generic_midi/midicontrollable.h +++ b/libs/surfaces/generic_midi/midicontrollable.h @@ -43,6 +43,7 @@ class GenericMidiControlProtocol; namespace ARDOUR { class AsyncMIDIPort; + class Stripable; } class MIDIControllable : public PBD::Stateful @@ -114,6 +115,8 @@ public: int lookup_controllable(); + void bind_remap (std::shared_ptr); + private: int max_value_for_type () const; @@ -135,6 +138,7 @@ private: PBD::ScopedConnection midi_sense_connection[2]; PBD::ScopedConnection midi_learn_connection; PBD::ScopedConnection controllable_death_connection; + PBD::ScopedConnection controllable_remapped_connection; /** the type of MIDI message that is used for this control */ MIDI::eventType control_type; MIDI::byte control_additional; diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index ef29b34aba..0eaca44a7c 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -252,6 +252,9 @@ OSCSelectObserver::refresh_strip (std::shared_ptr new_strip, _strip->mapped_control (Comp_Makeup)->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_makeup"), _strip->mapped_control (Comp_Makeup)), OSC::instance()); change_message (X_("/select/comp_makeup"), _strip->mapped_control (Comp_Makeup)); } + + _strip->MappedControlsChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::eq_restart, this, 0), OSC::instance ()); + renew_sends (); renew_plugin (); eq_restart(0); diff --git a/libs/surfaces/us2400/strip.cc b/libs/surfaces/us2400/strip.cc index ab2d9383f6..0ff0a355b4 100644 --- a/libs/surfaces/us2400/strip.cc +++ b/libs/surfaces/us2400/strip.cc @@ -793,6 +793,7 @@ Strip::setup_trackview_vpot (std::shared_ptr r) return; } + r->MappedControlsChanged.connect (subview_connections, MISSING_INVALIDATOR, boost::bind (&Strip::subview_mode_changed, this), ui_context()); std::shared_ptr pc; std::shared_ptr track = std::dynamic_pointer_cast (r);