Gary Scavone пре 11 година
родитељ
комит
c80bfb62fe
3 измењених фајлова са 13 додато и 4 уклоњено
  1. 8 2
      RtMidi.cpp
  2. 4 1
      doc/release.txt
  3. 1 1
      tests/cmidiin.cpp

+ 8 - 2
RtMidi.cpp

@@ -556,6 +556,7 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
     return;
   }
 
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   unsigned int nSrc = MIDIGetNumberOfSources();
   if (nSrc < 1) {
     errorString_ = "MidiInCore::openPort: no MIDI input sources found!";
@@ -633,6 +634,7 @@ void MidiInCore :: closePort( void )
 
 unsigned int MidiInCore :: getPortCount()
 {
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   return MIDIGetNumberOfSources();
 }
 
@@ -768,6 +770,7 @@ std::string MidiInCore :: getPortName( unsigned int portNumber )
   char name[128];
 
   std::string stringName;
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   if ( portNumber >= MIDIGetNumberOfSources() ) {
     ost << "MidiInCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
@@ -825,6 +828,7 @@ void MidiOutCore :: initialize( const std::string& clientName )
 
 unsigned int MidiOutCore :: getPortCount()
 {
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   return MIDIGetNumberOfDestinations();
 }
 
@@ -836,6 +840,7 @@ std::string MidiOutCore :: getPortName( unsigned int portNumber )
   char name[128];
 
   std::string stringName;
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   if ( portNumber >= MIDIGetNumberOfDestinations() ) {
     ost << "MidiOutCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
@@ -860,6 +865,7 @@ void MidiOutCore :: openPort( unsigned int portNumber, const std::string portNam
     return;
   }
 
+  CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false );
   unsigned int nDest = MIDIGetNumberOfDestinations();
   if (nDest < 1) {
     errorString_ = "MidiOutCore::openPort: no MIDI output destinations found!";
@@ -1206,7 +1212,7 @@ extern "C" void *alsaMidiHandler( void *ptr )
       if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true;
       break;
 
-    case SND_SEQ_EVENT_TICK: // MIDI timing tick
+    case SND_SEQ_EVENT_CLOCK: // MIDI timing tick
       if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true;
       break;
 
@@ -2429,7 +2435,7 @@ public:
       throw std::runtime_error("CKsEnumFilters: no devices found");
 
     // Loop through members of the set and get details for each
-    for (int iClassMember=0;;iClassMember++) {
+    for ( int iClassMember=0; iClassMember++ ) {
       try {
         SP_DEVICE_INTERFACE_DATA DID;
         DID.cbSize = sizeof(DID);

+ 4 - 1
doc/release.txt

@@ -1,6 +1,9 @@
 RtMidi - a set of C++ classes that provides a common API for realtime MIDI input/output across Linux (ALSA & Jack), Macintosh OS X (CoreMidi & Jack), and Windows (Multimedia).
 
-By Gary P. Scavone, 2003-2012.
+By Gary P. Scavone, 2003-2012
+
+v2.0.2: (?? 2014)
+- fix to CoreMidi implementation to support dynamic port changes
 
 v2.0.1: (26 July 2012)
 - small fixes for problems reported by Chris Arndt (scoping, preprocessor, and include)

+ 1 - 1
tests/cmidiin.cpp

@@ -102,9 +102,9 @@ bool chooseMidiPort( RtMidiIn *rtmidi )
       std::cout << "\nChoose a port number: ";
       std::cin >> i;
     } while ( i >= nPorts );
+    std::getline( std::cin, keyHit );  // used to clear out stdin
   }
 
-  std::getline( std::cin, keyHit );  // used to clear out stdin
   rtmidi->openPort( i );
 
   return true;