Переглянути джерело

Changed RtError class to RtMidiError and embedded it in RtMidi.h

Gary Scavone 11 роки тому
батько
коміт
ed94023c33
3 змінених файлів з 176 додано та 183 видалено
  1. 0 60
      RtError.h
  2. 117 117
      RtMidi.cpp
  3. 59 6
      RtMidi.h

+ 0 - 60
RtError.h

@@ -1,60 +0,0 @@
-/************************************************************************/
-/*! \class RtError
-    \brief Exception handling class for RtAudio & RtMidi.
-
-    The RtError class is quite simple but it does allow errors to be
-    "caught" by RtError::Type. See the RtAudio and RtMidi
-    documentation to know which methods can throw an RtError.
-
-*/
-/************************************************************************/
-
-#ifndef RTERROR_H
-#define RTERROR_H
-
-#include <exception>
-#include <iostream>
-#include <string>
-
-class RtError : public std::exception
-{
- public:
-  //! Defined RtError types.
-  enum Type {
-    WARNING,           /*!< A non-critical error. */
-    DEBUG_WARNING,     /*!< A non-critical error which might be useful for debugging. */
-    UNSPECIFIED,       /*!< The default, unspecified error type. */
-    NO_DEVICES_FOUND,  /*!< No devices found on system. */
-    INVALID_DEVICE,    /*!< An invalid device ID was specified. */
-    MEMORY_ERROR,      /*!< An error occured during memory allocation. */
-    INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
-    INVALID_USE,       /*!< The function was called incorrectly. */
-    DRIVER_ERROR,      /*!< A system driver error occured. */
-    SYSTEM_ERROR,      /*!< A system error occured. */
-    THREAD_ERROR       /*!< A thread error occured. */
-  };
-
-  //! The constructor.
-  RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
- 
-  //! The destructor.
-  virtual ~RtError( void ) throw() {}
-
-  //! Prints thrown error message to stderr.
-  virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
-
-  //! Returns the thrown error message type.
-  virtual const Type& getType(void) const throw() { return type_; }
-
-  //! Returns the thrown error message string.
-  virtual const std::string& getMessage(void) const throw() { return message_; }
-
-  //! Returns the thrown error message as a c-style string.
-  virtual const char* what( void ) const throw() { return message_.c_str(); }
-
- protected:
-  std::string message_;
-  Type type_;
-};
-
-#endif

+ 117 - 117
RtMidi.cpp

@@ -8,7 +8,7 @@
     RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/
 
     RtMidi: realtime MIDI i/o C++ classes
-    Copyright (c) 2003-2012 Gary P. Scavone
+    Copyright (c) 2003-2014 Gary P. Scavone
 
     Permission is hereby granted, free of charge, to any person
     obtaining a copy of this software and associated documentation files
@@ -36,7 +36,7 @@
 */
 /**********************************************************************/
 
-// RtMidi: Version 2.0.1
+// RtMidi: Version 2.1.0
 
 #include "RtMidi.h"
 #include <sstream>
@@ -71,19 +71,19 @@ void RtMidi :: getCompiledApi( std::vector<RtMidi::Api> &apis ) throw()
 #endif
 }
 
-void RtMidi :: error( RtError::Type type, std::string errorString )
+void RtMidi :: error( RtMidiError::Type type, std::string errorString )
 {
-  if (type == RtError::WARNING) {
+  if (type == RtMidiError::WARNING) {
     std::cerr << '\n' << errorString << "\n\n";
   }
-  else if (type == RtError::DEBUG_WARNING) {
+  else if (type == RtMidiError::DEBUG_WARNING) {
 #if defined(__RTMIDI_DEBUG__)
     std::cerr << '\n' << errorString << "\n\n";
 #endif
   }
   else {
     std::cerr << '\n' << errorString << "\n\n";
-    throw RtError( errorString, type );
+    throw RtMidiError( errorString, type );
   }
 }
 
@@ -134,7 +134,7 @@ RtMidiIn :: RtMidiIn( RtMidi::Api api, const std::string clientName, unsigned in
 
     // No compiled support for specified API value.  Issue a debug
     // warning and continue as if no API was specified.
-    RtMidi::error( RtError::WARNING, "RtMidiIn: no compiled support for specified API argument!" );
+    RtMidi::error( RtMidiError::WARNING, "RtMidiIn: no compiled support for specified API argument!" );
   }
 
   // Iterate through the compiled APIs and return as soon as we find
@@ -152,7 +152,7 @@ RtMidiIn :: RtMidiIn( RtMidi::Api api, const std::string clientName, unsigned in
   // definition __RTMIDI_DUMMY__ is automatically defined if no
   // API-specific definitions are passed to the compiler. But just in
   // case something weird happens, we'll print out an error message.
-  RtMidi::error( RtError::WARNING, "RtMidiIn: no compiled API support found ... critical error!!" );
+  RtMidi::error( RtMidiError::WARNING, "RtMidiIn: no compiled API support found ... critical error!!" );
 }
 
 RtMidiIn :: ~RtMidiIn() throw()
@@ -208,7 +208,7 @@ RtMidiOut :: RtMidiOut( RtMidi::Api api, const std::string clientName )
 
     // No compiled support for specified API value.  Issue a debug
     // warning and continue as if no API was specified.
-    RtMidi::error( RtError::WARNING, "RtMidiOut: no compiled support for specified API argument!" );
+    RtMidi::error( RtMidiError::WARNING, "RtMidiOut: no compiled support for specified API argument!" );
   }
 
   // Iterate through the compiled APIs and return as soon as we find
@@ -226,7 +226,7 @@ RtMidiOut :: RtMidiOut( RtMidi::Api api, const std::string clientName )
   // definition __RTMIDI_DUMMY__ is automatically defined if no
   // API-specific definitions are passed to the compiler. But just in
   // case something weird happens, we'll print out an error message.
-  RtMidi::error( RtError::WARNING, "RtMidiOut: no compiled API support found ... critical error!!" );
+  RtMidi::error( RtMidiError::WARNING, "RtMidiOut: no compiled API support found ... critical error!!" );
 }
 
 RtMidiOut :: ~RtMidiOut() throw()
@@ -257,13 +257,13 @@ void MidiInApi :: setCallback( RtMidiIn::RtMidiCallback callback, void *userData
 {
   if ( inputData_.usingCallback ) {
     errorString_ = "MidiInApi::setCallback: a callback function is already set!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
   if ( !callback ) {
     errorString_ = "RtMidiIn::setCallback: callback function value is invalid!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -276,7 +276,7 @@ void MidiInApi :: cancelCallback()
 {
   if ( !inputData_.usingCallback ) {
     errorString_ = "RtMidiIn::cancelCallback: no callback function was set!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -299,7 +299,7 @@ double MidiInApi :: getMessage( std::vector<unsigned char> *message )
 
   if ( inputData_.usingCallback ) {
     errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port.";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return 0.0;
   }
 
@@ -537,7 +537,7 @@ void MidiInCore :: initialize( const std::string& clientName )
   OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client );
   if ( result != noErr ) {
     errorString_ = "MidiInCore::initialize: error creating OS-X MIDI client object.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -552,7 +552,7 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
 {
   if ( connected_ ) {
     errorString_ = "MidiInCore::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -560,14 +560,14 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
   unsigned int nSrc = MIDIGetNumberOfSources();
   if (nSrc < 1) {
     errorString_ = "MidiInCore::openPort: no MIDI input sources found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
   std::ostringstream ost;
   if ( portNumber >= nSrc ) {
     ost << "MidiInCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   MIDIPortRef port;
@@ -578,7 +578,7 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
   if ( result != noErr ) {
     MIDIClientDispose( data->client );
     errorString_ = "MidiInCore::openPort: error creating OS-X MIDI input port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Get the desired input source identifier.
@@ -587,7 +587,7 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
     MIDIPortDispose( port );
     MIDIClientDispose( data->client );
     errorString_ = "MidiInCore::openPort: error getting MIDI input source reference.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Make the connection.
@@ -596,7 +596,7 @@ void MidiInCore :: openPort( unsigned int portNumber, const std::string portName
     MIDIPortDispose( port );
     MIDIClientDispose( data->client );
     errorString_ = "MidiInCore::openPort: error connecting OS-X MIDI input port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific port information.
@@ -616,7 +616,7 @@ void MidiInCore :: openVirtualPort( const std::string portName )
                                            midiInputCallback, (void *)&inputData_, &endpoint );
   if ( result != noErr ) {
     errorString_ = "MidiInCore::openVirtualPort: error creating virtual OS-X MIDI destination.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -774,8 +774,8 @@ std::string MidiInCore :: getPortName( unsigned int portNumber )
   if ( portNumber >= MIDIGetNumberOfSources() ) {
     ost << "MidiInCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
-    //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
+    //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
     return stringName;
   }
 
@@ -816,7 +816,7 @@ void MidiOutCore :: initialize( const std::string& clientName )
   OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client );
   if ( result != noErr ) {
     errorString_ = "MidiOutCore::initialize: error creating OS-X MIDI client object.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -844,9 +844,9 @@ std::string MidiOutCore :: getPortName( unsigned int portNumber )
   if ( portNumber >= MIDIGetNumberOfDestinations() ) {
     ost << "MidiOutCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return stringName;
-    //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   portRef = MIDIGetDestination( portNumber );
@@ -861,7 +861,7 @@ void MidiOutCore :: openPort( unsigned int portNumber, const std::string portNam
 {
   if ( connected_ ) {
     errorString_ = "MidiOutCore::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -869,14 +869,14 @@ void MidiOutCore :: openPort( unsigned int portNumber, const std::string portNam
   unsigned int nDest = MIDIGetNumberOfDestinations();
   if (nDest < 1) {
     errorString_ = "MidiOutCore::openPort: no MIDI output destinations found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
   std::ostringstream ost;
   if ( portNumber >= nDest ) {
     ost << "MidiOutCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   MIDIPortRef port;
@@ -887,7 +887,7 @@ void MidiOutCore :: openPort( unsigned int portNumber, const std::string portNam
   if ( result != noErr ) {
     MIDIClientDispose( data->client );
     errorString_ = "MidiOutCore::openPort: error creating OS-X MIDI output port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Get the desired output port identifier.
@@ -896,7 +896,7 @@ void MidiOutCore :: openPort( unsigned int portNumber, const std::string portNam
     MIDIPortDispose( port );
     MIDIClientDispose( data->client );
     errorString_ = "MidiOutCore::openPort: error getting MIDI output destination reference.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -920,7 +920,7 @@ void MidiOutCore :: openVirtualPort( std::string portName )
 
   if ( data->endpoint ) {
     errorString_ = "MidiOutCore::openVirtualPort: a virtual output port already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -931,7 +931,7 @@ void MidiOutCore :: openVirtualPort( std::string portName )
                                       &endpoint );
   if ( result != noErr ) {
     errorString_ = "MidiOutCore::initialize: error creating OS-X virtual MIDI source.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -954,7 +954,7 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
   unsigned int nBytes = message->size();
   if ( nBytes == 0 ) {
     errorString_ = "MidiOutCore::sendMessage: no data in message argument!";      
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -971,7 +971,7 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
    sysexBuffer = new char[nBytes];
    if ( sysexBuffer == NULL ) {
      errorString_ = "MidiOutCore::sendMessage: error allocating sysex message memory!";
-     RtMidi::error( RtError::MEMORY_ERROR, errorString_ );
+     RtMidi::error( RtMidiError::MEMORY_ERROR, errorString_ );
    }
 
    // Copy data to buffer.
@@ -987,13 +987,13 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
    result = MIDISendSysex( &(data->sysexreq) );
    if ( result != noErr ) {
      errorString_ = "MidiOutCore::sendMessage: error sending MIDI to virtual destinations.";
-     RtMidi::error( RtError::WARNING, errorString_ );
+     RtMidi::error( RtMidiError::WARNING, errorString_ );
    }
    return;
   }
   else if ( nBytes > 3 ) {
    errorString_ = "MidiOutCore::sendMessage: message format problem ... not sysex but > 3 bytes?";
-   RtMidi::error( RtError::WARNING, errorString_ );
+   RtMidi::error( RtMidiError::WARNING, errorString_ );
    return;
   }
 
@@ -1002,7 +1002,7 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
   packet = MIDIPacketListAdd( &packetList, sizeof(packetList), packet, timeStamp, nBytes, (const Byte *) &message->at( 0 ) );
   if ( !packet ) {
     errorString_ = "MidiOutCore::sendMessage: could not allocate packet list";      
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Send to any destinations that may have connected to us.
@@ -1010,7 +1010,7 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
     result = MIDIReceived( data->endpoint, &packetList );
     if ( result != noErr ) {
       errorString_ = "MidiOutCore::sendMessage: error sending MIDI to virtual destinations.";
-      RtMidi::error( RtError::WARNING, errorString_ );
+      RtMidi::error( RtMidiError::WARNING, errorString_ );
     }
   }
 
@@ -1019,7 +1019,7 @@ void MidiOutCore :: sendMessage( std::vector<unsigned char> *message )
     result = MIDISend( data->port, data->destinationId, &packetList );
     if ( result != noErr ) {
       errorString_ = "MidiOutCore::sendMessage: error sending MIDI message to port.";
-      RtMidi::error( RtError::WARNING, errorString_ );
+      RtMidi::error( RtMidiError::WARNING, errorString_ );
     }
   }
 
@@ -1344,7 +1344,7 @@ void MidiInAlsa :: initialize( const std::string& clientName )
   if ( seq == NULL ) {
     s_seq = NULL;
     errorString_ = "MidiInAlsa::initialize: error creating ALSA sequencer client object.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -1362,7 +1362,7 @@ void MidiInAlsa :: initialize( const std::string& clientName )
 
    if ( pipe(data->trigger_fds) == -1 ) {
     errorString_ = "MidiInAlsa::initialize: error creating pipe objects.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Create the input queue
@@ -1441,23 +1441,23 @@ std::string MidiInAlsa :: getPortName( unsigned int portNumber )
 
   // If we get here, we didn't find a match.
   errorString_ = "MidiInAlsa::getPortName: error looking for port name!";
-  RtMidi::error( RtError::WARNING, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
   return stringName;
-  //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+  //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
 }
 
 void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName )
 {
   if ( connected_ ) {
     errorString_ = "MidiInAlsa::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
   unsigned int nSrc = this->getPortCount();
   if (nSrc < 1) {
     errorString_ = "MidiInAlsa::openPort: no MIDI input sources found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
   snd_seq_port_info_t *pinfo;
@@ -1467,7 +1467,7 @@ void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName
   if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) {
     ost << "MidiInAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
 
@@ -1495,7 +1495,7 @@ void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName
   
     if ( data->vport < 0 ) {
       errorString_ = "MidiInAlsa::openPort: ALSA error creating input port.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 
@@ -1505,7 +1505,7 @@ void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName
     // Make subscription
     if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) {
       errorString_ = "MidiInAlsa::openPort: ALSA error allocation port subscription.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
     snd_seq_port_subscribe_set_sender(data->subscription, &sender);
     snd_seq_port_subscribe_set_dest(data->subscription, &receiver);
@@ -1513,7 +1513,7 @@ void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName
       snd_seq_port_subscribe_free( data->subscription );
       data->subscription = 0;
       errorString_ = "MidiInAlsa::openPort: ALSA error making port connection.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 
@@ -1538,7 +1538,7 @@ void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName
       data->subscription = 0;
       inputData_.doInput = false;
       errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!";
-      RtMidi::error( RtError::THREAD_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::THREAD_ERROR, errorString_ );
     }
   }
 
@@ -1568,7 +1568,7 @@ void MidiInAlsa :: openVirtualPort( std::string portName )
 
     if ( data->vport < 0 ) {
       errorString_ = "MidiInAlsa::openVirtualPort: ALSA error creating virtual port.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 
@@ -1599,7 +1599,7 @@ void MidiInAlsa :: openVirtualPort( std::string portName )
       }
       inputData_.doInput = false;
       errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!";
-      RtMidi::error( RtError::THREAD_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::THREAD_ERROR, errorString_ );
     }
   }
 }
@@ -1662,7 +1662,7 @@ void MidiOutAlsa :: initialize( const std::string& clientName )
   if ( seq == NULL ) {
     s_seq = NULL;
     errorString_ = "MidiOutAlsa::initialize: error creating ALSA sequencer client object.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
 	}
 
   // Save our api-specific connection information.
@@ -1677,13 +1677,13 @@ void MidiOutAlsa :: initialize( const std::string& clientName )
   if ( result < 0 ) {
     delete data;
     errorString_ = "MidiOutAlsa::initialize: error initializing MIDI event parser!\n\n";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
   data->buffer = (unsigned char *) malloc( data->bufferSize );
   if ( data->buffer == NULL ) {
     delete data;
     errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n";
-    RtMidi::error( RtError::MEMORY_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::MEMORY_ERROR, errorString_ );
   }
   snd_midi_event_init( data->coder );
   apiData_ = (void *) data;
@@ -1720,8 +1720,8 @@ std::string MidiOutAlsa :: getPortName( unsigned int portNumber )
 
   // If we get here, we didn't find a match.
   errorString_ = "MidiOutAlsa::getPortName: error looking for port name!";
-  //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
-  RtMidi::error( RtError::WARNING, errorString_ );
+  //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
   return stringName;
 }
 
@@ -1729,14 +1729,14 @@ void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portNam
 {
   if ( connected_ ) {
     errorString_ = "MidiOutAlsa::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
   unsigned int nSrc = this->getPortCount();
   if (nSrc < 1) {
     errorString_ = "MidiOutAlsa::openPort: no MIDI output sources found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
 	snd_seq_port_info_t *pinfo;
@@ -1746,7 +1746,7 @@ void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portNam
   if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) {
     ost << "MidiOutAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   snd_seq_addr_t sender, receiver;
@@ -1760,7 +1760,7 @@ void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portNam
                                               SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION );
     if ( data->vport < 0 ) {
       errorString_ = "MidiOutAlsa::openPort: ALSA error creating output port.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 
@@ -1770,7 +1770,7 @@ void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portNam
   if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) {
     snd_seq_port_subscribe_free( data->subscription );
     errorString_ = "MidiOutAlsa::openPort: error allocation port subscribtion.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
   snd_seq_port_subscribe_set_sender(data->subscription, &sender);
   snd_seq_port_subscribe_set_dest(data->subscription, &receiver);
@@ -1779,7 +1779,7 @@ void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portNam
   if ( snd_seq_subscribe_port(data->seq, data->subscription) ) {
     snd_seq_port_subscribe_free( data->subscription );
     errorString_ = "MidiOutAlsa::openPort: ALSA error making port connection.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   connected_ = true;
@@ -1805,7 +1805,7 @@ void MidiOutAlsa :: openVirtualPort( std::string portName )
 
     if ( data->vport < 0 ) {
       errorString_ = "MidiOutAlsa::openVirtualPort: ALSA error creating virtual port.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 }
@@ -1820,13 +1820,13 @@ void MidiOutAlsa :: sendMessage( std::vector<unsigned char> *message )
     result = snd_midi_event_resize_buffer ( data->coder, nBytes);
     if ( result != 0 ) {
       errorString_ = "MidiOutAlsa::sendMessage: ALSA error resizing MIDI event buffer.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
     free (data->buffer);
     data->buffer = (unsigned char *) malloc( data->bufferSize );
     if ( data->buffer == NULL ) {
     errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n";
-    RtMidi::error( RtError::MEMORY_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::MEMORY_ERROR, errorString_ );
     }
   }
 
@@ -1839,7 +1839,7 @@ void MidiOutAlsa :: sendMessage( std::vector<unsigned char> *message )
   result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev );
   if ( result < (int)nBytes ) {
     errorString_ = "MidiOutAlsa::sendMessage: event parsing error!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -1847,7 +1847,7 @@ void MidiOutAlsa :: sendMessage( std::vector<unsigned char> *message )
   result = snd_seq_event_output(data->seq, &ev);
   if ( result < 0 ) {
     errorString_ = "MidiOutAlsa::sendMessage: error sending MIDI message to port.";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
   snd_seq_drain_output(data->seq);
 }
@@ -2011,7 +2011,7 @@ void MidiInWinMM :: initialize( const std::string& /*clientName*/ )
   unsigned int nDevices = midiInGetNumDevs();
   if ( nDevices == 0 ) {
     errorString_ = "MidiInWinMM::initialize: no MIDI input devices currently available.";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -2025,21 +2025,21 @@ void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portN
 {
   if ( connected_ ) {
     errorString_ = "MidiInWinMM::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
   unsigned int nDevices = midiInGetNumDevs();
   if (nDevices == 0) {
     errorString_ = "MidiInWinMM::openPort: no MIDI input sources found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
   std::ostringstream ost;
   if ( portNumber >= nDevices ) {
     ost << "MidiInWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   WinMidiData *data = static_cast<WinMidiData *> (apiData_);
@@ -2050,7 +2050,7 @@ void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portN
                                 CALLBACK_FUNCTION );
   if ( result != MMSYSERR_NOERROR ) {
     errorString_ = "MidiInWinMM::openPort: error creating Windows MM MIDI input port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Allocate and init the sysex buffers.
@@ -2065,7 +2065,7 @@ void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portN
     if ( result != MMSYSERR_NOERROR ) {
       midiInClose( data->inHandle );
       errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (PrepareHeader).";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
 
     // Register the buffer.
@@ -2073,7 +2073,7 @@ void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portN
     if ( result != MMSYSERR_NOERROR ) {
       midiInClose( data->inHandle );
       errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (AddBuffer).";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 
@@ -2081,7 +2081,7 @@ void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portN
   if ( result != MMSYSERR_NOERROR ) {
     midiInClose( data->inHandle );
     errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   connected_ = true;
@@ -2091,7 +2091,7 @@ void MidiInWinMM :: openVirtualPort( std::string portName )
 {
   // This function cannot be implemented for the Windows MM MIDI API.
   errorString_ = "MidiInWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!";
-  RtMidi::error( RtError::WARNING, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
 }
 
 void MidiInWinMM :: closePort( void )
@@ -2108,7 +2108,7 @@ void MidiInWinMM :: closePort( void )
       if ( result != MMSYSERR_NOERROR ) {
         midiInClose( data->inHandle );
         errorString_ = "MidiInWinMM::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader).";
-        RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+        RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
       }
     }
 
@@ -2130,8 +2130,8 @@ std::string MidiInWinMM :: getPortName( unsigned int portNumber )
     std::ostringstream ost;
     ost << "MidiInWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
-    RtMidi::error( RtError::WARNING, errorString_ );
+    //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return stringName;
   }
 
@@ -2184,7 +2184,7 @@ void MidiOutWinMM :: initialize( const std::string& /*clientName*/ )
   unsigned int nDevices = midiOutGetNumDevs();
   if ( nDevices == 0 ) {
     errorString_ = "MidiOutWinMM::initialize: no MIDI output devices currently available.";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   // Save our api-specific connection information.
@@ -2205,8 +2205,8 @@ std::string MidiOutWinMM :: getPortName( unsigned int portNumber )
     std::ostringstream ost;
     ost << "MidiOutWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    //RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
-    RtMidi::error( RtError::WARNING, errorString_ );
+    //RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return stringName;
   }
 
@@ -2228,21 +2228,21 @@ void MidiOutWinMM :: openPort( unsigned int portNumber, const std::string /*port
 {
   if ( connected_ ) {
     errorString_ = "MidiOutWinMM::openPort: a valid connection already exists!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
   unsigned int nDevices = midiOutGetNumDevs();
   if (nDevices < 1) {
     errorString_ = "MidiOutWinMM::openPort: no MIDI output destinations found!";
-    RtMidi::error( RtError::NO_DEVICES_FOUND, errorString_ );
+    RtMidi::error( RtMidiError::NO_DEVICES_FOUND, errorString_ );
   }
 
   std::ostringstream ost;
   if ( portNumber >= nDevices ) {
     ost << "MidiOutWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::INVALID_PARAMETER, errorString_ );
+    RtMidi::error( RtMidiError::INVALID_PARAMETER, errorString_ );
   }
 
   WinMidiData *data = static_cast<WinMidiData *> (apiData_);
@@ -2253,7 +2253,7 @@ void MidiOutWinMM :: openPort( unsigned int portNumber, const std::string /*port
                                  CALLBACK_NULL );
   if ( result != MMSYSERR_NOERROR ) {
     errorString_ = "MidiOutWinMM::openPort: error creating Windows MM MIDI output port.";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   connected_ = true;
@@ -2273,7 +2273,7 @@ void MidiOutWinMM :: openVirtualPort( std::string portName )
 {
   // This function cannot be implemented for the Windows MM MIDI API.
   errorString_ = "MidiOutWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!";
-  RtMidi::error( RtError::WARNING, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
 }
 
 void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
@@ -2281,7 +2281,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
   unsigned int nBytes = static_cast<unsigned int>(message->size());
   if ( nBytes == 0 ) {
     errorString_ = "MidiOutWinMM::sendMessage: message argument is empty!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return;
   }
 
@@ -2293,7 +2293,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
     char *buffer = (char *) malloc( nBytes );
     if ( buffer == NULL ) {
       errorString_ = "MidiOutWinMM::sendMessage: error allocating sysex message memory!";
-      RtMidi::error( RtError::MEMORY_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::MEMORY_ERROR, errorString_ );
     }
 
     // Copy data to buffer.
@@ -2308,7 +2308,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
     if ( result != MMSYSERR_NOERROR ) {
       free( buffer );
       errorString_ = "MidiOutWinMM::sendMessage: error preparing sysex header.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
 
     // Send the message.
@@ -2316,7 +2316,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
     if ( result != MMSYSERR_NOERROR ) {
       free( buffer );
       errorString_ = "MidiOutWinMM::sendMessage: error sending sysex message.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
 
     // Unprepare the buffer and MIDIHDR.
@@ -2329,7 +2329,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
     // Make sure the message size isn't too big.
     if ( nBytes > 3 ) {
       errorString_ = "MidiOutWinMM::sendMessage: message size is greater than 3 bytes (and not sysex)!";
-      RtMidi::error( RtError::WARNING, errorString_ );
+      RtMidi::error( RtMidiError::WARNING, errorString_ );
       return;
     }
 
@@ -2345,7 +2345,7 @@ void MidiOutWinMM :: sendMessage( std::vector<unsigned char> *message )
     result = midiOutShortMsg( data->outHandle, packet );
     if ( result != MMSYSERR_NOERROR ) {
       errorString_ = "MidiOutWinMM::sendMessage: error sending MIDI message.";
-      RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+      RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     }
   }
 }
@@ -3158,7 +3158,7 @@ void MidiInWinKS :: openPort( unsigned int portNumber, const std::string portNam
     std::stringstream ost;
     ost << "MidiInWinKS::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   CKsMidiCapFilter* pFilter = data->m_pCaptureEnum->m_Filters[portNumber];
@@ -3168,7 +3168,7 @@ void MidiInWinKS :: openPort( unsigned int portNumber, const std::string portNam
     std::stringstream ost;
     ost << "MidiInWinKS::openPort: KS error opening port (could not create pin)";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   data->m_pPin->SetState(KSSTATE_RUN);
@@ -3179,7 +3179,7 @@ void MidiInWinKS :: openPort( unsigned int portNumber, const std::string portNam
     std::stringstream ost;
     ost << "MidiInWinKS::initialize: Could not create input thread : Windows error " << GetLastError() << std::endl;;
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   connected_ = true;
@@ -3189,7 +3189,7 @@ void MidiInWinKS :: openVirtualPort( const std::string portName )
 {
   // This function cannot be implemented for the Windows KS MIDI API.
   errorString_ = "MidiInWinKS::openVirtualPort: cannot be implemented in Windows KS MIDI API!";
-  RtMidi::error( RtError::WARNING, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
 }
 
 unsigned int MidiInWinKS :: getPortCount()
@@ -3206,7 +3206,7 @@ std::string MidiInWinKS :: getPortName(unsigned int portNumber)
     std::stringstream ost;
     ost << "MidiInWinKS::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   CKsMidiCapFilter* pFilter = data->m_pCaptureEnum->m_Filters[portNumber];
@@ -3274,7 +3274,7 @@ void MidiOutWinKS :: openPort( unsigned int portNumber, const std::string portNa
     std::stringstream ost;
     ost << "MidiOutWinKS::openPort: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   CKsMidiRenFilter* pFilter = data->m_pRenderEnum->m_Filters[portNumber];
@@ -3284,7 +3284,7 @@ void MidiOutWinKS :: openPort( unsigned int portNumber, const std::string portNa
     std::stringstream ost;
     ost << "MidiOutWinKS::openPort: KS error opening port (could not create pin)";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   data->m_pPin->SetState(KSSTATE_RUN);
@@ -3295,7 +3295,7 @@ void MidiOutWinKS :: openVirtualPort( const std::string portName )
 {
   // This function cannot be implemented for the Windows KS MIDI API.
   errorString_ = "MidiOutWinKS::openVirtualPort: cannot be implemented in Windows KS MIDI API!";
-  RtMidi::error( RtError::WARNING, errorString_ );
+  RtMidi::error( RtMidiError::WARNING, errorString_ );
 }
 
 unsigned int MidiOutWinKS :: getPortCount()
@@ -3313,7 +3313,7 @@ std::string MidiOutWinKS :: getPortName( unsigned int portNumber )
     std::stringstream ost;
     ost << "MidiOutWinKS::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   CKsMidiRenFilter* pFilter = data->m_pRenderEnum->m_Filters[portNumber];
@@ -3351,14 +3351,14 @@ void MidiOutWinKS :: sendMessage(std::vector<unsigned char>* pMessage)
     std::stringstream ost;
     ost << "KsMidiInput::Write: MIDI buffer too small. Required " << pos + iNumMidiBytes << " bytes, only has " << data->m_Buffer.size();
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   if ( data->m_pPin == NULL ) {
     std::stringstream ost;
     ost << "MidiOutWinKS::sendMessage: port is not open";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
 
   memcpy(&data->m_Buffer[pos], &msg[0], iNumMidiBytes);
@@ -3476,7 +3476,7 @@ void MidiInJack :: initialize( const std::string& clientName )
   // Initialize JACK client
   if (( data->client = jack_client_open( clientName.c_str(), JackNullOption, NULL )) == 0) {
     errorString_ = "MidiInJack::initialize: JACK server not running?";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     return;
   }
 
@@ -3506,7 +3506,7 @@ void MidiInJack :: openPort( unsigned int portNumber, const std::string portName
 
   if ( data->port == NULL) {
     errorString_ = "MidiInJack::openVirtualPort: JACK error creating virtual port";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Connecting to the output
@@ -3524,7 +3524,7 @@ void MidiInJack :: openVirtualPort( const std::string portName )
 
   if ( data->port == NULL ) {
     errorString_ = "MidiInJack::openVirtualPort: JACK error creating virtual port";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 }
 
@@ -3558,14 +3558,14 @@ std::string MidiInJack :: getPortName( unsigned int portNumber )
   // Check port validity
   if ( ports == NULL ) {
     errorString_ = "MidiInJack::getPortName: no ports available!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return retStr;
   }
 
   if ( ports[portNumber] == NULL ) {
     ost << "MidiInJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
   else retStr.assign( ports[portNumber] );
 
@@ -3625,7 +3625,7 @@ void MidiOutJack :: initialize( const std::string& clientName )
   // Initialize JACK client
   if (( data->client = jack_client_open( clientName.c_str(), JackNullOption, NULL )) == 0) {
     errorString_ = "MidiOutJack::initialize: JACK server not running?";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
     return;
   }
 
@@ -3661,7 +3661,7 @@ void MidiOutJack :: openPort( unsigned int portNumber, const std::string portNam
 
   if ( data->port == NULL ) {
     errorString_ = "MidiOutJack::openVirtualPort: JACK error creating virtual port";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 
   // Connecting to the output
@@ -3679,7 +3679,7 @@ void MidiOutJack :: openVirtualPort( const std::string portName )
 
   if ( data->port == NULL ) {
     errorString_ = "MidiOutJack::openVirtualPort: JACK error creating virtual port";
-    RtMidi::error( RtError::DRIVER_ERROR, errorString_ );
+    RtMidi::error( RtMidiError::DRIVER_ERROR, errorString_ );
   }
 }
 
@@ -3714,14 +3714,14 @@ std::string MidiOutJack :: getPortName( unsigned int portNumber )
   // Check port validity
   if ( ports == NULL) {
     errorString_ = "MidiOutJack::getPortName: no ports available!";
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
     return retStr;
   }
 
   if ( ports[portNumber] == NULL) {
     ost << "MidiOutJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid.";
     errorString_ = ost.str();
-    RtMidi::error( RtError::WARNING, errorString_ );
+    RtMidi::error( RtMidiError::WARNING, errorString_ );
   }
   else retStr.assign( ports[portNumber] );
 

+ 59 - 6
RtMidi.h

@@ -8,7 +8,7 @@
     RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/
 
     RtMidi: realtime MIDI i/o C++ classes
-    Copyright (c) 2003-2012 Gary P. Scavone
+    Copyright (c) 2003-2014 Gary P. Scavone
 
     Permission is hereby granted, free of charge, to any person
     obtaining a copy of this software and associated documentation files
@@ -40,15 +40,68 @@
   \file RtMidi.h
  */
 
-// RtMidi: Version 2.0.1
+// RtMidi: Version 2.1.0
 
 #ifndef RTMIDI_H
 #define RTMIDI_H
 
-#include "RtError.h"
+#include <exception>
+#include <iostream>
 #include <string>
 #include <vector>
 
+/************************************************************************/
+/*! \class RtMidiError
+    \brief Exception handling class for RtMidi.
+
+    The RtMidiError class is quite simple but it does allow errors to be
+    "caught" by RtMidiError::Type. See the RtAudio and RtMidi
+    documentation to know which methods can throw an RtMidiError.
+
+*/
+/************************************************************************/
+
+class RtMidiError : public std::exception
+{
+ public:
+  //! Defined RtMidiError types.
+  enum Type {
+    WARNING,           /*!< A non-critical error. */
+    DEBUG_WARNING,     /*!< A non-critical error which might be useful for debugging. */
+    UNSPECIFIED,       /*!< The default, unspecified error type. */
+    NO_DEVICES_FOUND,  /*!< No devices found on system. */
+    INVALID_DEVICE,    /*!< An invalid device ID was specified. */
+    MEMORY_ERROR,      /*!< An error occured during memory allocation. */
+    INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
+    INVALID_USE,       /*!< The function was called incorrectly. */
+    DRIVER_ERROR,      /*!< A system driver error occured. */
+    SYSTEM_ERROR,      /*!< A system error occured. */
+    THREAD_ERROR       /*!< A thread error occured. */
+  };
+
+  //! The constructor.
+  RtMidiError( const std::string& message, Type type = RtMidiError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
+ 
+  //! The destructor.
+  virtual ~RtMidiError( void ) throw() {}
+
+  //! Prints thrown error message to stderr.
+  virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
+
+  //! Returns the thrown error message type.
+  virtual const Type& getType(void) const throw() { return type_; }
+
+  //! Returns the thrown error message string.
+  virtual const std::string& getMessage(void) const throw() { return message_; }
+
+  //! Returns the thrown error message as a c-style string.
+  virtual const char* what( void ) const throw() { return message_.c_str(); }
+
+ protected:
+  std::string message_;
+  Type type_;
+};
+
 class RtMidi
 {
  public:
@@ -88,7 +141,7 @@ class RtMidi
   virtual void closePort( void ) = 0;
 
   //! A basic error reporting function for RtMidi classes.
-  static void error( RtError::Type type, std::string errorString );
+  static void error( RtMidiError::Type type, std::string errorString );
 
  protected:
 
@@ -642,7 +695,7 @@ class MidiOutWinKS: public MidiOutApi
 class MidiInDummy: public MidiInApi
 {
  public:
- MidiInDummy( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); };
+ MidiInDummy( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; RtMidi::error( RtMidiError::WARNING, errorString_ ); };
   RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; };
   void openPort( unsigned int portNumber, const std::string portName ) {};
   void openVirtualPort( const std::string portName ) {};
@@ -657,7 +710,7 @@ class MidiInDummy: public MidiInApi
 class MidiOutDummy: public MidiOutApi
 {
  public:
-  MidiOutDummy( const std::string clientName ) { errorString_ = "MidiOutDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); };
+  MidiOutDummy( const std::string clientName ) { errorString_ = "MidiOutDummy: This class provides no functionality."; RtMidi::error( RtMidiError::WARNING, errorString_ ); };
   RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; };
   void openPort( unsigned int portNumber, const std::string portName ) {};
   void openVirtualPort( const std::string portName ) {};