From b8b55ef0036bbef9a2961f03f44387ea8c89456a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 9 Dec 2009 18:37:06 +0000 Subject: OSC is now driven by an event loop; fix up lifetime mgmt of Glib::Source to workaround bug in Glib git-svn-id: svn://localhost/ardour2/branches/3.0@6329 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/midi_ui.h | 2 +- libs/ardour/control_protocol_manager.cc | 8 +------- libs/ardour/midi_ui.cc | 20 +++++++++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h index e1f322ddd1..2daec06774 100644 --- a/libs/ardour/ardour/midi_ui.h +++ b/libs/ardour/ardour/midi_ui.h @@ -38,7 +38,7 @@ class MidiControlUI : public AbstractUI void do_request (MidiUIRequest*); private: - typedef std::list > PortSources; + typedef std::list PortSources; PortSources port_sources; ARDOUR::Session& _session; diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index 724d60c389..e94829898a 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -121,6 +121,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi) return 0; } + Glib::Mutex::Lock lm (protocols_lock); control_protocols.push_back (cpi.protocol); @@ -152,13 +153,6 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) } else { cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl; } - - list::iterator p2 = find (control_protocol_info.begin(), control_protocol_info.end(), &cpi); - if (p2 != control_protocol_info.end()) { - control_protocol_info.erase (p2); - } else { - cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocol_info" << endl; - } } cpi.protocol = 0; diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 5a0640b3f6..ffcec00de7 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -64,6 +64,10 @@ MidiControlUI::do_request (MidiUIRequest* req) } else if (req->type == CallSlot) { req->the_slot (); + + } else if (req->type == Quit) { + + BaseUI::quit (); } } @@ -102,8 +106,8 @@ void MidiControlUI::clear_ports () { for (PortSources::iterator i = port_sources.begin(); i != port_sources.end(); ++i) { - /* remove existing sources from the event loop */ - (*i)->destroy (); + g_source_destroy (*i); + g_source_unref (*i); } port_sources.clear (); @@ -120,13 +124,15 @@ MidiControlUI::reset_ports () int fd; if ((fd = (*i)->selectable ()) >= 0) { Glib::RefPtr psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR); + psrc->connect (bind (mem_fun (*this, &MidiControlUI::midi_input_handler), (*i))); - port_sources.push_back (psrc); - } - } + psrc->attach (_main_loop->get_context()); - for (PortSources::iterator i = port_sources.begin(); i != port_sources.end(); ++i) { - (*i)->attach (_main_loop->get_context()); + // glibmm hack: for now, store only the GSource* + + port_sources.push_back (psrc->gobj()); + g_source_ref (psrc->gobj()); + } } } -- cgit v1.2.3