diff options
author | Carl Hetherington <carl@carlh.net> | 2012-06-28 15:38:07 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-06-28 15:38:07 +0000 |
commit | b97a1bfb977e8afa0070fbe5a5dccff63ad82435 (patch) | |
tree | 21302b31f0c5aa8b7852841a1966c87a475d540d /libs/surfaces | |
parent | e09e185e3e08665db9299188d8f15fd3de733262 (diff) |
Connect to controllable->Destroyed in all cases; fixes crash on route removal.
git-svn-id: svn://localhost/ardour2/branches/3.0@12959 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/surfaces')
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.cc | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index f721e7fbbc..4be5e25b92 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -61,11 +61,12 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, bool MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, Controllable& c, bool m) : _surface (s) - , controllable (&c) , _descriptor (0) , _port (p) , _momentary (m) { + set_controllable (&c); + _learned = true; /* from controllable */ setting = false; last_value = 0; // got a better idea ? @@ -113,7 +114,19 @@ MIDIControllable::drop_external_control () void MIDIControllable::set_controllable (Controllable* c) { + if (c == controllable) { + return; + } + + controllable_death_connection.disconnect (); + controllable = c; + + if (controllable) { + controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR, + boost::bind (&MIDIControllable::drop_controllable, this), + MidiControlUI::instance()); + } } void @@ -199,10 +212,7 @@ MIDIControllable::lookup_controllable() return -1; } - controllable = c.get(); - controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR, - boost::bind (&MIDIControllable::drop_controllable, this), - MidiControlUI::instance()); + set_controllable (c.get ()); return 0; } @@ -210,9 +220,8 @@ MIDIControllable::lookup_controllable() void MIDIControllable::drop_controllable () { - cerr << "removed controllable\n"; - controllable_death_connection.disconnect (); - controllable = 0; + cerr << "removed controllable " << controllable << "\n"; + set_controllable (0); } void |