diff options
Diffstat (limited to 'RtMidi.h')
| -rw-r--r-- | RtMidi.h | 171 |
1 files changed, 109 insertions, 62 deletions
@@ -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 |
