00001 /**********************************************************************/ 00036 /**********************************************************************/ 00037 00038 // RtMidi: Version 1.0.11 00039 00040 #ifndef RTMIDI_H 00041 #define RTMIDI_H 00042 00043 #include "RtError.h" 00044 #include <string> 00045 00046 class RtMidi 00047 { 00048 public: 00049 00051 virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0; 00052 00054 virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; 00055 00057 virtual unsigned int getPortCount() = 0; 00058 00060 virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; 00061 00063 virtual void closePort( void ) = 0; 00064 00065 protected: 00066 00067 RtMidi(); 00068 virtual ~RtMidi() {}; 00069 00070 // A basic error reporting function for internal use in the RtMidi 00071 // subclasses. The behavior of this function can be modified to 00072 // suit specific needs. 00073 void error( RtError::Type type ); 00074 00075 void *apiData_; 00076 bool connected_; 00077 std::string errorString_; 00078 }; 00079 00080 /**********************************************************************/ 00096 /**********************************************************************/ 00097 00098 #include <vector> 00099 #include <queue> 00100 00101 class RtMidiIn : public RtMidi 00102 { 00103 public: 00104 00106 typedef void (*RtMidiCallback)( double timeStamp, std::vector<unsigned char> *message, void *userData); 00107 00109 00112 RtMidiIn( const std::string clientName = std::string( "RtMidi Input Client") ); 00113 00115 ~RtMidiIn(); 00116 00118 00122 void openPort( unsigned int portNumber = 0, const std::string Portname = std::string( "RtMidi Input" ) ); 00123 00125 00131 void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); 00132 00134 00140 void setCallback( RtMidiCallback callback, void *userData = 0 ); 00141 00143 00147 void cancelCallback(); 00148 00150 void closePort( void ); 00151 00153 unsigned int getPortCount(); 00154 00156 00159 std::string getPortName( unsigned int portNumber = 0 ); 00160 00162 00166 void setQueueSizeLimit( unsigned int queueSize ); 00167 00169 00176 void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); 00177 00179 00186 double getMessage( std::vector<unsigned char> *message ); 00187 00188 // A MIDI structure used internally by the class to store incoming 00189 // messages. Each message represents one and only one MIDI message. 00190 struct MidiMessage { 00191 std::vector<unsigned char> bytes; 00192 double timeStamp; 00193 00194 // Default constructor. 00195 MidiMessage() 00196 :bytes(3), timeStamp(0.0) {} 00197 }; 00198 00199 // The RtMidiInData structure is used to pass private class data to 00200 // the MIDI input handling function or thread. 00201 struct RtMidiInData { 00202 std::queue<MidiMessage> queue; 00203 MidiMessage message; 00204 unsigned int queueLimit; 00205 unsigned char ignoreFlags; 00206 bool doInput; 00207 bool firstMessage; 00208 void *apiData; 00209 bool usingCallback; 00210 void *userCallback; 00211 void *userData; 00212 bool continueSysex; 00213 00214 // Default constructor. 00215 RtMidiInData() 00216 : queueLimit(1024), ignoreFlags(7), doInput(false), firstMessage(true), 00217 apiData(0), usingCallback(false), userCallback(0), userData(0), 00218 continueSysex(false) {} 00219 }; 00220 00221 private: 00222 00223 void initialize( const std::string& clientName ); 00224 RtMidiInData inputData_; 00225 00226 }; 00227 00228 /**********************************************************************/ 00240 /**********************************************************************/ 00241 00242 class RtMidiOut : public RtMidi 00243 { 00244 public: 00245 00247 00250 RtMidiOut( const std::string clientName = std::string( "RtMidi Output Client" ) ); 00251 00253 ~RtMidiOut(); 00254 00256 00262 void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) ); 00263 00265 void closePort(); 00266 00268 00276 void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); 00277 00279 unsigned int getPortCount(); 00280 00282 00285 std::string getPortName( unsigned int portNumber = 0 ); 00286 00288 00292 void sendMessage( std::vector<unsigned char> *message ); 00293 00294 private: 00295 00296 void initialize( const std::string& clientName ); 00297 }; 00298 00299 #endif
©2003-2009 Gary P. Scavone, McGill University. All Rights Reserved. Maintained by Gary P. Scavone, gary at music.mcgill.ca |