change the way ControlProtocols (control surfaces) are notified and handle Stripable...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 12 May 2017 13:51:31 +0000 (14:51 +0100)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 12 May 2017 13:51:39 +0000 (14:51 +0100)
The Editor continues to notify them, but via a direct call to ControlProtocolManager, not a signal.
The CP Manager calls the ControlProtocol static method to set up static data structures holding
selection info for all surfaces and then notifies each surface/protocol that selection has changed.

23 files changed:
cfgtool/wscript
gtk2_ardour/editor_selection.cc
libs/ardour/ardour/control_protocol_manager.h
libs/ardour/control_protocol_manager.cc
libs/surfaces/cc121/cc121.cc
libs/surfaces/cc121/cc121.h
libs/surfaces/control_protocol/control_protocol.cc
libs/surfaces/control_protocol/control_protocol/control_protocol.h
libs/surfaces/faderport/faderport.cc
libs/surfaces/faderport/faderport.h
libs/surfaces/faderport8/faderport8.cc
libs/surfaces/faderport8/faderport8.h
libs/surfaces/generic_midi/generic_midi_control_protocol.h
libs/surfaces/mackie/mackie_control_protocol.cc
libs/surfaces/mackie/mackie_control_protocol.h
libs/surfaces/mackie/strip.cc
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/push2/push2.cc
libs/surfaces/push2/push2.h
libs/surfaces/push2/track_mix.cc
libs/surfaces/push2/track_mix.h
libs/surfaces/wiimote/wiimote.h

index 6f594ca7927bedb0af3b43e6a6023d1c9c769421..7fa076114ade56530ddae4d2e17b9724903987ec 100644 (file)
@@ -19,6 +19,6 @@ def build(bld):
     obj = bld (features = 'cxx c cxxprogram')
     obj.source       = 'cfgtool.cc'
     obj.target       = 'cfgtool'
-    obj.use          = [ 'libpbd', 'libardour' ]
+    obj.use          = [ 'libpbd', 'libardour', 'libardour_cp' ]
     obj.uselib       = [ 'GLIBMM', 'XML' ]
     obj.install_path = None
index c9e2ba49fdcc1f6f4d9c8aa3ac27aa043f6594e3..82c9020e9ae2bb8d882da68dbb4f5a5886ff2087 100644 (file)
@@ -23,6 +23,7 @@
 #include "pbd/stacktrace.h"
 #include "pbd/unwind.h"
 
+#include "ardour/control_protocol_manager.h"
 #include "ardour/midi_region.h"
 #include "ardour/playlist.h"
 #include "ardour/profile.h"
@@ -30,8 +31,6 @@
 #include "ardour/selection.h"
 #include "ardour/session.h"
 
-#include "control_protocol/control_protocol.h"
-
 #include "editor.h"
 #include "editor_drag.h"
 #include "editor_routes.h"
@@ -1090,7 +1089,7 @@ Editor::presentation_info_changed (PropertyChange const & what_changed)
 
                /* STEP 4: notify control protocols */
 
-               ControlProtocol::StripableSelectionChanged (stripables);
+               ControlProtocolManager::instance().stripable_selection_changed (stripables);
 
                if (sfbrowser && _session && !_session->deletion_in_progress()) {
                        uint32_t audio_track_cnt = 0;
index 2dddc30acac91b6e883dc8242127130e97023fb2..c8370e03a6f292851b690d8be43291f59433ca05 100644 (file)
@@ -27,6 +27,9 @@
 #include <glibmm/threads.h>
 
 #include "pbd/stateful.h"
+
+#include "control_protocol/types.h"
+
 #include "ardour/session_handle.h"
 
 namespace ARDOUR {
@@ -80,6 +83,8 @@ class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR
 
         PBD::Signal1<void,ControlProtocolInfo*> ProtocolStatusChange;
 
+        void stripable_selection_changed (ARDOUR::StripableNotificationListPtr);
+
   private:
        ControlProtocolManager ();
        static ControlProtocolManager* _instance;
index ba32ab8b70803c4b017ae1835aa0171846911214..338ea816f23a992d00bfb7b194aa80a8b14f3aa8 100644 (file)
@@ -557,3 +557,26 @@ ControlProtocolManager::register_request_buffer_factories ()
                }
        }
 }
+
+void
+ControlProtocolManager::stripable_selection_changed (StripableNotificationListPtr sp)
+{
+       /* this sets up the (static) data structures owned by ControlProtocol
+          that are "shared" across all control protocols.
+       */
+
+       DEBUG_TRACE (DEBUG::Selection, string_compose ("Surface manager: selection changed, now %1 stripables\n", sp ? sp->size() : -1));
+       ControlProtocol::notify_stripable_selection_changed (sp);
+
+       /* now give each protocol the chance to respond to the selection change
+        */
+
+       {
+               Glib::Threads::Mutex::Lock lm (protocols_lock);
+
+               for (list<ControlProtocol*>::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) {
+                       DEBUG_TRACE (DEBUG::Selection, string_compose ("selection change notification for surface \"%1\"\n", (*p)->name()));
+                       (*p)->stripable_selection_changed ();
+               }
+       }
+}
index 3f563db2512b8f3e4b40c6f1b279aed27ae70b65..19301b86b8f84148443e9cc399e588d0bafd1112 100644 (file)
@@ -115,8 +115,6 @@ CC121::CC121 (Session& s)
                );
 
 
-       StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&CC121::gui_track_selection_changed, this, _1), this);
-
        /* Catch port connections and disconnections */
        ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR, boost::bind (&CC121::connection_handler, this, _1, _2, _3, _4, _5), this);
        buttons.insert (std::make_pair (EButton, Button (*this, _("EButton"), EButton)));
@@ -1040,15 +1038,9 @@ CC121::Button::get_state () const
 }
 
 void
-CC121::gui_track_selection_changed (StripableNotificationListPtr stripables)
+CC121::stripable_selection_changed ()
 {
-       boost::shared_ptr<Stripable> r;
-
-       if (!stripables->empty()) {
-               r = stripables->front().lock();
-       }
-
-       set_current_stripable (r);
+       set_current_stripable (first_selected_stripable());
 }
 
 void
index a5f0363a224b98e4bbfe23e6f201b9c76cd99312..bef1000ee633c8114543e65c2c7883f4ea123984 100644 (file)
@@ -298,7 +298,7 @@ class CC121 : public ARDOUR::ControlProtocol, public AbstractUI<CC121Request> {
        void drop_current_stripable ();
        void use_master ();
        void use_monitor ();
-       void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr);
+       void stripable_selection_changed ();
        PBD::ScopedConnection selection_connection;
        PBD::ScopedConnectionList stripable_connections;
 
index edcc06b23a0596dfaa3156ee850161d5e942b8aa..c2589d24e3b3166834d0ebefea5995ad60231e16 100644 (file)
@@ -56,14 +56,10 @@ PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::Toggle
 PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::RemoveStripableFromSelection;
 PBD::Signal0<void>          ControlProtocol::ClearStripableSelection;
 
-PBD::Signal1<void,StripableNotificationListPtr> ControlProtocol::StripableSelectionChanged;
-
 Glib::Threads::Mutex ControlProtocol::special_stripable_mutex;
 boost::weak_ptr<Stripable> ControlProtocol::_first_selected_stripable;
 boost::weak_ptr<Stripable> ControlProtocol::_leftmost_mixer_stripable;
 StripableNotificationList ControlProtocol::_last_selected;
-bool ControlProtocol::selection_connected = false;
-PBD::ScopedConnection ControlProtocol::selection_connection;
 
 const std::string ControlProtocol::state_node_name ("Protocol");
 
@@ -72,12 +68,6 @@ ControlProtocol::ControlProtocol (Session& s, string str)
        , _name (str)
        , _active (false)
 {
-       if (!selection_connected) {
-               /* this is all static, connect it only once (and early), for all ControlProtocols */
-
-               StripableSelectionChanged.connect_same_thread (selection_connection, boost::bind (&ControlProtocol::stripable_selection_changed, _1));
-               selection_connected = true;
-       }
 }
 
 ControlProtocol::~ControlProtocol ()
@@ -374,7 +364,7 @@ ControlProtocol::set_first_selected_stripable (boost::shared_ptr<Stripable> s)
 }
 
 void
-ControlProtocol::stripable_selection_changed (StripableNotificationListPtr sp)
+ControlProtocol::notify_stripable_selection_changed (StripableNotificationListPtr sp)
 {
        bool had_selection = !_last_selected.empty();
 
index 987a8bcac4b88f1602b0bcf41cb1819645e0c00e..ff5cd314fa604e333e1882a23301d81d8b17a2b2 100644 (file)
@@ -57,6 +57,8 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
 
        virtual void midi_connectivity_established () {}
 
+       virtual void stripable_selection_changed () = 0;
+
        PBD::Signal0<void> ActiveChanged;
 
        /* signals that a control protocol can emit and other (presumably graphical)
@@ -85,13 +87,6 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
        static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > RemoveStripableFromSelection;
        static PBD::Signal0<void>          ClearStripableSelection;
 
-       /* signals that one UI (e.g. the GUI) can emit to get all other UI's to
-          respond. Typically this will always be GUI->"others" - the GUI pays
-          no attention to these signals.
-       */
-
-       static PBD::Signal1<void,StripableNotificationListPtr> StripableSelectionChanged;
-
        static boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable ();
        static void set_first_selected_stripable (boost::shared_ptr<ARDOUR::Stripable>);
 
@@ -146,6 +141,7 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
 
         static const std::string state_node_name;
         static StripableNotificationList const & last_selected() { return _last_selected; }
+        static void notify_stripable_selection_changed (StripableNotificationListPtr);
 
   protected:
        std::vector<boost::shared_ptr<ARDOUR::Route> > route_table;
@@ -158,14 +154,10 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
        LIBCONTROLCP_LOCAL ControlProtocol (const ControlProtocol&); /* noncopyable */
         bool _active;
 
-
         static Glib::Threads::Mutex special_stripable_mutex;
         static boost::weak_ptr<ARDOUR::Stripable> _leftmost_mixer_stripable;
         static boost::weak_ptr<ARDOUR::Stripable> _first_selected_stripable;
         static StripableNotificationList _last_selected;
-        static void stripable_selection_changed (StripableNotificationListPtr);
-        static bool selection_connected;
-        static PBD::ScopedConnection selection_connection;
 };
 
 extern "C" {
index 8fd8250c21ab6f19a0e664023802ee41d3345a58..9debc72f6faa9422d86f3663736bb276ab19988f 100644 (file)
@@ -108,9 +108,6 @@ FaderPort::FaderPort (Session& s)
                session->engine().make_port_name_non_relative (outp->name())
                );
 
-
-       StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::gui_track_selection_changed, this, _1), this);
-
        /* Catch port connections and disconnections */
        ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::connection_handler, this, _1, _2, _3, _4, _5), this);
 
@@ -1105,7 +1102,7 @@ FaderPort::Button::get_state () const
 }
 
 void
-FaderPort::gui_track_selection_changed (StripableNotificationListPtr stripables)
+FaderPort::stripable_selection_changed ()
 {
        set_current_stripable (ControlProtocol::first_selected_stripable());
 }
index dc9327da2c0d642268a779c0e5f7d003a0227648..56b8ebfbfd14dfb4e03f238c74f1270f7b4bf1cf 100644 (file)
@@ -298,7 +298,7 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
        void drop_current_stripable ();
        void use_master ();
        void use_monitor ();
-       void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr);
+       void stripable_selection_changed ();
        PBD::ScopedConnection selection_connection;
        PBD::ScopedConnectionList stripable_connections;
 
index 03b0237ce1a91f03fc6a85341a575b311f8b0c07..ce9dbffe872d14526a07fb4b4e83910ef89999d7 100644 (file)
@@ -128,8 +128,6 @@ FaderPort8::FaderPort8 (Session& s)
        ARDOUR::AudioEngine::instance()->Stopped.connect (port_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::engine_reset, this), this);
        ARDOUR::Port::PortDrop.connect (port_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::engine_reset, this), this);
 
-       StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort8::notify_gui_track_selection_changed, this), this);
-
        /* bind button events to call libardour actions */
        setup_actions ();
 
@@ -1363,7 +1361,7 @@ FaderPort8::assign_strips (bool reset_bank)
                case ModeTrack:
                case ModePan:
                        assign_stripables ();
-                       notify_gui_track_selection_changed (); // update selection, automation-state
+                       stripable_selection_changed (); // update selection, automation-state
                        break;
                case ModePlugins:
                        if (_proc_params.size() > 0) {
@@ -1427,7 +1425,7 @@ FaderPort8::select_strip (boost::weak_ptr<Stripable> ws)
        }
        if (s->is_selected () && s != first_selected_stripable ()) {
                set_first_selected_stripable (s);
-               notify_gui_track_selection_changed ();
+               stripable_selection_changed ();
        } else {
                ToggleStripableSelection (s);
        }
@@ -1538,7 +1536,7 @@ FaderPort8::notify_stripable_property_changed (boost::weak_ptr<Stripable> ws, co
 }
 
 void
-FaderPort8::notify_gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr*/)
+FaderPort8::stripable_selection_changed ()
 {
        if (!_device_active) {
                /* this can be called anytime from the static
index aa1fb8a1fc666b05efd693675c3a91bd538528bd..06556b4ccd6608ab81fe186d20120ed4fa2dcb9c 100644 (file)
@@ -181,7 +181,7 @@ private:
 
        void notify_pi_property_changed (const PBD::PropertyChange&);
        void notify_stripable_property_changed (boost::weak_ptr<ARDOUR::Stripable>, const PBD::PropertyChange&);
-       void notify_gui_track_selection_changed ();
+       void stripable_selection_changed ();
 
        PBD::ScopedConnection selection_connection;
        PBD::ScopedConnectionList automation_state_connections;
index 291262c820f2e2fcfb87e6ba9f4cf4e196fa26ac..6585c7ea2440a3bf8636ed2ba9cc53c37e62063b 100644 (file)
@@ -55,6 +55,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
        int set_active (bool yn);
        static bool probe() { return true; }
 
+       void stripable_selection_changed () {}
+
        std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
 
        boost::shared_ptr<ARDOUR::Port> input_port () const;
index e50d098882c54da60cdd291a0ea030d9d9785909..0cee0e523b69cd46dd3914df7555b249dc7a7737 100644 (file)
@@ -2369,10 +2369,11 @@ MackieControlProtocol::is_mapped (boost::shared_ptr<Stripable> r) const
 }
 
 void
-MackieControlProtocol::update_selected (boost::shared_ptr<Stripable> s, bool became_selected)
+MackieControlProtocol::stripable_selection_changed ()
 {
-       if (became_selected) {
+       boost::shared_ptr<Stripable> s = first_selected_stripable ();
 
+       if (s) {
                check_fader_automation_state ();
 
                /* It is possible that first_selected_route() may return null if we
@@ -2382,7 +2383,7 @@ MackieControlProtocol::update_selected (boost::shared_ptr<Stripable> s, bool bec
                 * set_subview_mode() will fail, and we will reset to None.
                 */
 
-               if (set_subview_mode (_subview_mode, first_selected_stripable())) {
+               if (set_subview_mode (_subview_mode, s)) {
                        set_subview_mode (None, boost::shared_ptr<Stripable>());
                }
 
index 2c649a179a9223649feda1650e7881dda33d62b7..9172716fe23d642f6cca489693a76fb333ef3055 100644 (file)
@@ -140,7 +140,6 @@ class MackieControlProtocol
        bool is_midi_track (boost::shared_ptr<ARDOUR::Stripable>) const;
        bool is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
        boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable () const;
-       void update_selected (boost::shared_ptr<ARDOUR::Stripable>, bool selected);
 
        void check_fader_automation_state ();
        void update_fader_automation_state ();
@@ -360,8 +359,7 @@ class MackieControlProtocol
        void clear_surfaces ();
        void force_special_stripable_to_strip (boost::shared_ptr<ARDOUR::Stripable> r, uint32_t surface, uint32_t strip_number);
        void build_button_map ();
-       void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr, bool save_list);
-       void _gui_track_selection_changed (ARDOUR::StripableNotificationList*, bool save_list, bool gui_did_change);
+       void stripable_selection_changed ();
        int ipmidi_restart ();
         void initialize ();
         int set_device_info (const std::string& device_name);
index 61cb64ce9bfb7a8aa7fe1d23eb86ac9a9217d6ac..1ec72d501cce2b2cbc9e71a7a0d8a6965ceda791 100644 (file)
@@ -381,7 +381,6 @@ Strip::notify_property_changed (const PropertyChange& what_changed)
        if (what_changed.contains (ARDOUR::Properties::selected)) {
                if (_stripable) {
                        _surface->write (_select->set_state (_stripable->is_selected()));
-                       _surface->mcp().update_selected (_stripable, _stripable->is_selected());
                }
        }
 }
index 58ed86104c821214e3ddb490994040b7be4748a3..9d422eea6f7d74d947f2649965d49e3eedd8781f 100644 (file)
@@ -245,9 +245,6 @@ OSC::start ()
        periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &OSC::periodic));
        periodic_timeout->attach (main_loop()->get_context());
 
-       // catch changes to selection for GUI_select mode
-       StripableSelectionChanged.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this), this);
-
        // catch track reordering
        // receive routes added
        session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::notify_routes_added, this, _1), this);
index da4dca3fbe8b5d9e59a2c5cf2db225fb40c56da9..eeadcf2c6c80fc4e39501d5e25d793371b7239a4 100644 (file)
@@ -77,6 +77,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        XMLNode& get_state ();
        int set_state (const XMLNode&, int version);
 
+       void stripable_selection_changed () {}
+
        bool has_editor () const { return true; }
        void* get_gui () const;
        void  tear_down_gui ();
index 30b521686cfdc80bb21cfe1f4a41c35ee580b1f7..00c7ef43d291ac7cdc1273b3a304849b5fcec8a7 100644 (file)
@@ -107,8 +107,6 @@ Push2::Push2 (ARDOUR::Session& s)
        /* master cannot be removed, so no need to connect to going-away signal */
        master = session->master_out ();
 
-       ControlProtocol::StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&Push2::stripable_selection_change, this, _1), this);
-
        /* allocate graphics layouts, even though we're not using them yet */
 
        _canvas = new Push2Canvas (*this, 960, 160);
@@ -138,7 +136,6 @@ Push2::~Push2 ()
        DEBUG_TRACE (DEBUG::Push2, "push2 control surface object being destroyed\n");
 
        /* do this before stopping the event loop, so that we don't get any notifications */
-       selection_connection.disconnect ();
        port_reg_connection.disconnect ();
        port_connection.disconnect ();
 
@@ -200,10 +197,7 @@ Push2::begin_using_device ()
        splash ();
 
        /* catch current selection, if any so that we can wire up the pads if appropriate */
-       {
-               StripableNotificationListPtr sp (new StripableNotificationList (ControlProtocol::last_selected()));
-               stripable_selection_change (sp);
-       }
+       stripable_selection_changed ();
 
        request_pressure_mode ();
 
@@ -1525,15 +1519,16 @@ Push2::current_layout () const
 }
 
 void
-Push2::stripable_selection_change (StripableNotificationListPtr selected)
+Push2::stripable_selection_changed ()
 {
        boost::shared_ptr<MidiPort> pad_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in)->shadow_port();
        boost::shared_ptr<MidiTrack> current_midi_track = current_pad_target.lock();
        boost::shared_ptr<MidiTrack> new_pad_target;
+       StripableNotificationList const & selected (last_selected());
 
        /* See if there's a MIDI track selected */
 
-       for (StripableNotificationList::iterator si = selected->begin(); si != selected->end(); ++si) {
+       for (StripableNotificationList::const_iterator si = selected.begin(); si != selected.end(); ++si) {
 
                new_pad_target = boost::dynamic_pointer_cast<MidiTrack> ((*si).lock());
 
@@ -1582,6 +1577,10 @@ Push2::stripable_selection_change (StripableNotificationListPtr selected)
        }
 
        reset_pad_colors ();
+
+       TrackMixLayout* tml = dynamic_cast<TrackMixLayout*> (mix_layout);
+       assert (tml);
+       tml->set_stripable (first_selected_stripable());
 }
 
 Push2::Button*
index bb34f7c016d6cef14163ff48f9f4f2e4814dda96..361801529acfa9299e1e9cb50d8daa6890a3d2ed 100644 (file)
@@ -569,8 +569,7 @@ class Push2 : public ARDOUR::ControlProtocol
 
        /* pad mapping */
 
-       PBD::ScopedConnection selection_connection;
-       void stripable_selection_change (ARDOUR::StripableNotificationListPtr);
+       void stripable_selection_changed ();
 
        MusicalMode::Type _mode;
        int _scale_root;
index aad94ec9dae5f94ae083b29a220645f7642b3e43..a04ac0af24d93658b7b7ad0e2efaafc8bd69fcec 100644 (file)
@@ -160,8 +160,6 @@ TrackMixLayout::TrackMixLayout (Push2& p, Session & s, std::string const & name)
        minsec_text->set_font_description (fd2);
        minsec_text->set_color (p2.get_color (Push2::LightBackground));
        minsec_text->set_position (Duple (10 + (4 * Push2Canvas::inter_button_spacing()), 90));
-
-       ControlProtocol::StripableSelectionChanged.connect (selection_connection, invalidator (*this), boost::bind (&TrackMixLayout::selection_changed, this), &p2);
 }
 
 TrackMixLayout::~TrackMixLayout ()
@@ -171,16 +169,6 @@ TrackMixLayout::~TrackMixLayout ()
        }
 }
 
-void
-TrackMixLayout::selection_changed ()
-{
-       boost::shared_ptr<Stripable> s = ControlProtocol::first_selected_stripable();
-
-       if (s) {
-               set_stripable (s);
-       }
-}
-
 void
 TrackMixLayout::show ()
 {
index 53c08ea2198b6887e6fd98a4bc1c4df7bb39e073..ba6aa49a0aa523e28bd6a7b4c97ac72e06c5a670 100644 (file)
@@ -85,8 +85,6 @@ class TrackMixLayout : public Push2Layout
        void stripable_property_change (PBD::PropertyChange const& what_changed);
        void simple_control_change (boost::shared_ptr<ARDOUR::AutomationControl> ac, Push2::ButtonID bid);
 
-       PBD::ScopedConnection selection_connection;
-       void selection_changed ();
        void show_state ();
 
        void drop_stripable ();
index c1fbcfd03f3f0e9e261ab5f8653f5a0c9c0969b5..23e9eedaa2e59b3d9a6769e708efd791c0d94eec 100644 (file)
@@ -55,6 +55,8 @@ public:
 
        void wiimote_callback (int mesg_count, union cwiid_mesg mesg[]);
 
+       void stripable_selection_changed () {}
+
 protected:
        void do_request (WiimoteControlUIRequest*);
        int start ();