3 <TITLE>The RtAudio Tutorial</TITLE>
4 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
6 <BODY BGCOLOR="#FFFFFF">
8 <a class="qindex" href="index.html">Tutorial</a> <a class="qindex" href="annotated.html">Class/Enum List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </CENTER>
10 <!-- Generated by Doxygen 1.2.8.1 -->
11 <h1>RtAudio.h</h1><div class="fragment"><pre>00001 <font class="comment">/************************************************************************/</font>
12 00038 <font class="comment">/************************************************************************/</font>
14 00040 <font class="preprocessor">#if !defined(__RTAUDIO_H)</font>
15 00041 <font class="preprocessor"></font><font class="preprocessor">#define __RTAUDIO_H</font>
16 00042 <font class="preprocessor"></font>
17 00043 <font class="preprocessor">#include <map></font>
19 00045 <font class="preprocessor">#if defined(__LINUX_ALSA__)</font>
20 00046 <font class="preprocessor"></font><font class="preprocessor"> #include <alsa/asoundlib.h></font>
21 00047 <font class="preprocessor"> #include <pthread.h></font>
22 00048 <font class="preprocessor"> #include <unistd.h></font>
24 00050 <font class="keyword">typedef</font> snd_pcm_t *AUDIO_HANDLE;
25 00051 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
26 00052 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
27 00053 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
29 00055 <font class="preprocessor">#elif defined(__LINUX_OSS__)</font>
30 00056 <font class="preprocessor"></font><font class="preprocessor"> #include <pthread.h></font>
31 00057 <font class="preprocessor"> #include <unistd.h></font>
33 00059 <font class="keyword">typedef</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
34 00060 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
35 00061 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
36 00062 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
38 00064 <font class="preprocessor">#elif defined(__WINDOWS_DS__)</font>
39 00065 <font class="preprocessor"></font><font class="preprocessor"> #include <windows.h></font>
40 00066 <font class="preprocessor"> #include <process.h></font>
42 00068 <font class="comment">// The following struct is used to hold the extra variables</font>
43 00069 <font class="comment">// specific to the DirectSound implementation.</font>
44 00070 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
45 00071 <font class="keywordtype">void</font> * object;
46 00072 <font class="keywordtype">void</font> * buffer;
47 00073 UINT bufferPointer;
50 00076 <font class="keyword">typedef</font> LPGUID DEVICE_ID;
51 00077 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> THREAD_HANDLE;
52 00078 <font class="keyword">typedef</font> CRITICAL_SECTION MUTEX;
54 00080 <font class="preprocessor">#elif defined(__WINDOWS_ASIO__)</font>
55 00081 <font class="preprocessor"></font><font class="preprocessor"> #include <windows.h></font>
56 00082 <font class="preprocessor"> #include <process.h></font>
58 00084 <font class="keyword">typedef</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
59 00085 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
60 00086 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> THREAD_HANDLE;
61 00087 <font class="keyword">typedef</font> CRITICAL_SECTION MUTEX;
63 00089 <font class="preprocessor">#elif defined(__IRIX_AL__)</font>
64 00090 <font class="preprocessor"></font><font class="preprocessor"> #include <dmedia/audio.h></font>
65 00091 <font class="preprocessor"> #include <pthread.h></font>
66 00092 <font class="preprocessor"> #include <unistd.h></font>
68 00094 <font class="keyword">typedef</font> ALport AUDIO_HANDLE;
69 00095 <font class="keyword">typedef</font> <font class="keywordtype">long</font> DEVICE_ID;
70 00096 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
71 00097 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
73 00099 <font class="preprocessor">#elif defined(__MACOSX_CORE__)</font>
74 00100 <font class="preprocessor"></font>
75 00101 <font class="preprocessor"> #include <CoreAudio/AudioHardware.h></font>
76 00102 <font class="preprocessor"> #include <pthread.h></font>
78 00104 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
79 00105 <font class="keyword">typedef</font> AudioDeviceID DEVICE_ID;
80 00106 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
81 00107 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
83 00109 <font class="preprocessor">#endif</font>
84 00110 <font class="preprocessor"></font>
86 00112 <font class="comment">/************************************************************************/</font>
87 00125 <font class="comment">/************************************************************************/</font>
89 00127 <font class="keyword">class </font><a class="code" href="classRtError.html">RtError</a>
91 00129 <font class="keyword">public</font>:
92 <a name="l00131"></a><a class="code" href="classRtError.html#s11">00131</a> <font class="keyword">enum</font> TYPE {
96 00135 NO_DEVICES_FOUND,
100 00139 INVALID_PARAMETER,
106 00145 <font class="keyword">protected</font>:
107 00146 <font class="keywordtype">char</font> error_message[256];
110 00149 <font class="keyword">public</font>:
111 00151 <a class="code" href="classRtError.html#a0">RtError</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *p, TYPE tipe = RtError::UNSPECIFIED);
113 00154 <font class="keyword">virtual</font> <a class="code" href="classRtError.html#a1">~RtError</a>(<font class="keywordtype">void</font>);
115 00157 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classRtError.html#a2">printMessage</a>(<font class="keywordtype">void</font>);
117 <a name="l00160"></a><a class="code" href="classRtError.html#a3">00160</a> <font class="keyword">virtual</font> <font class="keyword">const</font> TYPE& <a class="code" href="classRtError.html#a3">getType</a>(<font class="keywordtype">void</font>)<font class="keyword"> </font>{ <font class="keywordflow">return</font> type; }
119 <a name="l00163"></a><a class="code" href="classRtError.html#a4">00163</a> <font class="keyword">virtual</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="classRtError.html#a4">getMessage</a>(<font class="keywordtype">void</font>)<font class="keyword"> </font>{ <font class="keywordflow">return</font> error_message; }
123 00167 <font class="comment">// This public structure type is used to pass callback information</font>
124 00168 <font class="comment">// between the private RtAudio stream structure and global callback</font>
125 00169 <font class="comment">// handling functions.</font>
126 00170 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
127 00171 <font class="keywordtype">void</font> *object; <font class="comment">// Used as a "this" pointer.</font>
128 00172 <font class="keywordtype">int</font> streamId;
129 00173 DEVICE_ID device[2];
130 00174 THREAD_HANDLE thread;
131 00175 <font class="keywordtype">void</font> *callback;
132 00176 <font class="keywordtype">void</font> *buffers;
133 00177 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> waitTime;
134 00178 <font class="keywordtype">bool</font> blockTick;
135 00179 <font class="keywordtype">bool</font> stopStream;
136 00180 <font class="keywordtype">bool</font> usingCallback;
137 00181 <font class="keywordtype">void</font> *userData;
138 00182 } CALLBACK_INFO;
141 00185 <font class="comment">// *************************************************** //</font>
142 00186 <font class="comment">//</font>
143 00187 <font class="comment">// RtAudio class declaration.</font>
144 00188 <font class="comment">//</font>
145 00189 <font class="comment">// *************************************************** //</font>
147 00191 <font class="keyword">class </font><a class="code" href="classRtAudio.html">RtAudio</a>
149 00193 <font class="keyword">public</font>:
151 00195 <font class="comment">// Support for signed integers and floats. Audio data fed to/from</font>
152 00196 <font class="comment">// the tickStream() routine is assumed to ALWAYS be in host</font>
153 00197 <font class="comment">// byte order. The internal routines will automatically take care of</font>
154 00198 <font class="comment">// any necessary byte-swapping between the host format and the</font>
155 00199 <font class="comment">// soundcard. Thus, endian-ness is not a concern in the following</font>
156 00200 <font class="comment">// format definitions.</font>
157 00201 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> RTAUDIO_FORMAT;
158 <a name="l00202"></a><a class="code" href="classRtAudio.html#p0">00202</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT8;
159 <a name="l00203"></a><a class="code" href="classRtAudio.html#p1">00203</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT16;
160 <a name="l00204"></a><a class="code" href="classRtAudio.html#p2">00204</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT24;
161 <a name="l00205"></a><a class="code" href="classRtAudio.html#p3">00205</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT32;
162 <a name="l00206"></a><a class="code" href="classRtAudio.html#p4">00206</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_FLOAT32;
163 <a name="l00207"></a><a class="code" href="classRtAudio.html#p5">00207</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_FLOAT64;
164 00209 <font class="comment">//static const int MAX_SAMPLE_RATES = 14;</font>
165 00210 <font class="keyword">enum</font> { MAX_SAMPLE_RATES = 14 };
167 00212 <font class="keyword">typedef</font> int (*RTAUDIO_CALLBACK)(<font class="keywordtype">char</font> *buffer, <font class="keywordtype">int</font> bufferSize, <font class="keywordtype">void</font> *userData);
169 <a name="l00215"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html">00215</a> <font class="keyword">typedef</font> <font class="keyword">struct </font>{
170 <a name="l00216"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m0">00216</a> <font class="keywordtype">char</font> name[128];
171 00217 DEVICE_ID id[2]; <font class="comment">/* No value reported by getDeviceInfo(). */</font>
172 <a name="l00218"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m2">00218</a> <font class="keywordtype">bool</font> probed;
173 <a name="l00219"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m3">00219</a> <font class="keywordtype">int</font> maxOutputChannels;
174 <a name="l00220"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m4">00220</a> <font class="keywordtype">int</font> maxInputChannels;
175 <a name="l00221"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m5">00221</a> <font class="keywordtype">int</font> maxDuplexChannels;
176 <a name="l00222"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m6">00222</a> <font class="keywordtype">int</font> minOutputChannels;
177 <a name="l00223"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m7">00223</a> <font class="keywordtype">int</font> minInputChannels;
178 <a name="l00224"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m8">00224</a> <font class="keywordtype">int</font> minDuplexChannels;
179 <a name="l00225"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m9">00225</a> <font class="keywordtype">bool</font> hasDuplexSupport;
180 <a name="l00226"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m10">00226</a> <font class="keywordtype">bool</font> isDefault;
181 <a name="l00227"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m11">00227</a> <font class="keywordtype">int</font> nSampleRates;
182 <a name="l00228"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m12">00228</a> <font class="keywordtype">int</font> sampleRates[MAX_SAMPLE_RATES];
183 <a name="l00229"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m13">00229</a> RTAUDIO_FORMAT nativeFormats;
184 00230 } RTAUDIO_DEVICE;
187 00239 <a class="code" href="classRtAudio.html#a0">RtAudio</a>();
190 00253 <a class="code" href="classRtAudio.html#a0">RtAudio</a>(<font class="keywordtype">int</font> *streamId,
191 00254 <font class="keywordtype">int</font> outputDevice, <font class="keywordtype">int</font> outputChannels,
192 00255 <font class="keywordtype">int</font> inputDevice, <font class="keywordtype">int</font> inputChannels,
193 00256 RTAUDIO_FORMAT format, <font class="keywordtype">int</font> sampleRate,
194 00257 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
197 00264 <a class="code" href="classRtAudio.html#a2">~RtAudio</a>();
200 00294 <font class="keywordtype">int</font> <a class="code" href="classRtAudio.html#a3">openStream</a>(<font class="keywordtype">int</font> outputDevice, <font class="keywordtype">int</font> outputChannels,
201 00295 <font class="keywordtype">int</font> inputDevice, <font class="keywordtype">int</font> inputChannels,
202 00296 RTAUDIO_FORMAT format, <font class="keywordtype">int</font> sampleRate,
203 00297 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
206 00319 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a4">setStreamCallback</a>(<font class="keywordtype">int</font> streamId, RTAUDIO_CALLBACK callback, <font class="keywordtype">void</font> *userData);
209 00329 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a5">cancelStreamCallback</a>(<font class="keywordtype">int</font> streamId);
211 00332 <font class="keywordtype">int</font> <a class="code" href="classRtAudio.html#a6">getDeviceCount</a>(<font class="keywordtype">void</font>);
214 00343 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a7">getDeviceInfo</a>(<font class="keywordtype">int</font> device, RTAUDIO_DEVICE *info);
217 00351 <font class="keywordtype">char</font> * <font class="keyword">const</font> <a class="code" href="classRtAudio.html#a8">getStreamBuffer</a>(<font class="keywordtype">int</font> streamId);
220 00359 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a9">tickStream</a>(<font class="keywordtype">int</font> streamId);
223 00366 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a10">closeStream</a>(<font class="keywordtype">int</font> streamId);
226 00373 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a11">startStream</a>(<font class="keywordtype">int</font> streamId);
229 00380 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a12">stopStream</a>(<font class="keywordtype">int</font> streamId);
232 00387 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a13">abortStream</a>(<font class="keywordtype">int</font> streamId);
235 00395 <font class="keywordtype">int</font> <a class="code" href="classRtAudio.html#a14">streamWillBlock</a>(<font class="keywordtype">int</font> streamId);
237 00397 <font class="preprocessor">#if (defined(__MACOSX_CORE__) || defined(__WINDOWS_ASIO__))</font>
238 00398 <font class="preprocessor"></font> <font class="comment">// This function is intended for internal use only. It must be</font>
239 00399 <font class="comment">// public because it is called by the internal callback handler,</font>
240 00400 <font class="comment">// which is not a member of RtAudio. External use of this function</font>
241 00401 <font class="comment">// will most likely produce highly undesireable results!</font>
242 00402 <font class="keywordtype">void</font> callbackEvent(<font class="keywordtype">int</font> streamId, DEVICE_ID deviceId, <font class="keywordtype">void</font> *inData, <font class="keywordtype">void</font> *outData);
243 00403 <font class="preprocessor">#endif</font>
244 00404 <font class="preprocessor"></font>
245 00405 <font class="keyword">protected</font>:
247 00407 <font class="keyword">private</font>:
249 00409 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> SAMPLE_RATES[MAX_SAMPLE_RATES];
251 00411 <font class="keyword">enum</font> { FAILURE, SUCCESS };
253 00413 <font class="keyword">enum</font> STREAM_MODE {
257 00417 UNINITIALIZED = -75
260 00420 <font class="keyword">enum</font> STREAM_STATE {
261 00421 STREAM_STOPPED,
265 00425 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
266 00426 <font class="keywordtype">int</font> device[2]; <font class="comment">// Playback and record, respectively.</font>
267 00427 STREAM_MODE mode; <font class="comment">// OUTPUT, INPUT, or DUPLEX.</font>
268 00428 AUDIO_HANDLE handle[2]; <font class="comment">// Playback and record handles, respectively.</font>
269 00429 STREAM_STATE state; <font class="comment">// STOPPED or RUNNING</font>
270 00430 <font class="keywordtype">char</font> *userBuffer;
271 00431 <font class="keywordtype">char</font> *deviceBuffer;
272 00432 <font class="keywordtype">bool</font> doConvertBuffer[2]; <font class="comment">// Playback and record, respectively.</font>
273 00433 <font class="keywordtype">bool</font> deInterleave[2]; <font class="comment">// Playback and record, respectively.</font>
274 00434 <font class="keywordtype">bool</font> doByteSwap[2]; <font class="comment">// Playback and record, respectively.</font>
275 00435 <font class="keywordtype">int</font> sampleRate;
276 00436 <font class="keywordtype">int</font> bufferSize;
277 00437 <font class="keywordtype">int</font> nBuffers;
278 00438 <font class="keywordtype">int</font> nUserChannels[2]; <font class="comment">// Playback and record, respectively.</font>
279 00439 <font class="keywordtype">int</font> nDeviceChannels[2]; <font class="comment">// Playback and record channels, respectively.</font>
280 00440 RTAUDIO_FORMAT userFormat;
281 00441 RTAUDIO_FORMAT deviceFormat[2]; <font class="comment">// Playback and record, respectively.</font>
283 00443 CALLBACK_INFO callbackInfo;
284 00444 } RTAUDIO_STREAM;
286 00446 <font class="keyword">typedef</font> <font class="keywordtype">signed</font> <font class="keywordtype">short</font> INT16;
287 00447 <font class="keyword">typedef</font> <font class="keywordtype">signed</font> <font class="keywordtype">int</font> INT32;
288 00448 <font class="keyword">typedef</font> <font class="keywordtype">float</font> FLOAT32;
289 00449 <font class="keyword">typedef</font> <font class="keywordtype">double</font> FLOAT64;
291 00451 <font class="keywordtype">char</font> message[256];
292 00452 <font class="keywordtype">int</font> nDevices;
293 00453 RTAUDIO_DEVICE *devices;
295 00455 std::map<int, void *> streams;
297 00458 <font class="keywordtype">void</font> error(RtError::TYPE type);
299 00464 <font class="keywordtype">void</font> initialize(<font class="keywordtype">void</font>);
301 00470 <font class="keywordtype">int</font> getDefaultInputDevice(<font class="keywordtype">void</font>);
303 00476 <font class="keywordtype">int</font> getDefaultOutputDevice(<font class="keywordtype">void</font>);
305 00479 <font class="keywordtype">void</font> clearDeviceInfo(RTAUDIO_DEVICE *info);
307 00488 <font class="keywordtype">void</font> probeDeviceInfo(RTAUDIO_DEVICE *info);
309 00496 <font class="keywordtype">bool</font> probeDeviceOpen(<font class="keywordtype">int</font> device, RTAUDIO_STREAM *stream,
310 00497 STREAM_MODE mode, <font class="keywordtype">int</font> channels,
311 00498 <font class="keywordtype">int</font> sampleRate, RTAUDIO_FORMAT format,
312 00499 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
314 00507 <font class="keywordtype">void</font> *verifyStream(<font class="keywordtype">int</font> streamId);
316 00513 <font class="keywordtype">void</font> convertStreamBuffer(RTAUDIO_STREAM *stream, STREAM_MODE mode);
318 00516 <font class="keywordtype">void</font> byteSwapBuffer(<font class="keywordtype">char</font> *buffer, <font class="keywordtype">int</font> samples, RTAUDIO_FORMAT format);
320 00519 <font class="keywordtype">int</font> formatBytes(RTAUDIO_FORMAT format);
323 00522 <font class="comment">// Define the following flag to have extra information spewed to stderr.</font>
324 00523 <font class="comment">//#define __RTAUDIO_DEBUG__</font>
326 00525 <font class="preprocessor">#endif</font>
327 </font></pre></div><HR>
329 <table><tr><td><img src="../images/ccrma.gif">
330 <td>©2001-2002 Gary P. Scavone, CCRMA, Stanford University. All Rights Reserved.<br>
331 Maintained by Gary P. Scavone, <a href="mailto:gary@ccrma.stanford.edu">gary@ccrma.stanford.edu</a><P>