X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_ui.cc;h=1d2fe7c7e1b4a2b2b6fcdb02357c7f54a9231f2e;hb=18713b7d1fc4a1fcec0a60f2c80a327b50b9c529;hp=0d9ac1760150c54b7bc5e612dd34c7216d76d17a;hpb=616f2a0370a10dcc7372a95f6bca9f5a45698980;p=ardour.git diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 0d9ac17601..1d2fe7c7e1 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -22,11 +22,11 @@ #include "pbd/pthread_utils.h" -#include "midi++/manager.h" -#include "midi++/port.h" - +#include "ardour/async_midi_port.h" #include "ardour/debug.h" #include "ardour/audioengine.h" +#include "ardour/midi_port.h" +#include "ardour/midiport_manager.h" #include "ardour/midi_ui.h" #include "ardour/session.h" #include "ardour/session_event.h" @@ -39,64 +39,52 @@ using namespace Glib; #include "i18n.h" -BaseUI::RequestType MidiControlUI::PortChange = BaseUI::new_request_type(); MidiControlUI* MidiControlUI::_instance = 0; #include "pbd/abstract_ui.cc" /* instantiate the template */ MidiControlUI::MidiControlUI (Session& s) - : AbstractUI (X_("midiui")) + : AbstractUI (X_("midiUI")) , _session (s) { - MIDI::Manager::instance()->PortsChanged.connect_same_thread (rebind_connection, boost::bind (&MidiControlUI::change_midi_ports, this)); _instance = this; } MidiControlUI::~MidiControlUI () { + /* stop the thread */ + quit (); + /* drop all ports as GIO::Sources */ clear_ports (); + /* we no longer exist */ _instance = 0; } -void -MidiControlUI::do_request (MidiUIRequest* req) +void* +MidiControlUI::request_factory (uint32_t num_requests) { - if (req->type == PortChange) { - - /* restart event loop with new ports */ - DEBUG_TRACE (DEBUG::MidiIO, "reset ports\n"); - reset_ports (); - - } else if (req->type == CallSlot) { - -#ifndef NDEBUG - if (getenv ("DEBUG_THREADED_SIGNALS")) { - cerr << "MIDI UI calls a slot\n"; - } -#endif - - req->the_slot (); - - } else if (req->type == Quit) { - - BaseUI::quit (); - } + /* AbstractUI::request_buffer_factory() is a template method only + instantiated in this source module. To provide something visible for + use when registering the factory, we have this static method that is + template-free. + */ + return request_buffer_factory (num_requests); } void -MidiControlUI::change_midi_ports () +MidiControlUI::do_request (MidiUIRequest* req) { - MidiUIRequest* req = get_request (PortChange); - if (req == 0) { - return; + if (req->type == Quit) { + BaseUI::quit (); + } else if (req->type == CallSlot) { + req->the_slot (); } - send_request (req); } bool -MidiControlUI::midi_input_handler (IOCondition ioc, MIDI::Port* port) +MidiControlUI::midi_input_handler (IOCondition ioc, boost::shared_ptr port) { - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", port->name())); + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", boost::shared_ptr (port)->name())); if (ioc & ~IO_IN) { return false; @@ -104,9 +92,8 @@ MidiControlUI::midi_input_handler (IOCondition ioc, MIDI::Port* port) if (ioc & IO_IN) { - CrossThreadChannel::drain (port->selectable()); - - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", port->name())); + port->clear (); + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", boost::shared_ptr(port)->name())); framepos_t now = _session.engine().sample_time(); port->parse (now); } @@ -117,40 +104,34 @@ MidiControlUI::midi_input_handler (IOCondition ioc, MIDI::Port* 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 () { - clear_ports (); + vector > ports; + boost::shared_ptr p; - boost::shared_ptr plist = MIDI::Manager::instance()->get_midi_ports (); - - for (MIDI::Manager::PortList::const_iterator i = plist->begin(); i != plist->end(); ++i) { - - if (!(*i)->centrally_parsed()) { - continue; - } + if ((p = boost::dynamic_pointer_cast (_session.midi_input_port()))) { + ports.push_back (p); + } - int fd; - if ((fd = (*i)->selectable ()) >= 0) { - Glib::RefPtr psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR); + if ((p = boost::dynamic_pointer_cast (_session.mmc_input_port()))) { + ports.push_back (p); + } - psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *i)); - psrc->attach (_main_loop->get_context()); + if ((p = boost::dynamic_pointer_cast (_session.scene_input_port()))) { + ports.push_back (p); + } - // glibmm hack: for now, store only the GSource* + if (ports.empty()) { + return; + } - port_sources.push_back (psrc->gobj()); - g_source_ref (psrc->gobj()); - } + for (vector >::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { + (*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); + (*pi)->xthread().attach (_main_loop->get_context()); } } @@ -161,8 +142,8 @@ MidiControlUI::thread_init () pthread_set_name (X_("midiUI")); - PBD::notify_gui_about_thread_creation (X_("gui"), pthread_self(), X_("MIDI"), 2048); - SessionEvent::create_per_thread_pool (X_("MIDI I/O"), 128); + PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("midiUI"), 2048); + SessionEvent::create_per_thread_pool (X_("midiUI"), 128); memset (&rtparam, 0, sizeof (rtparam)); rtparam.sched_priority = 9; /* XXX should be relative to audio (JACK) thread */