|
@@ -101,6 +101,18 @@ class RtMidiError : public std::exception
|
|
|
Type type_;
|
|
|
};
|
|
|
|
|
|
+//! RtMidi error callback function prototype.
|
|
|
+/*!
|
|
|
+ \param type Type of error.
|
|
|
+ \param errorText Error description.
|
|
|
+
|
|
|
+ Note that class behaviour is undefined after a critical error (not
|
|
|
+ a warning) is reported.
|
|
|
+ */
|
|
|
+typedef void (*RtMidiErrorCallback)( RtMidiError::Type type, const std::string &errorText );
|
|
|
+
|
|
|
+class MidiApi;
|
|
|
+
|
|
|
class RtMidi
|
|
|
{
|
|
|
public:
|
|
@@ -143,12 +155,24 @@ class RtMidi
|
|
|
virtual void closePort( void ) = 0;
|
|
|
|
|
|
//! A basic error reporting function for RtMidi classes.
|
|
|
- static void error( RtMidiError::Type type, std::string &errorString );
|
|
|
+ // static void error( RtMidiError::Type type, std::string &errorString );
|
|
|
+
|
|
|
+ //! Returns true if a port is open and false if not.
|
|
|
+ virtual bool isPortOpen( void ) const = 0;
|
|
|
+
|
|
|
+ //! Set an error callback function to be invoked when an error has occured.
|
|
|
+ /*!
|
|
|
+ The callback function will be called whenever an error has occured. It is best
|
|
|
+ to set the error callback function before opening a port.
|
|
|
+ */
|
|
|
+ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ) = 0;
|
|
|
|
|
|
protected:
|
|
|
|
|
|
- RtMidi() {};
|
|
|
- virtual ~RtMidi() {};
|
|
|
+ RtMidi();
|
|
|
+ virtual ~RtMidi();
|
|
|
+
|
|
|
+ MidiApi *rtapi_;
|
|
|
};
|
|
|
|
|
|
/**********************************************************************/
|
|
@@ -165,7 +189,7 @@ class RtMidi
|
|
|
to open a virtual input port to which other MIDI software clients
|
|
|
can connect.
|
|
|
|
|
|
- by Gary P. Scavone, 2003-2012.
|
|
|
+ by Gary P. Scavone, 2003-2014.
|
|
|
*/
|
|
|
/**********************************************************************/
|
|
|
|
|
@@ -183,9 +207,6 @@ class RtMidi
|
|
|
//
|
|
|
// **************************************************************** //
|
|
|
|
|
|
-class MidiInApi;
|
|
|
-class MidiOutApi;
|
|
|
-
|
|
|
class RtMidiIn : public RtMidi
|
|
|
{
|
|
|
public:
|
|
@@ -250,6 +271,9 @@ class RtMidiIn : public RtMidi
|
|
|
//! Close an open MIDI connection (if one exists).
|
|
|
void closePort( void );
|
|
|
|
|
|
+ //! Returns true if a port is open and false if not.
|
|
|
+ virtual bool isPortOpen() const;
|
|
|
+
|
|
|
//! Return the number of available MIDI input ports.
|
|
|
unsigned int getPortCount();
|
|
|
|
|
@@ -279,9 +303,15 @@ class RtMidiIn : public RtMidi
|
|
|
*/
|
|
|
double getMessage( std::vector<unsigned char> *message );
|
|
|
|
|
|
+ //! Set an error callback function to be invoked when an error has occured.
|
|
|
+ /*!
|
|
|
+ The callback function will be called whenever an error has occured. It is best
|
|
|
+ to set the error callback function before opening a port.
|
|
|
+ */
|
|
|
+ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
|
|
|
+
|
|
|
protected:
|
|
|
void openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit );
|
|
|
- MidiInApi *rtapi_;
|
|
|
|
|
|
};
|
|
|
|
|
@@ -297,7 +327,7 @@ class RtMidiIn : public RtMidi
|
|
|
OS-X and Linux ALSA MIDI APIs, it is also possible to open a
|
|
|
virtual port to which other MIDI software clients can connect.
|
|
|
|
|
|
- by Gary P. Scavone, 2003-2012.
|
|
|
+ by Gary P. Scavone, 2003-2014.
|
|
|
*/
|
|
|
/**********************************************************************/
|
|
|
|
|
@@ -334,6 +364,9 @@ class RtMidiOut : public RtMidi
|
|
|
//! Close an open MIDI connection (if one exists).
|
|
|
void closePort( void );
|
|
|
|
|
|
+ //! Returns true if a port is open and false if not.
|
|
|
+ virtual bool isPortOpen() const;
|
|
|
+
|
|
|
//! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only).
|
|
|
/*!
|
|
|
This function creates a virtual MIDI output port to which other
|
|
@@ -361,9 +394,15 @@ class RtMidiOut : public RtMidi
|
|
|
*/
|
|
|
void sendMessage( std::vector<unsigned char> *message );
|
|
|
|
|
|
+ //! Set an error callback function to be invoked when an error has occured.
|
|
|
+ /*!
|
|
|
+ The callback function will be called whenever an error has occured. It is best
|
|
|
+ to set the error callback function before opening a port.
|
|
|
+ */
|
|
|
+ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
|
|
|
+
|
|
|
protected:
|
|
|
void openMidiApi( RtMidi::Api api, const std::string clientName );
|
|
|
- MidiOutApi *rtapi_;
|
|
|
};
|
|
|
|
|
|
|
|
@@ -380,22 +419,46 @@ class RtMidiOut : public RtMidi
|
|
|
//
|
|
|
// **************************************************************** //
|
|
|
|
|
|
-class MidiInApi
|
|
|
+class MidiApi
|
|
|
{
|
|
|
public:
|
|
|
|
|
|
- MidiInApi( unsigned int queueSizeLimit );
|
|
|
- virtual ~MidiInApi( void );
|
|
|
+ MidiApi();
|
|
|
+ virtual ~MidiApi();
|
|
|
virtual RtMidi::Api getCurrentApi( void ) = 0;
|
|
|
virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
|
|
|
virtual void openVirtualPort( const std::string portName ) = 0;
|
|
|
virtual void closePort( void ) = 0;
|
|
|
- void setCallback( RtMidiIn::RtMidiCallback callback, void *userData );
|
|
|
- void cancelCallback( void );
|
|
|
+
|
|
|
virtual unsigned int getPortCount( void ) = 0;
|
|
|
virtual std::string getPortName( unsigned int portNumber ) = 0;
|
|
|
+
|
|
|
+ bool isPortOpened() const;
|
|
|
+ void setErrorCallback( RtMidiErrorCallback errorCallback );
|
|
|
+
|
|
|
+ //! A basic error reporting function for RtMidi classes.
|
|
|
+ void error( RtError::Type type, std::string errorString );
|
|
|
+
|
|
|
+protected:
|
|
|
+ virtual void initialize( const std::string& clientName ) = 0;
|
|
|
+
|
|
|
+ void *apiData_;
|
|
|
+ bool connected_;
|
|
|
+ std::string errorString_;
|
|
|
+ RtMidiErrorCallback errorCallback_;
|
|
|
+}
|
|
|
+
|
|
|
+class MidiInApi : public MidiApi
|
|
|
+{
|
|
|
+ public:
|
|
|
+
|
|
|
+ MidiInApi( unsigned int queueSizeLimit );
|
|
|
+ virtual ~MidiInApi( void );
|
|
|
+ void setCallback( RtMidiIn::RtMidiCallback callback, void *userData );
|
|
|
+ void cancelCallback( void );
|
|
|
virtual void ignoreTypes( bool midiSysex, bool midiTime, bool midiSense );
|
|
|
double getMessage( std::vector<unsigned char> *message );
|
|
|
+ inline bool isPortOpen() const { return connected_; }
|
|
|
|
|
|
// A MIDI structure used internally by the class to store incoming
|
|
|
// messages. Each message represents one and only one MIDI message.
|
|
@@ -442,34 +505,16 @@ class MidiInApi
|
|
|
};
|
|
|
|
|
|
protected:
|
|
|
- virtual void initialize( const std::string& clientName ) = 0;
|
|
|
RtMidiInData inputData_;
|
|
|
-
|
|
|
- void *apiData_;
|
|
|
- bool connected_;
|
|
|
- std::string errorString_;
|
|
|
};
|
|
|
|
|
|
-class MidiOutApi
|
|
|
+class MidiOutApi : public MidiApi
|
|
|
{
|
|
|
public:
|
|
|
|
|
|
MidiOutApi( void );
|
|
|
virtual ~MidiOutApi( void );
|
|
|
- virtual RtMidi::Api getCurrentApi( void ) = 0;
|
|
|
- virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
|
|
|
- virtual void openVirtualPort( const std::string portName ) = 0;
|
|
|
- virtual void closePort( void ) = 0;
|
|
|
- virtual unsigned int getPortCount( void ) = 0;
|
|
|
- virtual std::string getPortName( unsigned int portNumber ) = 0;
|
|
|
virtual void sendMessage( std::vector<unsigned char> *message ) = 0;
|
|
|
-
|
|
|
- protected:
|
|
|
- virtual void initialize( const std::string& clientName ) = 0;
|
|
|
-
|
|
|
- void *apiData_;
|
|
|
- bool connected_;
|
|
|
- std::string errorString_;
|
|
|
};
|
|
|
|
|
|
// **************************************************************** //
|
|
@@ -479,23 +524,25 @@ class MidiOutApi
|
|
|
// **************************************************************** //
|
|
|
|
|
|
inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
|
|
|
-inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { return rtapi_->openPort( portNumber, portName ); }
|
|
|
-inline void RtMidiIn :: openVirtualPort( const std::string portName ) { return rtapi_->openVirtualPort( portName ); }
|
|
|
-inline void RtMidiIn :: closePort( void ) { return rtapi_->closePort(); }
|
|
|
-inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { return rtapi_->setCallback( callback, userData ); }
|
|
|
-inline void RtMidiIn :: cancelCallback( void ) { return rtapi_->cancelCallback(); }
|
|
|
+inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
|
|
|
+inline void RtMidiIn :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
|
|
|
+inline void RtMidiIn :: closePort( void ) { rtapi_->closePort(); }
|
|
|
+inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
|
|
|
+inline void RtMidiIn :: cancelCallback( void ) { ((MidiInApi *)rtapi_)->cancelCallback(); }
|
|
|
inline unsigned int RtMidiIn :: getPortCount( void ) { return rtapi_->getPortCount(); }
|
|
|
inline std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
|
|
|
-inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { return rtapi_->ignoreTypes( midiSysex, midiTime, midiSense ); }
|
|
|
-inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) { return rtapi_->getMessage( message ); }
|
|
|
+inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
|
|
|
+inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) { return ((MidiInApi *)rtapi_)->getMessage( message ); }
|
|
|
+inline void RtMidiIn :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
|
|
|
|
|
|
inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
|
|
|
-inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { return rtapi_->openPort( portNumber, portName ); }
|
|
|
-inline void RtMidiOut :: openVirtualPort( const std::string portName ) { return rtapi_->openVirtualPort( portName ); }
|
|
|
-inline void RtMidiOut :: closePort( void ) { return rtapi_->closePort(); }
|
|
|
+inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
|
|
|
+inline void RtMidiOut :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
|
|
|
+inline void RtMidiOut :: closePort( void ) { rtapi_->closePort(); }
|
|
|
inline unsigned int RtMidiOut :: getPortCount( void ) { return rtapi_->getPortCount(); }
|
|
|
inline std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
|
|
|
-inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { return rtapi_->sendMessage( message ); }
|
|
|
+inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { ((MidiOutApi *)rtapi_)->sendMessage( message ); }
|
|
|
+inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
|
|
|
|
|
|
// **************************************************************** //
|
|
|
//
|
|
@@ -703,32 +750,32 @@ 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( 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 ) {};
|
|
|
- void closePort( void ) {};
|
|
|
- unsigned int getPortCount( void ) { return 0; };
|
|
|
- std::string getPortName( unsigned int portNumber ) { return ""; };
|
|
|
+ MidiInDummy( const std::string /*clientName*/, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; 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*/ ) {}
|
|
|
+ void closePort( void ) {}
|
|
|
+ unsigned int getPortCount( void ) { return 0; }
|
|
|
+ std::string getPortName( unsigned int portNumber ) { return ""; }
|
|
|
|
|
|
protected:
|
|
|
- void initialize( const std::string& clientName ) {};
|
|
|
+ void initialize( const std::string& /*clientName*/ ) {}
|
|
|
};
|
|
|
|
|
|
class MidiOutDummy: public MidiOutApi
|
|
|
{
|
|
|
public:
|
|
|
- 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 ) {};
|
|
|
- void closePort( void ) {};
|
|
|
- unsigned int getPortCount( void ) { return 0; };
|
|
|
- std::string getPortName( unsigned int portNumber ) { return ""; };
|
|
|
- void sendMessage( std::vector<unsigned char> *message ) {};
|
|
|
+ MidiOutDummy( const std::string /*clientName*/ ) { errorString_ = "MidiOutDummy: This class provides no functionality."; 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*/ ) {}
|
|
|
+ void closePort( void ) {}
|
|
|
+ unsigned int getPortCount( void ) { return 0; }
|
|
|
+ std::string getPortName( unsigned int /*portNumber*/ ) { return ""; }
|
|
|
+ void sendMessage( std::vector<unsigned char> * /*message*/ ) {}
|
|
|
|
|
|
protected:
|
|
|
- void initialize( const std::string& clientName ) {};
|
|
|
+ void initialize( const std::string& /*clientName*/ ) {}
|
|
|
};
|
|
|
|
|
|
#endif
|