X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_ui.cc;h=c11f96c071a0a693f7b852f1d1ad64296c7a03a2;hb=a223b96725c68a4e41c9f2f5675756c274730889;hp=ecdcb303e88404b595fafe29a1053fbdc4f1d37e;hpb=25e1eddc50219dca119bc55370c3e2a5dd776752;p=ardour.git diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index ecdcb303e8..c11f96c071 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -44,7 +44,7 @@ MidiControlUI* MidiControlUI::_instance = 0; #include "pbd/abstract_ui.cc" /* instantiate the template */ MidiControlUI::MidiControlUI (Session& s) - : AbstractUI (X_("midiui")) + : AbstractUI (X_("midiUI")) , _session (s) { _instance = this; @@ -60,6 +60,17 @@ MidiControlUI::~MidiControlUI () _instance = 0; } +void* +MidiControlUI::request_factory (uint32_t num_requests) +{ + /* 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::do_request (MidiUIRequest* req) { @@ -71,9 +82,14 @@ MidiControlUI::do_request (MidiUIRequest* req) } bool -MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) +MidiControlUI::midi_input_handler (IOCondition ioc, boost::weak_ptr wport) { - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", ((ARDOUR::Port*)port)->name())); + boost::shared_ptr port = wport.lock (); + if (!port) { + return false; + } + + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", boost::shared_ptr (port)->name())); if (ioc & ~IO_IN) { return false; @@ -81,12 +97,8 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) if (ioc & IO_IN) { - AsyncMIDIPort* asp = dynamic_cast (port); - if (asp) { - asp->clear (); - } - - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)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); } @@ -102,34 +114,30 @@ MidiControlUI::clear_ports () void MidiControlUI::reset_ports () { - vector ports; - AsyncMIDIPort* p; - - if ((p = dynamic_cast (_session.midi_input_port()))) { + vector > ports; + boost::shared_ptr p; + + if ((p = boost::dynamic_pointer_cast (_session.midi_input_port()))) { ports.push_back (p); } - - - if ((p = dynamic_cast (_session.mmc_input_port()))) { + + + if ((p = boost::dynamic_pointer_cast (_session.mmc_input_port()))) { ports.push_back (p); } - if ((p = dynamic_cast (_session.scene_input_port()))) { + if ((p = boost::dynamic_pointer_cast (_session.scene_input_port()))) { ports.push_back (p); } - + if (ports.empty()) { return; } - - for (vector::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { - - Glib::RefPtr psrc = (*pi)->ios(); - if (psrc) { - psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); - psrc->attach (_main_loop->get_context()); - } + 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), boost::weak_ptr(*pi))); + (*pi)->xthread().attach (_main_loop->get_context()); } } @@ -140,8 +148,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 */