Mercurial > hg > svcore
comparison data/midi/rtmidi/RtMidi.h @ 559:32d156c75df7
* midi stubs (this revision will not compile)
author | Chris Cannam |
---|---|
date | Mon, 23 Feb 2009 11:41:28 +0000 |
parents | |
children | ecce042cc374 |
comparison
equal
deleted
inserted
replaced
558:1d7ebc05157e | 559:32d156c75df7 |
---|---|
1 /**********************************************************************/ | |
2 /*! \class RtMidi | |
3 \brief An abstract base class for realtime MIDI input/output. | |
4 | |
5 This class implements some common functionality for the realtime | |
6 MIDI input/output subclasses RtMidiIn and RtMidiOut. | |
7 | |
8 RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ | |
9 | |
10 RtMidi: realtime MIDI i/o C++ classes | |
11 Copyright (c) 2003-2007 Gary P. Scavone | |
12 | |
13 Permission is hereby granted, free of charge, to any person | |
14 obtaining a copy of this software and associated documentation files | |
15 (the "Software"), to deal in the Software without restriction, | |
16 including without limitation the rights to use, copy, modify, merge, | |
17 publish, distribute, sublicense, and/or sell copies of the Software, | |
18 and to permit persons to whom the Software is furnished to do so, | |
19 subject to the following conditions: | |
20 | |
21 The above copyright notice and this permission notice shall be | |
22 included in all copies or substantial portions of the Software. | |
23 | |
24 Any person wishing to distribute modifications to the Software is | |
25 requested to send the modifications to the original developer so that | |
26 they can be incorporated into the canonical version. | |
27 | |
28 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
29 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
30 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
31 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |
32 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
33 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
34 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
35 */ | |
36 /**********************************************************************/ | |
37 | |
38 // RtMidi: Version 1.0.7 | |
39 | |
40 #ifndef RTMIDI_H | |
41 #define RTMIDI_H | |
42 | |
43 #include "RtError.h" | |
44 #include <string> | |
45 | |
46 class RtMidi | |
47 { | |
48 public: | |
49 | |
50 //! Pure virtual openPort() function. | |
51 virtual void openPort( unsigned int portNumber = 0 ) = 0; | |
52 | |
53 //! Pure virtual openVirtualPort() function. | |
54 virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; | |
55 | |
56 //! Pure virtual getPortCount() function. | |
57 virtual unsigned int getPortCount() = 0; | |
58 | |
59 //! Pure virtual getPortName() function. | |
60 virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; | |
61 | |
62 //! Pure virtual closePort() function. | |
63 virtual void closePort( void ) = 0; | |
64 | |
65 protected: | |
66 | |
67 RtMidi(); | |
68 virtual ~RtMidi() {}; | |
69 | |
70 // A basic error reporting function for internal use in the RtMidi | |
71 // subclasses. The behavior of this function can be modified to | |
72 // suit specific needs. | |
73 void error( RtError::Type type ); | |
74 | |
75 void *apiData_; | |
76 bool connected_; | |
77 std::string errorString_; | |
78 }; | |
79 | |
80 /**********************************************************************/ | |
81 /*! \class RtMidiIn | |
82 \brief A realtime MIDI input class. | |
83 | |
84 This class provides a common, platform-independent API for | |
85 realtime MIDI input. It allows access to a single MIDI input | |
86 port. Incoming MIDI messages are either saved to a queue for | |
87 retrieval using the getMessage() function or immediately passed to | |
88 a user-specified callback function. Create multiple instances of | |
89 this class to connect to more than one MIDI device at the same | |
90 time. With the OS-X and Linux ALSA MIDI APIs, it is also possible | |
91 to open a virtual input port to which other MIDI software clients | |
92 can connect. | |
93 | |
94 by Gary P. Scavone, 2003-2004. | |
95 */ | |
96 /**********************************************************************/ | |
97 | |
98 #include <vector> | |
99 #include <queue> | |
100 | |
101 class RtMidiIn : public RtMidi | |
102 { | |
103 public: | |
104 | |
105 //! User callback function type definition. | |
106 typedef void (*RtMidiCallback)( double timeStamp, std::vector<unsigned char> *message, void *userData); | |
107 | |
108 //! Default constructor. | |
109 /*! | |
110 An exception will be thrown if a MIDI system initialization error occurs. | |
111 */ | |
112 RtMidiIn(); | |
113 | |
114 //! If a MIDI connection is still open, it will be closed by the destructor. | |
115 ~RtMidiIn(); | |
116 | |
117 //! Open a MIDI input connection. | |
118 /*! | |
119 An optional port number greater than 0 can be specified. | |
120 Otherwise, the default or first port found is opened. | |
121 */ | |
122 void openPort( unsigned int portNumber = 0 ); | |
123 | |
124 //! Create a virtual input port, with optional name, to allow software connections (OS X and ALSA only). | |
125 /*! | |
126 This function creates a virtual MIDI input port to which other | |
127 software applications can connect. This type of functionality | |
128 is currently only supported by the Macintosh OS-X and Linux ALSA | |
129 APIs (the function does nothing for the other APIs). | |
130 */ | |
131 void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); | |
132 | |
133 //! Set a callback function to be invoked for incoming MIDI messages. | |
134 /*! | |
135 The callback function will be called whenever an incoming MIDI | |
136 message is received. While not absolutely necessary, it is best | |
137 to set the callback function before opening a MIDI port to avoid | |
138 leaving some messages in the queue. | |
139 */ | |
140 void setCallback( RtMidiCallback callback, void *userData = 0 ); | |
141 | |
142 //! Cancel use of the current callback function (if one exists). | |
143 /*! | |
144 Subsequent incoming MIDI messages will be written to the queue | |
145 and can be retrieved with the \e getMessage function. | |
146 */ | |
147 void cancelCallback(); | |
148 | |
149 //! Close an open MIDI connection (if one exists). | |
150 void closePort( void ); | |
151 | |
152 //! Return the number of available MIDI input ports. | |
153 unsigned int getPortCount(); | |
154 | |
155 //! Return a string identifier for the specified MIDI input port number. | |
156 /*! | |
157 An exception is thrown if an invalid port specifier is provided. | |
158 */ | |
159 std::string getPortName( unsigned int portNumber = 0 ); | |
160 | |
161 //! Set the maximum number of MIDI messages to be saved in the queue. | |
162 /*! | |
163 If the queue size limit is reached, incoming messages will be | |
164 ignored. The default limit is 1024. | |
165 */ | |
166 void setQueueSizeLimit( unsigned int queueSize ); | |
167 | |
168 //! Specify whether certain MIDI message types should be queued or ignored during input. | |
169 /*! | |
170 By default, MIDI timing and active sensing messages are ignored | |
171 during message input because of their relative high data rates. | |
172 MIDI sysex messages are ignored by default as well. Variable | |
173 values of "true" imply that the respective message type will be | |
174 ignored. | |
175 */ | |
176 void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); | |
177 | |
178 //! 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. | |
179 /*! | |
180 This function returns immediately whether a new message is | |
181 available or not. A valid message is indicated by a non-zero | |
182 vector size. An exception is thrown if an error occurs during | |
183 message retrieval or an input connection was not previously | |
184 established. | |
185 */ | |
186 double getMessage( std::vector<unsigned char> *message ); | |
187 | |
188 // A MIDI structure used internally by the class to store incoming | |
189 // messages. Each message represents one and only one MIDI message. | |
190 struct MidiMessage { | |
191 std::vector<unsigned char> bytes; | |
192 double timeStamp; | |
193 | |
194 // Default constructor. | |
195 MidiMessage() | |
196 :bytes(3), timeStamp(0.0) {} | |
197 }; | |
198 | |
199 // The RtMidiInData structure is used to pass private class data to | |
200 // the MIDI input handling function or thread. | |
201 struct RtMidiInData { | |
202 std::queue<MidiMessage> queue; | |
203 unsigned int queueLimit; | |
204 unsigned char ignoreFlags; | |
205 bool doInput; | |
206 bool firstMessage; | |
207 void *apiData; | |
208 bool usingCallback; | |
209 void *userCallback; | |
210 void *userData; | |
211 | |
212 // Default constructor. | |
213 RtMidiInData() | |
214 : queueLimit(1024), ignoreFlags(7), doInput(false), firstMessage(true), | |
215 apiData(0), usingCallback(false), userCallback(0), userData(0) {} | |
216 }; | |
217 | |
218 private: | |
219 | |
220 void initialize( void ); | |
221 RtMidiInData inputData_; | |
222 | |
223 }; | |
224 | |
225 /**********************************************************************/ | |
226 /*! \class RtMidiOut | |
227 \brief A realtime MIDI output class. | |
228 | |
229 This class provides a common, platform-independent API for MIDI | |
230 output. It allows one to probe available MIDI output ports, to | |
231 connect to one such port, and to send MIDI bytes immediately over | |
232 the connection. Create multiple instances of this class to | |
233 connect to more than one MIDI device at the same time. | |
234 | |
235 by Gary P. Scavone, 2003-2004. | |
236 */ | |
237 /**********************************************************************/ | |
238 | |
239 class RtMidiOut : public RtMidi | |
240 { | |
241 public: | |
242 | |
243 //! Default constructor. | |
244 /*! | |
245 An exception will be thrown if a MIDI system initialization error occurs. | |
246 */ | |
247 RtMidiOut(); | |
248 | |
249 //! The destructor closes any open MIDI connections. | |
250 ~RtMidiOut(); | |
251 | |
252 //! Open a MIDI output connection. | |
253 /*! | |
254 An optional port number greater than 0 can be specified. | |
255 Otherwise, the default or first port found is opened. An | |
256 exception is thrown if an error occurs while attempting to make | |
257 the port connection. | |
258 */ | |
259 void openPort( unsigned int portNumber = 0 ); | |
260 | |
261 //! Close an open MIDI connection (if one exists). | |
262 void closePort(); | |
263 | |
264 //! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only). | |
265 /*! | |
266 This function creates a virtual MIDI output port to which other | |
267 software applications can connect. This type of functionality | |
268 is currently only supported by the Macintosh OS-X and Linux ALSA | |
269 APIs (the function does nothing with the other APIs). An | |
270 exception is thrown if an error occurs while attempting to create | |
271 the virtual port. | |
272 */ | |
273 void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); | |
274 | |
275 //! Return the number of available MIDI output ports. | |
276 unsigned int getPortCount(); | |
277 | |
278 //! Return a string identifier for the specified MIDI port type and number. | |
279 /*! | |
280 An exception is thrown if an invalid port specifier is provided. | |
281 */ | |
282 std::string getPortName( unsigned int portNumber = 0 ); | |
283 | |
284 //! Immediately send a single message out an open MIDI output port. | |
285 /*! | |
286 An exception is thrown if an error occurs during output or an | |
287 output connection was not previously established. | |
288 */ | |
289 void sendMessage( std::vector<unsigned char> *message ); | |
290 | |
291 private: | |
292 | |
293 void initialize( void ); | |
294 }; | |
295 | |
296 #endif |