|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795 |
- /**********************************************************************/
- /*! \class RtMidi
- \brief An abstract base class for realtime MIDI input/output.
-
- This class implements some common functionality for the realtime
- MIDI input/output subclasses RtMidiIn and RtMidiOut.
-
- RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/
-
- RtMidi: realtime MIDI i/o C++ classes
- Copyright (c) 2003-2017 Gary P. Scavone
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- Any person wishing to distribute modifications to the Software is
- asked to send the modifications to the original developer so that
- they can be incorporated into the canonical version. This is,
- however, not a binding provision of this license.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- /**********************************************************************/
-
- /*!
- \file RtMidi.h
- */
-
- #ifndef RTMIDI_H
- #define RTMIDI_H
-
- #define RTMIDI_DLL_PUBLIC
- #define RTMIDI_VERSION "3.0.0"
-
- #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 RtMidi documentation to know
- which methods can throw an RtMidiError.
- */
- /************************************************************************/
-
- class RTMIDI_DLL_PUBLIC 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_;
- };
-
- //! 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, void *userData );
-
- class MidiApi;
-
- class RTMIDI_DLL_PUBLIC RtMidi
- {
- public:
-
- //! MIDI API specifier arguments.
- enum Api {
- UNSPECIFIED, /*!< Search for a working compiled API. */
- MACOSX_CORE, /*!< Macintosh OS-X Core Midi API. */
- LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */
- UNIX_JACK, /*!< The JACK Low-Latency MIDI Server API. */
- WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */
- RTMIDI_DUMMY /*!< A compilable but non-functional API. */
- };
-
- //! A static function to determine the current RtMidi version.
- static std::string getVersion( void ) throw();
-
- //! A static function to determine the available compiled MIDI APIs.
- /*!
- The values returned in the std::vector can be compared against
- the enumerated list values. Note that there can be more than one
- API compiled for certain operating systems.
- */
- static void getCompiledApi( std::vector<RtMidi::Api> &apis ) throw();
-
- //! Pure virtual openPort() function.
- virtual void openPort( unsigned int portNumber = 0, const std::string &portName = std::string( "RtMidi" ) ) = 0;
-
- //! Pure virtual openVirtualPort() function.
- virtual void openVirtualPort( const std::string &portName = std::string( "RtMidi" ) ) = 0;
-
- //! Pure virtual getPortCount() function.
- virtual unsigned int getPortCount() = 0;
-
- //! Pure virtual getPortName() function.
- virtual std::string getPortName( unsigned int portNumber = 0 ) = 0;
-
- //! Pure virtual closePort() function.
- virtual void closePort( void ) = 0;
-
- //! Returns true if a port is open and false if not.
- /*!
- Note that this only applies to connections made with the openPort()
- function, not to virtual ports.
- */
- 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, void *userData = 0 ) = 0;
-
- protected:
-
- RtMidi();
- virtual ~RtMidi();
-
- MidiApi *rtapi_;
- };
-
- /**********************************************************************/
- /*! \class RtMidiIn
- \brief A realtime MIDI input class.
-
- This class provides a common, platform-independent API for
- realtime MIDI input. It allows access to a single MIDI input
- port. Incoming MIDI messages are either saved to a queue for
- retrieval using the getMessage() function or immediately passed to
- a user-specified callback function. Create multiple instances of
- this class to connect to more than one MIDI device at the same
- time. With the OS-X, Linux ALSA, and JACK MIDI APIs, it is also
- possible to open a virtual input port to which other MIDI software
- clients can connect.
-
- by Gary P. Scavone, 2003-2017.
- */
- /**********************************************************************/
-
- // **************************************************************** //
- //
- // RtMidiIn and RtMidiOut class declarations.
- //
- // RtMidiIn / RtMidiOut are "controllers" used to select an available
- // MIDI input or output interface. They present common APIs for the
- // user to call but all functionality is implemented by the classes
- // MidiInApi, MidiOutApi and their subclasses. RtMidiIn and RtMidiOut
- // each create an instance of a MidiInApi or MidiOutApi subclass based
- // on the user's API choice. If no choice is made, they attempt to
- // make a "logical" API selection.
- //
- // **************************************************************** //
-
- class RTMIDI_DLL_PUBLIC RtMidiIn : public RtMidi
- {
- public:
-
- //! User callback function type definition.
- typedef void (*RtMidiCallback)( double timeStamp, std::vector<unsigned char> *message, void *userData);
-
- //! Default constructor that allows an optional api, client name and queue size.
- /*!
- An exception will be thrown if a MIDI system initialization
- error occurs. The queue size defines the maximum number of
- messages that can be held in the MIDI queue (when not using a
- callback function). If the queue size limit is reached,
- incoming messages will be ignored.
-
- If no API argument is specified and multiple API support has been
- compiled, the default order of use is ALSA, JACK (Linux) and CORE,
- JACK (OS-X).
-
- \param api An optional API id can be specified.
- \param clientName An optional client name can be specified. This
- will be used to group the ports that are created
- by the application.
- \param queueSizeLimit An optional size of the MIDI input queue can be specified.
- */
- RtMidiIn( RtMidi::Api api=UNSPECIFIED,
- const std::string& clientName = "RtMidi Input Client",
- unsigned int queueSizeLimit = 100 );
-
- //! If a MIDI connection is still open, it will be closed by the destructor.
- ~RtMidiIn ( void ) throw();
-
- //! Returns the MIDI API specifier for the current instance of RtMidiIn.
- RtMidi::Api getCurrentApi( void ) throw();
-
- //! Open a MIDI input connection given by enumeration number.
- /*!
- \param portNumber An optional port number greater than 0 can be specified.
- Otherwise, the default or first port found is opened.
- \param portName An optional name for the application port that is used to connect to portId can be specified.
- */
- void openPort( unsigned int portNumber = 0, const std::string &portName = std::string( "RtMidi Input" ) );
-
- //! Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only).
- /*!
- This function creates a virtual MIDI input port to which other
- software applications can connect. This type of functionality
- is currently only supported by the Macintosh OS-X, any JACK,
- and Linux ALSA APIs (the function returns an error for the other APIs).
-
- \param portName An optional name for the application port that is
- used to connect to portId can be specified.
- */
- void openVirtualPort( const std::string &portName = std::string( "RtMidi Input" ) );
-
- //! Set a callback function to be invoked for incoming MIDI messages.
- /*!
- The callback function will be called whenever an incoming MIDI
- message is received. While not absolutely necessary, it is best
- to set the callback function before opening a MIDI port to avoid
- leaving some messages in the queue.
-
- \param callback A callback function must be given.
- \param userData Optionally, a pointer to additional data can be
- passed to the callback function whenever it is called.
- */
- void setCallback( RtMidiCallback callback, void *userData = 0 );
-
- //! Cancel use of the current callback function (if one exists).
- /*!
- Subsequent incoming MIDI messages will be written to the queue
- and can be retrieved with the \e getMessage function.
- */
- void cancelCallback();
-
- //! Close an open MIDI connection (if one exists).
- void closePort( void );
-
- //! Returns true if a port is open and false if not.
- /*!
- Note that this only applies to connections made with the openPort()
- function, not to virtual ports.
- */
- virtual bool isPortOpen() const;
-
- //! Return the number of available MIDI input ports.
- /*!
- \return This function returns the number of MIDI ports of the selected API.
- */
- unsigned int getPortCount();
-
- //! Return a string identifier for the specified MIDI input port number.
- /*!
- \return The name of the port with the given Id is returned.
- \retval An empty string is returned if an invalid port specifier
- is provided. User code should assume a UTF-8 encoding.
- */
- std::string getPortName( unsigned int portNumber = 0 );
-
- //! Specify whether certain MIDI message types should be queued or ignored during input.
- /*!
- By default, MIDI timing and active sensing messages are ignored
- during message input because of their relative high data rates.
- MIDI sysex messages are ignored by default as well. Variable
- values of "true" imply that the respective message type will be
- ignored.
- */
- void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true );
-
- //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds.
- /*!
- This function returns immediately whether a new message is
- available or not. A valid message is indicated by a non-zero
- vector size. An exception is thrown if an error occurs during
- message retrieval or an input connection was not previously
- established.
- */
- 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, void *userData = 0 );
-
- protected:
- void openMidiApi( RtMidi::Api api, const std::string &clientName, unsigned int queueSizeLimit );
-
- };
-
- /**********************************************************************/
- /*! \class RtMidiOut
- \brief A realtime MIDI output class.
-
- This class provides a common, platform-independent API for MIDI
- output. It allows one to probe available MIDI output ports, to
- connect to one such port, and to send MIDI bytes immediately over
- the connection. Create multiple instances of this class to
- connect to more than one MIDI device at the same time. With the
- OS-X, Linux ALSA and JACK MIDI APIs, it is also possible to open a
- virtual port to which other MIDI software clients can connect.
-
- by Gary P. Scavone, 2003-2017.
- */
- /**********************************************************************/
-
- class RTMIDI_DLL_PUBLIC RtMidiOut : public RtMidi
- {
- public:
-
- //! Default constructor that allows an optional client name.
- /*!
- An exception will be thrown if a MIDI system initialization error occurs.
-
- If no API argument is specified and multiple API support has been
- compiled, the default order of use is ALSA, JACK (Linux) and CORE,
- JACK (OS-X).
- */
- RtMidiOut( RtMidi::Api api=UNSPECIFIED,
- const std::string& clientName = "RtMidi Output Client" );
-
- //! The destructor closes any open MIDI connections.
- ~RtMidiOut( void ) throw();
-
- //! Returns the MIDI API specifier for the current instance of RtMidiOut.
- RtMidi::Api getCurrentApi( void ) throw();
-
- //! Open a MIDI output connection.
- /*!
- An optional port number greater than 0 can be specified.
- Otherwise, the default or first port found is opened. An
- exception is thrown if an error occurs while attempting to make
- the port connection.
- */
- void openPort( unsigned int portNumber = 0, const std::string &portName = std::string( "RtMidi Output" ) );
-
- //! Close an open MIDI connection (if one exists).
- void closePort( void );
-
- //! Returns true if a port is open and false if not.
- /*!
- Note that this only applies to connections made with the openPort()
- function, not to virtual ports.
- */
- virtual bool isPortOpen() const;
-
- //! Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only).
- /*!
- This function creates a virtual MIDI output port to which other
- software applications can connect. This type of functionality
- is currently only supported by the Macintosh OS-X, Linux ALSA
- and JACK APIs (the function does nothing with the other APIs).
- An exception is thrown if an error occurs while attempting to
- create the virtual port.
- */
- void openVirtualPort( const std::string &portName = std::string( "RtMidi Output" ) );
-
- //! Return the number of available MIDI output ports.
- unsigned int getPortCount( void );
-
- //! Return a string identifier for the specified MIDI port type and number.
- /*!
- \return The name of the port with the given Id is returned.
- \retval An empty string is returned if an invalid port specifier
- is provided. User code should assume a UTF-8 encoding.
- */
- std::string getPortName( unsigned int portNumber = 0 );
-
- //! Immediately send a single message out an open MIDI output port.
- /*!
- An exception is thrown if an error occurs during output or an
- output connection was not previously established.
- */
- void sendMessage( const std::vector<unsigned char> *message );
-
- //! Immediately send a single message out an open MIDI output port.
- /*!
- An exception is thrown if an error occurs during output or an
- output connection was not previously established.
-
- \param message A pointer to the MIDI message as raw bytes
- \param size Length of the MIDI message in bytes
- */
- void sendMessage( const unsigned char *message, size_t size );
-
- //! 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, void *userData = 0 );
-
- protected:
- void openMidiApi( RtMidi::Api api, const std::string &clientName );
- };
-
-
- // **************************************************************** //
- //
- // MidiInApi / MidiOutApi class declarations.
- //
- // Subclasses of MidiInApi and MidiOutApi contain all API- and
- // OS-specific code necessary to fully implement the RtMidi API.
- //
- // Note that MidiInApi and MidiOutApi are abstract base classes and
- // cannot be explicitly instantiated. RtMidiIn and RtMidiOut will
- // create instances of a MidiInApi or MidiOutApi subclass.
- //
- // **************************************************************** //
-
- class RTMIDI_DLL_PUBLIC MidiApi
- {
- public:
-
- 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;
-
- virtual unsigned int getPortCount( void ) = 0;
- virtual std::string getPortName( unsigned int portNumber ) = 0;
-
- inline bool isPortOpen() const { return connected_; }
- void setErrorCallback( RtMidiErrorCallback errorCallback, void *userData );
-
- //! A basic error reporting function for RtMidi classes.
- void error( RtMidiError::Type type, std::string errorString );
-
- protected:
- virtual void initialize( const std::string& clientName ) = 0;
-
- void *apiData_;
- bool connected_;
- std::string errorString_;
- RtMidiErrorCallback errorCallback_;
- bool firstErrorOccurred_;
- void *errorCallbackUserData_;
- };
-
- class RTMIDI_DLL_PUBLIC 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 );
-
- // A MIDI structure used internally by the class to store incoming
- // messages. Each message represents one and only one MIDI message.
- struct MidiMessage {
- std::vector<unsigned char> bytes;
-
- //! Time in seconds elapsed since the previous message
- double timeStamp;
-
- // Default constructor.
- MidiMessage()
- :bytes(0), timeStamp(0.0) {}
- };
-
- struct MidiQueue {
- unsigned int front;
- unsigned int back;
- unsigned int ringSize;
- MidiMessage *ring;
-
- // Default constructor.
- MidiQueue()
- :front(0), back(0), ringSize(0), ring(0) {}
- bool push(const MidiMessage&);
- bool pop(std::vector<unsigned char>*, double*);
- unsigned int size(unsigned int *back=0,
- unsigned int *front=0);
- };
-
- // The RtMidiInData structure is used to pass private class data to
- // the MIDI input handling function or thread.
- struct RtMidiInData {
- MidiQueue queue;
- MidiMessage message;
- unsigned char ignoreFlags;
- bool doInput;
- bool firstMessage;
- void *apiData;
- bool usingCallback;
- RtMidiIn::RtMidiCallback userCallback;
- void *userData;
- bool continueSysex;
-
- // Default constructor.
- RtMidiInData()
- : ignoreFlags(7), doInput(false), firstMessage(true),
- apiData(0), usingCallback(false), userCallback(0), userData(0),
- continueSysex(false) {}
- };
-
- protected:
- RtMidiInData inputData_;
- };
-
- class RTMIDI_DLL_PUBLIC MidiOutApi : public MidiApi
- {
- public:
-
- MidiOutApi( void );
- virtual ~MidiOutApi( void );
- virtual void sendMessage( const unsigned char *message, size_t size ) = 0;
- };
-
- // **************************************************************** //
- //
- // Inline RtMidiIn and RtMidiOut definitions.
- //
- // **************************************************************** //
-
- inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
- 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 bool RtMidiIn :: isPortOpen() const { return rtapi_->isPortOpen(); }
- 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 ) { ((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, void *userData ) { rtapi_->setErrorCallback(errorCallback, userData); }
-
- inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
- 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 bool RtMidiOut :: isPortOpen() const { return rtapi_->isPortOpen(); }
- 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( const std::vector<unsigned char> *message ) { ((MidiOutApi *)rtapi_)->sendMessage( &message->at(0), message->size() ); }
- inline void RtMidiOut :: sendMessage( const unsigned char *message, size_t size ) { ((MidiOutApi *)rtapi_)->sendMessage( message, size ); }
- inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback, void *userData ) { rtapi_->setErrorCallback(errorCallback, userData); }
-
- // **************************************************************** //
- //
- // MidiInApi and MidiOutApi subclass prototypes.
- //
- // **************************************************************** //
-
- #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
- #define __RTMIDI_DUMMY__
- #endif
-
- #if defined(__MACOSX_CORE__)
-
- class MidiInCore: public MidiInApi
- {
- public:
- MidiInCore( const std::string &clientName, unsigned int queueSizeLimit );
- ~MidiInCore( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- class MidiOutCore: public MidiOutApi
- {
- public:
- MidiOutCore( const std::string &clientName );
- ~MidiOutCore( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
- void sendMessage( const unsigned char *message, size_t size );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- #endif
-
- #if defined(__UNIX_JACK__)
-
- class MidiInJack: public MidiInApi
- {
- public:
- MidiInJack( const std::string &clientName, unsigned int queueSizeLimit );
- ~MidiInJack( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
-
- protected:
- std::string clientName;
-
- void connect( void );
- void initialize( const std::string& clientName );
- };
-
- class MidiOutJack: public MidiOutApi
- {
- public:
- MidiOutJack( const std::string &clientName );
- ~MidiOutJack( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
- void sendMessage( const unsigned char *message, size_t size );
-
- protected:
- std::string clientName;
-
- void connect( void );
- void initialize( const std::string& clientName );
- };
-
- #endif
-
- #if defined(__LINUX_ALSA__)
-
- class MidiInAlsa: public MidiInApi
- {
- public:
- MidiInAlsa( const std::string &clientName, unsigned int queueSizeLimit );
- ~MidiInAlsa( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- class MidiOutAlsa: public MidiOutApi
- {
- public:
- MidiOutAlsa( const std::string &clientName );
- ~MidiOutAlsa( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
- void sendMessage( const unsigned char *message, size_t size );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- #endif
-
- #if defined(__WINDOWS_MM__)
-
- class MidiInWinMM: public MidiInApi
- {
- public:
- MidiInWinMM( const std::string &clientName, unsigned int queueSizeLimit );
- ~MidiInWinMM( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- class MidiOutWinMM: public MidiOutApi
- {
- public:
- MidiOutWinMM( const std::string &clientName );
- ~MidiOutWinMM( void );
- RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; };
- void openPort( unsigned int portNumber, const std::string &portName );
- void openVirtualPort( const std::string &portName );
- void closePort( void );
- unsigned int getPortCount( void );
- std::string getPortName( unsigned int portNumber );
- void sendMessage( const unsigned char *message, size_t size );
-
- protected:
- void initialize( const std::string& clientName );
- };
-
- #endif
-
- #if defined(__RTMIDI_DUMMY__)
-
- class MidiInDummy: public MidiInApi
- {
- public:
- 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*/ ) {}
- };
-
- class MidiOutDummy: public MidiOutApi
- {
- public:
- 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( const unsigned char * /*message*/, size_t /*size*/ ) {}
-
- protected:
- void initialize( const std::string& /*clientName*/ ) {}
- };
-
- #endif
-
- #endif
|