X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_ui.cc;h=0729132d6cf69e490085e219a1edf641cae2e032;hb=7aa46da32f880ad4c7ced29fcea27e002a2c2321;hp=5d9407d5796dd7b9d312cfd925d8697263f88419;hpb=91850f0eb4ab9f63bc6582d042d5495ea1968031;p=ardour.git diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 5d9407d579..0729132d6c 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,16 +39,14 @@ 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 (_("midiui")) - , _session (s) + : AbstractUI (X_("midiui")) + , _session (s) { - MIDI::Manager::instance()->PortsChanged.connect_same_thread (rebind_connection, boost::bind (&MidiControlUI::change_midi_ports, this)); _instance = this; } @@ -61,42 +59,15 @@ MidiControlUI::~MidiControlUI () void MidiControlUI::do_request (MidiUIRequest* req) { - 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) { - + if (req->type == Quit) { BaseUI::quit (); } } -void -MidiControlUI::change_midi_ports () -{ - MidiUIRequest* req = get_request (PortChange); - if (req == 0) { - return; - } - send_request (req); -} - bool -MidiControlUI::midi_input_handler (IOCondition ioc, MIDI::Port* port) +MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* 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", ((ARDOUR::Port*)port)->name())); if (ioc & ~IO_IN) { return false; @@ -106,8 +77,8 @@ MidiControlUI::midi_input_handler (IOCondition ioc, MIDI::Port* port) CrossThreadChannel::drain (port->selectable()); - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", port->name())); - nframes64_t now = _session.engine().frame_time(); + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name())); + framepos_t now = _session.engine().sample_time(); port->parse (now); } @@ -128,37 +99,49 @@ MidiControlUI::clear_ports () void MidiControlUI::reset_ports () { - clear_ports (); - - MIDI::Manager::PortList plist = MIDI::Manager::instance()->get_midi_ports (); - - for (MIDI::Manager::PortList::iterator i = plist.begin(); i != plist.end(); ++i) { - int fd; + if (!port_sources.empty()) { + return; + } + + vector ports; + AsyncMIDIPort* p; + + if ((p = dynamic_cast (_session.midi_input_port()))) { + ports.push_back (p); + } + + + if ((p = dynamic_cast (_session.mmc_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 = (*i)->selectable ()) >= 0) { + 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), *i)); + + 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()); - } + } } } void MidiControlUI::thread_init () -{ +{ struct sched_param rtparam; - char* c = new char[7]; - strcpy (c, X_("midiUI")); - pthread_set_name (c); - - cerr << "MIDI UI running\n"; + 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);