47 #if defined _WIN32 || defined __CYGWIN__
48 #if defined(RTMIDI_EXPORT)
49 #define RTMIDI_DLL_PUBLIC __declspec(dllexport)
51 #define RTMIDI_DLL_PUBLIC
55 #define RTMIDI_DLL_PUBLIC __attribute__( (visibility( "default" )) )
57 #define RTMIDI_DLL_PUBLIC
61 #define RTMIDI_VERSION "4.0.0"
98 : message_(message), type_(type) {}
104 virtual void printMessage(
void )
const throw() { std::cerr <<
'\n' << message_ <<
"\n\n"; }
107 virtual const Type&
getType(
void )
const throw() {
return type_; }
110 virtual const std::string&
getMessage(
void )
const throw() {
return message_; }
113 virtual const char*
what(
void )
const throw() {
return message_.c_str(); }
116 std::string message_;
147 static std::string getVersion(
void ) throw();
155 static
void getCompiledApi( std::vector<
RtMidi::Api> &apis ) throw();
163 static std::
string getApiName(
RtMidi::Api api );
170 static std::
string getApiDisplayName(
RtMidi::Api api );
178 static
RtMidi::Api getCompiledApiByName( const std::
string &name );
181 virtual
void openPort(
unsigned int portNumber = 0, const std::
string &portName = std::
string( "
RtMidi" ) ) = 0;
184 virtual
void openVirtualPort( const std::
string &portName = std::
string( "RtMidi" ) ) = 0;
187 virtual
unsigned int getPortCount() = 0;
190 virtual std::
string getPortName(
unsigned int portNumber = 0 ) = 0;
193 virtual
void closePort(
void ) = 0;
195 void setClientName( const std::
string &clientName );
196 void setPortName( const std::
string &portName );
203 virtual
bool isPortOpen(
void ) const = 0;
210 virtual
void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 ) = 0;
253 typedef void (*RtMidiCallback)(
double timeStamp, std::vector<unsigned char> *message,
void *userData );
274 const std::string& clientName =
"RtMidi Input Client",
275 unsigned int queueSizeLimit = 100 );
281 RtMidi::
Api getCurrentApi(
void ) throw();
289 void openPort(
unsigned int portNumber = 0, const std::
string &portName = std::
string( "RtMidi Input" ) );
301 void openVirtualPort( const std::
string &portName = std::
string( "RtMidi Input" ) );
314 void setCallback( RtMidiCallback callback,
void *userData = 0 );
321 void cancelCallback();
324 void closePort(
void );
331 virtual
bool isPortOpen() const;
337 unsigned int getPortCount();
345 std::
string getPortName(
unsigned int portNumber = 0 );
355 void ignoreTypes(
bool midiSysex = true,
bool midiTime = true,
bool midiSense = true );
365 double getMessage( std::vector<
unsigned char> *message );
372 virtual
void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 );
375 void openMidiApi( RtMidi::
Api api, const std::
string &clientName,
unsigned int queueSizeLimit );
404 const std::string& clientName =
"RtMidi Output Client" );
419 void openPort(
unsigned int portNumber = 0,
const std::string &portName = std::string(
"RtMidi Output" ) );
422 void closePort(
void );
429 virtual bool isPortOpen()
const;
440 void openVirtualPort(
const std::string &portName = std::string(
"RtMidi Output" ) );
443 unsigned int getPortCount(
void );
451 std::string getPortName(
unsigned int portNumber = 0 );
458 void sendMessage(
const std::vector<unsigned char> *message );
468 void sendMessage(
const unsigned char *message,
size_t size );
475 virtual void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 );
478 void openMidiApi(
RtMidi::Api api,
const std::string &clientName );
495 class RTMIDI_DLL_PUBLIC MidiApi
502 virtual void openPort(
unsigned int portNumber,
const std::string &portName ) = 0;
503 virtual void openVirtualPort(
const std::string &portName ) = 0;
504 virtual void closePort(
void ) = 0;
505 virtual void setClientName(
const std::string &clientName ) = 0;
506 virtual void setPortName(
const std::string &portName ) = 0;
508 virtual unsigned int getPortCount(
void ) = 0;
509 virtual std::string getPortName(
unsigned int portNumber ) = 0;
511 inline bool isPortOpen()
const {
return connected_; }
518 virtual void initialize(
const std::string& clientName ) = 0;
522 std::string errorString_;
524 bool firstErrorOccurred_;
525 void *errorCallbackUserData_;
528 class RTMIDI_DLL_PUBLIC MidiInApi :
public MidiApi
532 MidiInApi(
unsigned int queueSizeLimit );
533 virtual ~MidiInApi(
void );
535 void cancelCallback(
void );
536 virtual void ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense );
537 double getMessage( std::vector<unsigned char> *message );
542 std::vector<unsigned char> bytes;
549 : bytes(0), timeStamp(0.0) {}
555 unsigned int ringSize;
560 : front(0), back(0), ringSize(0), ring(0) {}
561 bool push(
const MidiMessage& );
562 bool pop( std::vector<unsigned char>*,
double* );
563 unsigned int size(
unsigned int *back=0,
unsigned int *front=0 );
568 struct RtMidiInData {
571 unsigned char ignoreFlags;
582 : ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false),
583 userCallback(0), userData(0), continueSysex(false) {}
587 RtMidiInData inputData_;
590 class RTMIDI_DLL_PUBLIC MidiOutApi :
public MidiApi
595 virtual ~MidiOutApi(
void );
596 virtual void sendMessage(
const unsigned char *message,
size_t size ) = 0;
606 inline void RtMidiIn :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
610 inline void RtMidiIn :: setCallback( RtMidiCallback callback,
void *userData ) {
static_cast<MidiInApi *
>(rtapi_)->setCallback( callback, userData ); }
614 inline void RtMidiIn :: ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense ) {
static_cast<MidiInApi *
>(rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
615 inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) {
return static_cast<MidiInApi *
>(rtapi_)->getMessage( message ); }
619 inline void RtMidiOut :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
625 inline void RtMidiOut :: sendMessage(
const std::vector<unsigned char> *message ) {
static_cast<MidiOutApi *
>(rtapi_)->sendMessage( &message->at(0), message->size() ); }
626 inline void RtMidiOut :: sendMessage(
const unsigned char *message,
size_t size ) {
static_cast<MidiOutApi *
>(rtapi_)->sendMessage( message, size ); }