From 2206a60a100e63ef79c16b15fc41e3daf4db1795 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 27 Sep 2011 00:43:04 +0000 Subject: [PATCH] Fix crash on close after Mackie modifications by making it use AbstractUI so that invalidation of signals works properly. git-svn-id: svn://localhost/ardour2/branches/3.0@10138 d708f5d6-7413-0410-9779-e7cbd77b26cf --- .../mackie/mackie_control_protocol.cc | 29 +++++++++++++++++-- .../surfaces/mackie/mackie_control_protocol.h | 10 +++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 1a868b5a10..eb269ef87c 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -75,8 +75,12 @@ MackieMidiBuilder builder; #define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */ #define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__)) +extern PBD::EventLoop::InvalidationRecord* __invalidator (sigc::trackable& trackable, const char*, int); +#define invalidator(x) __invalidator ((x), __FILE__, __LINE__) + MackieControlProtocol::MackieControlProtocol (Session& session) : ControlProtocol (session, X_("Mackie"), MidiControlUI::instance()) + , AbstractUI ("mackie") , _current_initial_bank (0) , _surface (0) , _jog_wheel (*this) @@ -88,7 +92,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session) DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::MackieControlProtocol\n"); AudioEngine::instance()->PortConnectedOrDisconnected.connect ( - audio_engine_connections, MISSING_INVALIDATOR, ui_bind (&MackieControlProtocol::port_connected_or_disconnected, this, _2, _4, _5), + audio_engine_connections, invalidator (*this), ui_bind (&MackieControlProtocol::port_connected_or_disconnected, this, _2, _4, _5), midi_ui_context () ); } @@ -715,7 +719,7 @@ MackieControlProtocol::get_state() // add name of protocol XMLNode* node = new XMLNode (X_("Protocol")); - node->add_property (X_("name"), _name); + node->add_property (X_("name"), ARDOUR::ControlProtocol::_name); // add current bank ostringstream os; @@ -1696,3 +1700,24 @@ MackieControlProtocol::port_connected_or_disconnected (string a, string b, bool update_surface (); } } + +void +MackieControlProtocol::do_request (MackieControlUIRequest* req) +{ + if (req->type == CallSlot) { + + call_slot (MISSING_INVALIDATOR, req->the_slot); + + } else if (req->type == Quit) { + + stop (); + } +} + +int +MackieControlProtocol::stop () +{ + BaseUI::quit (); + + return 0; +} diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index beae926518..2399e099d2 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -68,8 +68,15 @@ namespace Mackie { the Route and encoded as the correct midi message. */ +struct MackieControlUIRequest : public BaseUI::BaseRequestObject { +public: + MackieControlUIRequest () {} + ~MackieControlUIRequest () {} +}; + class MackieControlProtocol : public ARDOUR::ControlProtocol + , public AbstractUI , public Mackie::MackieButtonHandler { public: @@ -306,6 +313,9 @@ class MackieControlProtocol boost::shared_ptr master_route(); Mackie::Strip & master_strip(); + void do_request (MackieControlUIRequest*); + int stop (); + private: void port_connected_or_disconnected (std::string, std::string, bool);