fix MMC
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 23 Oct 2013 17:51:04 +0000 (13:51 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 23 Oct 2013 19:38:02 +0000 (15:38 -0400)
MTC and MIDI Clock port input handling was moved into the process/RT thread(s) during audioengine work, but MMC was
left orphaned. Add it to the port(s) handled by the MIDI UI thread.

Also, remove PortChange request from MidiUI because it has no meaning anymore

libs/ardour/ardour/midi_ui.h
libs/ardour/midi_ui.cc

index c15a53005796b431aea06e6d2cb4e868236732a3..9e46f226f71ea418b9133b0a542ba715d5faefba 100644 (file)
@@ -51,8 +51,6 @@ class MidiControlUI : public AbstractUI<MidiUIRequest>
 
        static MidiControlUI* instance() { return _instance; }
 
-       static BaseUI::RequestType PortChange;
-
        void change_midi_ports ();
 
   protected:
@@ -63,7 +61,6 @@ class MidiControlUI : public AbstractUI<MidiUIRequest>
        typedef std::list<GSource*> PortSources;
        PortSources port_sources;
        ARDOUR::Session& _session;
-       PBD::ScopedConnection rebind_connection;
 
        bool midi_input_handler (Glib::IOCondition, AsyncMIDIPort*);
        void reset_ports ();
index 7346c0244ca92287008494bc0b9f886658f90ac7..0729132d6cf69e490085e219a1edf641cae2e032 100644 (file)
@@ -39,7 +39,6 @@ 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 */
@@ -60,24 +59,7 @@ 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 ();
        }
 }
@@ -117,23 +99,37 @@ MidiControlUI::clear_ports ()
 void
 MidiControlUI::reset_ports ()
 {
-       if (port_sources.empty()) {
-               AsyncMIDIPort* async = dynamic_cast<AsyncMIDIPort*> (_session.midi_input_port());
-
-               if (!async) {
-                       return;
-               }
-
-               int fd;
+       if (!port_sources.empty()) {
+               return;
+       }
+       
+       vector<AsyncMIDIPort*> ports;
+       AsyncMIDIPort* p;
+       
+       if ((p = dynamic_cast<AsyncMIDIPort*> (_session.midi_input_port()))) {
+               ports.push_back (p);
+       }
+       
+       
+       if ((p = dynamic_cast<AsyncMIDIPort*> (_session.mmc_input_port()))) {
+               ports.push_back (p);
+       }
+       
+       if (ports.empty()) {
+               return;
+       }
+       
+       int fd;
+       for (vector<AsyncMIDIPort*>::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) {
 
-               if ((fd = async->selectable ()) >= 0) {
+               if ((fd = (*pi)->selectable ()) >= 0) {
                        Glib::RefPtr<IOSource> psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR);
                        
-                       psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), async));
+                       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());
                }