|
|
@@ -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,17 +40,79 @@ |
|
|
|
\file RtMidi.h |
|
|
|
*/ |
|
|
|
|
|
|
|
// RtMidi: Version 2.0.1 |
|
|
|
|
|
|
|
#ifndef RTMIDI_H |
|
|
|
#define RTMIDI_H |
|
|
|
|
|
|
|
#include "CarlaDefines.h" |
|
|
|
#define RTMIDI_VERSION "2.1.0" |
|
|
|
|
|
|
|
#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 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_; |
|
|
|
}; |
|
|
|
|
|
|
|
//! 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: |
|
|
@@ -60,12 +122,14 @@ class RtMidi |
|
|
|
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. */ |
|
|
|
UNIX_JACK, /*!< The JACK Low-Latency MIDI Server API. */ |
|
|
|
WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */ |
|
|
|
WINDOWS_KS, /*!< The Microsoft Kernel Streaming 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 |
|
|
@@ -89,13 +153,22 @@ class RtMidi |
|
|
|
//! Pure virtual closePort() function. |
|
|
|
virtual void closePort( void ) = 0; |
|
|
|
|
|
|
|
//! A basic error reporting function for RtMidi classes. |
|
|
|
static void error( RtError::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_; |
|
|
|
}; |
|
|
|
|
|
|
|
/**********************************************************************/ |
|
|
@@ -108,11 +181,11 @@ class RtMidi |
|
|
|
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 and Linux ALSA MIDI APIs, it is also possible |
|
|
|
to open a virtual input port to which other MIDI software clients |
|
|
|
can connect. |
|
|
|
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-2012. |
|
|
|
by Gary P. Scavone, 2003-2014. |
|
|
|
*/ |
|
|
|
/**********************************************************************/ |
|
|
|
|
|
|
@@ -130,9 +203,6 @@ class RtMidi |
|
|
|
// |
|
|
|
// **************************************************************** // |
|
|
|
|
|
|
|
class MidiInApi; |
|
|
|
class MidiOutApi; |
|
|
|
|
|
|
|
class RtMidiIn : public RtMidi |
|
|
|
{ |
|
|
|
public: |
|
|
@@ -149,8 +219,14 @@ class RtMidiIn : public RtMidi |
|
|
|
incoming messages will be ignored. |
|
|
|
|
|
|
|
If no API argument is specified and multiple API support has been |
|
|
|
compiled, the default order of use is JACK, ALSA (Linux) and CORE, |
|
|
|
Jack (OS-X). |
|
|
|
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 = std::string( "RtMidi Input Client"), |
|
|
@@ -162,19 +238,23 @@ class RtMidiIn : public RtMidi |
|
|
|
//! Returns the MIDI API specifier for the current instance of RtMidiIn. |
|
|
|
RtMidi::Api getCurrentApi( void ) throw(); |
|
|
|
|
|
|
|
//! Open a MIDI input connection. |
|
|
|
//! Open a MIDI input connection given by enumeration number. |
|
|
|
/*! |
|
|
|
An optional port number greater than 0 can be specified. |
|
|
|
Otherwise, the default or first port found is opened. |
|
|
|
\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 and ALSA only). |
|
|
|
//! 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 and Linux ALSA |
|
|
|
APIs (the function does nothing for the other APIs). |
|
|
|
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" ) ); |
|
|
|
|
|
|
@@ -184,6 +264,10 @@ class RtMidiIn : public RtMidi |
|
|
|
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 ); |
|
|
|
|
|
|
@@ -197,18 +281,25 @@ 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. |
|
|
|
/*! |
|
|
|
\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. |
|
|
|
/*! |
|
|
|
An empty string is returned if an invalid port specifier is provided. |
|
|
|
\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. |
|
|
|
*/ |
|
|
|
std::string getPortName( unsigned int portNumber = 0 ); |
|
|
|
|
|
|
|
//! Specify whether certain MIDI message types should be queued or ignored during input. |
|
|
|
/*! |
|
|
|
o By default, MIDI timing and active sensing messages are ignored |
|
|
|
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 |
|
|
@@ -226,9 +317,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_; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
@@ -241,10 +338,10 @@ class RtMidiIn : public RtMidi |
|
|
|
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 and Linux ALSA MIDI APIs, it is also possible to open a |
|
|
|
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-2012. |
|
|
|
by Gary P. Scavone, 2003-2014. |
|
|
|
*/ |
|
|
|
/**********************************************************************/ |
|
|
|
|
|
|
@@ -257,8 +354,8 @@ class RtMidiOut : public RtMidi |
|
|
|
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 JACK, ALSA (Linux) and CORE, |
|
|
|
Jack (OS-X). |
|
|
|
compiled, the default order of use is ALSA, JACK (Linux) and CORE, |
|
|
|
JACK (OS-X). |
|
|
|
*/ |
|
|
|
RtMidiOut( RtMidi::Api api=UNSPECIFIED, |
|
|
|
const std::string clientName = std::string( "RtMidi Output Client") ); |
|
|
@@ -281,14 +378,17 @@ class RtMidiOut : public RtMidi |
|
|
|
//! Close an open MIDI connection (if one exists). |
|
|
|
void closePort( void ); |
|
|
|
|
|
|
|
//! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only). |
|
|
|
//! 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, 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 and Linux ALSA |
|
|
|
APIs (the function does nothing with the other APIs). An |
|
|
|
exception is thrown if an error occurs while attempting to create |
|
|
|
the virtual port. |
|
|
|
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" ) ); |
|
|
|
|
|
|
@@ -308,9 +408,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_; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@@ -327,20 +433,43 @@ 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; |
|
|
|
|
|
|
|
inline bool isPortOpen() const { return connected_; } |
|
|
|
void setErrorCallback( RtMidiErrorCallback errorCallback ); |
|
|
|
|
|
|
|
//! 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_; |
|
|
|
}; |
|
|
|
|
|
|
|
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 ); |
|
|
|
|
|
|
@@ -377,46 +506,28 @@ class MidiInApi |
|
|
|
bool firstMessage; |
|
|
|
void *apiData; |
|
|
|
bool usingCallback; |
|
|
|
void *userCallback; |
|
|
|
RtMidiIn::RtMidiCallback userCallback; |
|
|
|
void *userData; |
|
|
|
bool continueSysex; |
|
|
|
|
|
|
|
// Default constructor. |
|
|
|
RtMidiInData() |
|
|
|
: ignoreFlags(7), doInput(false), firstMessage(true), |
|
|
|
apiData(nullptr), usingCallback(false), userCallback(nullptr), userData(nullptr), |
|
|
|
apiData(0), usingCallback(false), userCallback(0), userData(0), |
|
|
|
continueSysex(false) {} |
|
|
|
}; |
|
|
|
|
|
|
|
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_; |
|
|
|
}; |
|
|
|
|
|
|
|
// **************************************************************** // |
|
|
@@ -426,23 +537,27 @@ 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 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 ) { 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 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( 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); } |
|
|
|
|
|
|
|
// **************************************************************** // |
|
|
|
// |
|
|
@@ -450,7 +565,7 @@ inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { re |
|
|
|
// |
|
|
|
// **************************************************************** // |
|
|
|
|
|
|
|
#if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__) && !defined(__WINDOWS_KS__) |
|
|
|
#if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__) |
|
|
|
#define __RTMIDI_DUMMY__ |
|
|
|
#endif |
|
|
|
|
|
|
@@ -506,6 +621,9 @@ class MidiInJack: public MidiInApi |
|
|
|
std::string getPortName( unsigned int portNumber ); |
|
|
|
|
|
|
|
protected: |
|
|
|
std::string clientName; |
|
|
|
|
|
|
|
void connect( void ); |
|
|
|
void initialize( const std::string& clientName ); |
|
|
|
}; |
|
|
|
|
|
|
@@ -523,6 +641,9 @@ class MidiOutJack: public MidiOutApi |
|
|
|
void sendMessage( std::vector<unsigned char> *message ); |
|
|
|
|
|
|
|
protected: |
|
|
|
std::string clientName; |
|
|
|
|
|
|
|
void connect( void ); |
|
|
|
void initialize( const std::string& clientName ); |
|
|
|
}; |
|
|
|
|
|
|
@@ -602,74 +723,37 @@ class MidiOutWinMM: public MidiOutApi |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(__WINDOWS_KS__) |
|
|
|
|
|
|
|
class MidiInWinKS: public MidiInApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
MidiInWinKS( const std::string clientName, unsigned int queueSizeLimit ); |
|
|
|
~MidiInWinKS( void ); |
|
|
|
RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_KS; }; |
|
|
|
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 MidiOutWinKS: public MidiOutApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
MidiOutWinKS( const std::string clientName ); |
|
|
|
~MidiOutWinKS( void ); |
|
|
|
RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_KS; }; |
|
|
|
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( std::vector<unsigned char> *message ); |
|
|
|
|
|
|
|
protected: |
|
|
|
void initialize( const std::string& clientName ); |
|
|
|
}; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(__RTMIDI_DUMMY__) |
|
|
|
|
|
|
|
class MidiInDummy: public MidiInApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
MidiInDummy( const std::string, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); }; |
|
|
|
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }; |
|
|
|
void openPort( unsigned int, const std::string ) {}; |
|
|
|
void openVirtualPort( const std::string ) {}; |
|
|
|
void closePort( void ) {}; |
|
|
|
unsigned int getPortCount( void ) { return 0; }; |
|
|
|
std::string getPortName( unsigned int ) { 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& ) {}; |
|
|
|
void initialize( const std::string& /*clientName*/ ) {} |
|
|
|
}; |
|
|
|
|
|
|
|
class MidiOutDummy: public MidiOutApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
MidiOutDummy( const std::string ) { errorString_ = "MidiOutDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); }; |
|
|
|
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }; |
|
|
|
void openPort( unsigned int, const std::string ) {}; |
|
|
|
void openVirtualPort( const std::string ) {}; |
|
|
|
void closePort( void ) {}; |
|
|
|
unsigned int getPortCount( void ) { return 0; }; |
|
|
|
std::string getPortName( unsigned int ) { return ""; }; |
|
|
|
void sendMessage( std::vector<unsigned char>* ) {}; |
|
|
|
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& ) {}; |
|
|
|
void initialize( const std::string& /*clientName*/ ) {} |
|
|
|
}; |
|
|
|
|
|
|
|
#endif |
|
|
|