summaryrefslogtreecommitdiff
path: root/RtMidi.h
diff options
context:
space:
mode:
Diffstat (limited to 'RtMidi.h')
-rw-r--r--RtMidi.h171
1 files changed, 109 insertions, 62 deletions
diff --git a/RtMidi.h b/RtMidi.h
index 25fae04..9530089 100644
--- a/RtMidi.h
+++ b/RtMidi.h
@@ -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