X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_ui.cc;h=0f2392108f25fcbe37b97d45ad430c48f60f8da7;hb=e125c7807027b31e2fd2fb48ea117bb769c5f678;hp=06940c1e34e29b7aa8447ceafb73e4cf63eda6f8;hpb=2e27e21d3a09889311e18a8efe11abcaa6d9c8b3;p=ardour.git diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 06940c1e34..0f2392108f 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -52,7 +52,11 @@ MidiControlUI::MidiControlUI (Session& s) MidiControlUI::~MidiControlUI () { + /* stop the thread */ + quit (); + /* drop all ports as GIO::Sources */ clear_ports (); + /* we no longer exist */ _instance = 0; } @@ -77,9 +81,10 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) if (ioc & IO_IN) { -#ifndef PLATFORM_WINDOWS - CrossThreadChannel::drain (port->selectable()); -#endif + AsyncMIDIPort* asp = dynamic_cast (port); + if (asp) { + asp->clear (); + } DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name())); framepos_t now = _session.engine().sample_time(); @@ -92,21 +97,11 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) void MidiControlUI::clear_ports () { - for (PortSources::iterator i = port_sources.begin(); i != port_sources.end(); ++i) { - g_source_destroy (*i); - g_source_unref (*i); - } - - port_sources.clear (); } void MidiControlUI::reset_ports () { - if (!port_sources.empty()) { - return; - } - vector ports; AsyncMIDIPort* p; @@ -118,25 +113,18 @@ MidiControlUI::reset_ports () if ((p = dynamic_cast (_session.mmc_input_port()))) { ports.push_back (p); } + + if ((p = dynamic_cast (_session.scene_input_port()))) { + ports.push_back (p); + } if (ports.empty()) { return; } - int fd; for (vector::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { - - if ((fd = (*pi)->selectable ()) >= 0) { - Glib::RefPtr psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR); - - psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); - psrc->attach (_main_loop->get_context()); - - // glibmm hack: for now, store only the GSource* - - port_sources.push_back (psrc->gobj()); - g_source_ref (psrc->gobj()); - } + (*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); + (*pi)->xthread().attach (_main_loop->get_context()); } }