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 "5.0.0"
99 : message_(message), type_(type) {}
105 virtual void printMessage(
void )
const throw() { std::cerr <<
'\n' << message_ <<
"\n\n"; }
108 virtual const Type&
getType(
void )
const throw() {
return type_; }
111 virtual const std::string&
getMessage(
void )
const throw() {
return message_; }
114 virtual const char*
what(
void )
const throw() {
return message_.c_str(); }
117 std::string message_;
151 static std::string getVersion(
void ) throw();
159 static
void getCompiledApi( std::vector<
RtMidi::Api> &apis ) throw();
167 static std::
string getApiName(
RtMidi::Api api );
174 static std::
string getApiDisplayName(
RtMidi::Api api );
182 static
RtMidi::Api getCompiledApiByName( const std::
string &name );
185 virtual
void openPort(
unsigned int portNumber = 0, const std::
string &portName = std::
string( "
RtMidi" ) ) = 0;
188 virtual
void openVirtualPort( const std::
string &portName = std::
string( "RtMidi" ) ) = 0;
191 virtual
unsigned int getPortCount() = 0;
194 virtual std::
string getPortName(
unsigned int portNumber = 0 ) = 0;
197 virtual
void closePort(
void ) = 0;
199 void setClientName( const std::
string &clientName );
200 void setPortName( const std::
string &portName );
207 virtual
bool isPortOpen(
void ) const = 0;
214 virtual
void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 ) = 0;
222 RtMidi(RtMidi& other) = delete;
223 RtMidi& operator=(RtMidi& other) = delete;
260 typedef void (*RtMidiCallback)(
double timeStamp, std::vector<unsigned char> *message,
void *userData );
281 const std::string& clientName =
"RtMidi Input Client",
282 unsigned int queueSizeLimit = 100 );
290 RtMidi::Api getCurrentApi(
void ) throw();
298 void openPort(
unsigned int portNumber = 0, const std::
string &portName = std::
string( "RtMidi Input" ) );
310 void openVirtualPort( const std::
string &portName = std::
string( "RtMidi Input" ) );
323 void setCallback( RtMidiCallback callback,
void *userData = 0 );
330 void cancelCallback();
333 void closePort(
void );
340 virtual
bool isPortOpen() const;
346 unsigned int getPortCount();
354 std::
string getPortName(
unsigned int portNumber = 0 );
364 void ignoreTypes(
bool midiSysex = true,
bool midiTime = true,
bool midiSense = true );
374 double getMessage( std::vector<
unsigned char> *message );
381 virtual
void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 );
394 virtual
void setBufferSize(
unsigned int size,
unsigned int count );
397 void openMidiApi( RtMidi::Api api, const std::
string &clientName,
unsigned int queueSizeLimit );
426 const std::string& clientName =
"RtMidi Output Client" );
443 void openPort(
unsigned int portNumber = 0,
const std::string &portName = std::string(
"RtMidi Output" ) );
446 void closePort(
void );
453 virtual bool isPortOpen()
const;
464 void openVirtualPort(
const std::string &portName = std::string(
"RtMidi Output" ) );
467 unsigned int getPortCount(
void );
475 std::string getPortName(
unsigned int portNumber = 0 );
482 void sendMessage(
const std::vector<unsigned char> *message );
492 void sendMessage(
const unsigned char *message,
size_t size );
499 virtual void setErrorCallback(
RtMidiErrorCallback errorCallback = NULL,
void *userData = 0 );
502 void openMidiApi(
RtMidi::Api api,
const std::string &clientName );
519 class RTMIDI_DLL_PUBLIC MidiApi
526 virtual void openPort(
unsigned int portNumber,
const std::string &portName ) = 0;
527 virtual void openVirtualPort(
const std::string &portName ) = 0;
528 virtual void closePort(
void ) = 0;
529 virtual void setClientName(
const std::string &clientName ) = 0;
530 virtual void setPortName(
const std::string &portName ) = 0;
532 virtual unsigned int getPortCount(
void ) = 0;
533 virtual std::string getPortName(
unsigned int portNumber ) = 0;
535 inline bool isPortOpen()
const {
return connected_; }
542 virtual void initialize(
const std::string& clientName ) = 0;
546 std::string errorString_;
548 bool firstErrorOccurred_;
549 void *errorCallbackUserData_;
553 class RTMIDI_DLL_PUBLIC MidiInApi :
public MidiApi
557 MidiInApi(
unsigned int queueSizeLimit );
558 virtual ~MidiInApi(
void );
560 void cancelCallback(
void );
561 virtual void ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense );
562 double getMessage( std::vector<unsigned char> *message );
563 virtual void setBufferSize(
unsigned int size,
unsigned int count );
568 std::vector<unsigned char> bytes;
575 : bytes(0), timeStamp(0.0) {}
581 unsigned int ringSize;
586 : front(0), back(0), ringSize(0), ring(0) {}
587 bool push(
const MidiMessage& );
588 bool pop( std::vector<unsigned char>*,
double* );
589 unsigned int size(
unsigned int *back=0,
unsigned int *front=0 );
594 struct RtMidiInData {
597 unsigned char ignoreFlags;
605 unsigned int bufferSize;
606 unsigned int bufferCount;
610 : ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false),
611 userCallback(0), userData(0), continueSysex(false), bufferSize(1024), bufferCount(4) {}
615 RtMidiInData inputData_;
618 class RTMIDI_DLL_PUBLIC MidiOutApi :
public MidiApi
623 virtual ~MidiOutApi(
void );
624 virtual void sendMessage(
const unsigned char *message,
size_t size ) = 0;
634 inline void RtMidiIn :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
638 inline void RtMidiIn :: setCallback( RtMidiCallback callback,
void *userData ) {
static_cast<MidiInApi *
>(rtapi_)->setCallback( callback, userData ); }
642 inline void RtMidiIn :: ignoreTypes(
bool midiSysex,
bool midiTime,
bool midiSense ) {
static_cast<MidiInApi *
>(rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
643 inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) {
return static_cast<MidiInApi *
>(rtapi_)->getMessage( message ); }
645 inline void RtMidiIn :: setBufferSize(
unsigned int size,
unsigned int count ) {
static_cast<MidiInApi *
>(rtapi_)->setBufferSize(size, count); }
648 inline void RtMidiOut :: openPort(
unsigned int portNumber,
const std::string &portName ) { rtapi_->openPort( portNumber, portName ); }
654 inline void RtMidiOut :: sendMessage(
const std::vector<unsigned char> *message ) {
static_cast<MidiOutApi *
>(rtapi_)->sendMessage( &message->at(0), message->size() ); }
655 inline void RtMidiOut :: sendMessage(
const unsigned char *message,
size_t size ) {
static_cast<MidiOutApi *
>(rtapi_)->sendMessage( message, size ); }