13
0

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
This commit is contained in:
Carl Hetherington 2011-09-27 00:43:04 +00:00
parent daf5203f58
commit 2206a60a10
2 changed files with 37 additions and 2 deletions

View File

@ -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<MackieControlUIRequest> ("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;
}

View File

@ -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<MackieControlUIRequest>
, public Mackie::MackieButtonHandler
{
public:
@ -306,6 +313,9 @@ class MackieControlProtocol
boost::shared_ptr<ARDOUR::Route> master_route();
Mackie::Strip & master_strip();
void do_request (MackieControlUIRequest*);
int stop ();
private:
void port_connected_or_disconnected (std::string, std::string, bool);