1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
|
<HTML>
<HEAD>
<TITLE>The RtAudio Tutorial</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<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>
<HR>
<!-- Generated by Doxygen 1.2.8.1 -->
<h1>RtAudio.h</h1><div class="fragment"><pre>00001 <font class="comment">/************************************************************************/</font>
00038 <font class="comment">/************************************************************************/</font>
00039
00040 <font class="preprocessor">#if !defined(__RTAUDIO_H)</font>
00041 <font class="preprocessor"></font><font class="preprocessor">#define __RTAUDIO_H</font>
00042 <font class="preprocessor"></font>
00043 <font class="preprocessor">#include <map></font>
00044
00045 <font class="preprocessor">#if defined(__LINUX_ALSA__)</font>
00046 <font class="preprocessor"></font><font class="preprocessor"> #include <alsa/asoundlib.h></font>
00047 <font class="preprocessor"> #include <pthread.h></font>
00048 <font class="preprocessor"> #include <unistd.h></font>
00049
00050 <font class="keyword">typedef</font> snd_pcm_t *AUDIO_HANDLE;
00051 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
00052 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
00053 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
00054
00055 <font class="preprocessor">#elif defined(__LINUX_OSS__)</font>
00056 <font class="preprocessor"></font><font class="preprocessor"> #include <pthread.h></font>
00057 <font class="preprocessor"> #include <unistd.h></font>
00058
00059 <font class="keyword">typedef</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
00060 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
00061 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
00062 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
00063
00064 <font class="preprocessor">#elif defined(__WINDOWS_DS__)</font>
00065 <font class="preprocessor"></font><font class="preprocessor"> #include <windows.h></font>
00066 <font class="preprocessor"> #include <process.h></font>
00067
00068 <font class="comment">// The following struct is used to hold the extra variables</font>
00069 <font class="comment">// specific to the DirectSound implementation.</font>
00070 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
00071 <font class="keywordtype">void</font> * object;
00072 <font class="keywordtype">void</font> * buffer;
00073 UINT bufferPointer;
00074 } AUDIO_HANDLE;
00075
00076 <font class="keyword">typedef</font> LPGUID DEVICE_ID;
00077 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> THREAD_HANDLE;
00078 <font class="keyword">typedef</font> CRITICAL_SECTION MUTEX;
00079
00080 <font class="preprocessor">#elif defined(__WINDOWS_ASIO__)</font>
00081 <font class="preprocessor"></font><font class="preprocessor"> #include <windows.h></font>
00082 <font class="preprocessor"> #include <process.h></font>
00083
00084 <font class="keyword">typedef</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
00085 <font class="keyword">typedef</font> <font class="keywordtype">int</font> DEVICE_ID;
00086 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> THREAD_HANDLE;
00087 <font class="keyword">typedef</font> CRITICAL_SECTION MUTEX;
00088
00089 <font class="preprocessor">#elif defined(__IRIX_AL__)</font>
00090 <font class="preprocessor"></font><font class="preprocessor"> #include <dmedia/audio.h></font>
00091 <font class="preprocessor"> #include <pthread.h></font>
00092 <font class="preprocessor"> #include <unistd.h></font>
00093
00094 <font class="keyword">typedef</font> ALport AUDIO_HANDLE;
00095 <font class="keyword">typedef</font> <font class="keywordtype">long</font> DEVICE_ID;
00096 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
00097 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
00098
00099 <font class="preprocessor">#elif defined(__MACOSX_CORE__)</font>
00100 <font class="preprocessor"></font>
00101 <font class="preprocessor"> #include <CoreServices/CoreServices.h></font>
00102 <font class="preprocessor"> #include <CoreAudio/AudioHardware.h></font>
00103 <font class="preprocessor"> #include <pthread.h></font>
00104
00105 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> AUDIO_HANDLE;
00106 <font class="keyword">typedef</font> AudioDeviceID DEVICE_ID;
00107 <font class="keyword">typedef</font> pthread_t THREAD_HANDLE;
00108 <font class="keyword">typedef</font> pthread_mutex_t MUTEX;
00109
00110 <font class="preprocessor">#endif</font>
00111 <font class="preprocessor"></font>
00112
00113 <font class="comment">/************************************************************************/</font>
00126 <font class="comment">/************************************************************************/</font>
00127
00128 <font class="keyword">class </font><a class="code" href="classRtError.html">RtError</a>
00129 {
00130 <font class="keyword">public</font>:
<a name="l00132"></a><a class="code" href="classRtError.html#s11">00132</a> <font class="keyword">enum</font> TYPE {
00133 WARNING,
00134 DEBUG_WARNING,
00135 UNSPECIFIED,
00136 NO_DEVICES_FOUND,
00137 INVALID_DEVICE,
00138 INVALID_STREAM,
00139 MEMORY_ERROR,
00140 INVALID_PARAMETER,
00141 DRIVER_ERROR,
00142 SYSTEM_ERROR,
00143 THREAD_ERROR
00144 };
00145
00146 <font class="keyword">protected</font>:
00147 <font class="keywordtype">char</font> error_message[256];
00148 TYPE type;
00149
00150 <font class="keyword">public</font>:
00152 <a class="code" href="classRtError.html#a0">RtError</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *p, TYPE tipe = RtError::UNSPECIFIED);
00153
00155 <font class="keyword">virtual</font> <a class="code" href="classRtError.html#a1">~RtError</a>(<font class="keywordtype">void</font>);
00156
00158 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classRtError.html#a2">printMessage</a>(<font class="keywordtype">void</font>);
00159
<a name="l00161"></a><a class="code" href="classRtError.html#a3">00161</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; }
00162
<a name="l00164"></a><a class="code" href="classRtError.html#a4">00164</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; }
00165 };
00166
00167
00168 <font class="comment">// This public structure type is used to pass callback information</font>
00169 <font class="comment">// between the private RtAudio stream structure and global callback</font>
00170 <font class="comment">// handling functions.</font>
00171 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
00172 <font class="keywordtype">void</font> *object; <font class="comment">// Used as a "this" pointer.</font>
00173 <font class="keywordtype">int</font> streamId;
00174 DEVICE_ID device[2];
00175 THREAD_HANDLE thread;
00176 <font class="keywordtype">void</font> *callback;
00177 <font class="keywordtype">void</font> *buffers;
00178 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> waitTime;
00179 <font class="keywordtype">bool</font> blockTick;
00180 <font class="keywordtype">bool</font> stopStream;
00181 <font class="keywordtype">bool</font> usingCallback;
00182 <font class="keywordtype">void</font> *userData;
00183 } CALLBACK_INFO;
00184
00185
00186 <font class="comment">// *************************************************** //</font>
00187 <font class="comment">//</font>
00188 <font class="comment">// RtAudio class declaration.</font>
00189 <font class="comment">//</font>
00190 <font class="comment">// *************************************************** //</font>
00191
00192 <font class="keyword">class </font><a class="code" href="classRtAudio.html">RtAudio</a>
00193 {
00194 <font class="keyword">public</font>:
00195
00196 <font class="comment">// Support for signed integers and floats. Audio data fed to/from</font>
00197 <font class="comment">// the tickStream() routine is assumed to ALWAYS be in host</font>
00198 <font class="comment">// byte order. The internal routines will automatically take care of</font>
00199 <font class="comment">// any necessary byte-swapping between the host format and the</font>
00200 <font class="comment">// soundcard. Thus, endian-ness is not a concern in the following</font>
00201 <font class="comment">// format definitions.</font>
00202 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> RTAUDIO_FORMAT;
<a name="l00203"></a><a class="code" href="classRtAudio.html#p0">00203</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT8;
<a name="l00204"></a><a class="code" href="classRtAudio.html#p1">00204</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT16;
<a name="l00205"></a><a class="code" href="classRtAudio.html#p2">00205</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT24;
<a name="l00206"></a><a class="code" href="classRtAudio.html#p3">00206</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_SINT32;
<a name="l00207"></a><a class="code" href="classRtAudio.html#p4">00207</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_FLOAT32;
<a name="l00208"></a><a class="code" href="classRtAudio.html#p5">00208</a> <font class="keyword">static</font> <font class="keyword">const</font> RTAUDIO_FORMAT RTAUDIO_FLOAT64;
00210 <font class="comment">//static const int MAX_SAMPLE_RATES = 14;</font>
00211 <font class="keyword">enum</font> { MAX_SAMPLE_RATES = 14 };
00212
00213 <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);
00214
<a name="l00216"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html">00216</a> <font class="keyword">typedef</font> <font class="keyword">struct </font>{
<a name="l00217"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m0">00217</a> <font class="keywordtype">char</font> name[128];
00218 DEVICE_ID id[2]; <font class="comment">/* No value reported by getDeviceInfo(). */</font>
<a name="l00219"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m2">00219</a> <font class="keywordtype">bool</font> probed;
<a name="l00220"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m3">00220</a> <font class="keywordtype">int</font> maxOutputChannels;
<a name="l00221"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m4">00221</a> <font class="keywordtype">int</font> maxInputChannels;
<a name="l00222"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m5">00222</a> <font class="keywordtype">int</font> maxDuplexChannels;
<a name="l00223"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m6">00223</a> <font class="keywordtype">int</font> minOutputChannels;
<a name="l00224"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m7">00224</a> <font class="keywordtype">int</font> minInputChannels;
<a name="l00225"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m8">00225</a> <font class="keywordtype">int</font> minDuplexChannels;
<a name="l00226"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m9">00226</a> <font class="keywordtype">bool</font> hasDuplexSupport;
<a name="l00227"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m10">00227</a> <font class="keywordtype">bool</font> isDefault;
<a name="l00228"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m11">00228</a> <font class="keywordtype">int</font> nSampleRates;
<a name="l00229"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m12">00229</a> <font class="keywordtype">int</font> sampleRates[MAX_SAMPLE_RATES];
<a name="l00230"></a><a class="code" href="structRtAudio_1_1RTAUDIO__DEVICE.html#m13">00230</a> RTAUDIO_FORMAT nativeFormats;
00231 } RTAUDIO_DEVICE;
00232
00234
00240 <a class="code" href="classRtAudio.html#a0">RtAudio</a>();
00241
00243
00254 <a class="code" href="classRtAudio.html#a0">RtAudio</a>(<font class="keywordtype">int</font> *streamId,
00255 <font class="keywordtype">int</font> outputDevice, <font class="keywordtype">int</font> outputChannels,
00256 <font class="keywordtype">int</font> inputDevice, <font class="keywordtype">int</font> inputChannels,
00257 RTAUDIO_FORMAT format, <font class="keywordtype">int</font> sampleRate,
00258 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
00259
00261
00265 <a class="code" href="classRtAudio.html#a2">~RtAudio</a>();
00266
00268
00295 <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,
00296 <font class="keywordtype">int</font> inputDevice, <font class="keywordtype">int</font> inputChannels,
00297 RTAUDIO_FORMAT format, <font class="keywordtype">int</font> sampleRate,
00298 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
00299
00301
00320 <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);
00321
00323
00330 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a5">cancelStreamCallback</a>(<font class="keywordtype">int</font> streamId);
00331
00333 <font class="keywordtype">int</font> <a class="code" href="classRtAudio.html#a6">getDeviceCount</a>(<font class="keywordtype">void</font>);
00334
00336
00344 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a7">getDeviceInfo</a>(<font class="keywordtype">int</font> device, RTAUDIO_DEVICE *info);
00345
00347
00352 <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);
00353
00355
00360 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a9">tickStream</a>(<font class="keywordtype">int</font> streamId);
00361
00363
00367 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a10">closeStream</a>(<font class="keywordtype">int</font> streamId);
00368
00370
00374 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a11">startStream</a>(<font class="keywordtype">int</font> streamId);
00375
00377
00381 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a12">stopStream</a>(<font class="keywordtype">int</font> streamId);
00382
00384
00388 <font class="keywordtype">void</font> <a class="code" href="classRtAudio.html#a13">abortStream</a>(<font class="keywordtype">int</font> streamId);
00389
00391
00396 <font class="keywordtype">int</font> <a class="code" href="classRtAudio.html#a14">streamWillBlock</a>(<font class="keywordtype">int</font> streamId);
00397
00398 <font class="preprocessor">#if (defined(__MACOSX_CORE__) || defined(__WINDOWS_ASIO__))</font>
00399 <font class="preprocessor"></font> <font class="comment">// This function is intended for internal use only. It must be</font>
00400 <font class="comment">// public because it is called by the internal callback handler,</font>
00401 <font class="comment">// which is not a member of RtAudio. External use of this function</font>
00402 <font class="comment">// will most likely produce highly undesireable results!</font>
00403 <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);
00404 <font class="preprocessor">#endif</font>
00405 <font class="preprocessor"></font>
00406 <font class="keyword">protected</font>:
00407
00408 <font class="keyword">private</font>:
00409
00410 <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];
00411
00412 <font class="keyword">enum</font> { FAILURE, SUCCESS };
00413
00414 <font class="keyword">enum</font> STREAM_MODE {
00415 OUTPUT,
00416 INPUT,
00417 DUPLEX,
00418 UNINITIALIZED = -75
00419 };
00420
00421 <font class="keyword">enum</font> STREAM_STATE {
00422 STREAM_STOPPED,
00423 STREAM_RUNNING
00424 };
00425
00426 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
00427 <font class="keywordtype">int</font> device[2]; <font class="comment">// Playback and record, respectively.</font>
00428 STREAM_MODE mode; <font class="comment">// OUTPUT, INPUT, or DUPLEX.</font>
00429 AUDIO_HANDLE handle[2]; <font class="comment">// Playback and record handles, respectively.</font>
00430 STREAM_STATE state; <font class="comment">// STOPPED or RUNNING</font>
00431 <font class="keywordtype">char</font> *userBuffer;
00432 <font class="keywordtype">char</font> *deviceBuffer;
00433 <font class="keywordtype">bool</font> doConvertBuffer[2]; <font class="comment">// Playback and record, respectively.</font>
00434 <font class="keywordtype">bool</font> deInterleave[2]; <font class="comment">// Playback and record, respectively.</font>
00435 <font class="keywordtype">bool</font> doByteSwap[2]; <font class="comment">// Playback and record, respectively.</font>
00436 <font class="keywordtype">int</font> sampleRate;
00437 <font class="keywordtype">int</font> bufferSize;
00438 <font class="keywordtype">int</font> nBuffers;
00439 <font class="keywordtype">int</font> nUserChannels[2]; <font class="comment">// Playback and record, respectively.</font>
00440 <font class="keywordtype">int</font> nDeviceChannels[2]; <font class="comment">// Playback and record channels, respectively.</font>
00441 RTAUDIO_FORMAT userFormat;
00442 RTAUDIO_FORMAT deviceFormat[2]; <font class="comment">// Playback and record, respectively.</font>
00443 MUTEX mutex;
00444 CALLBACK_INFO callbackInfo;
00445 } RTAUDIO_STREAM;
00446
00447 <font class="keyword">typedef</font> <font class="keywordtype">signed</font> <font class="keywordtype">short</font> INT16;
00448 <font class="keyword">typedef</font> <font class="keywordtype">signed</font> <font class="keywordtype">int</font> INT32;
00449 <font class="keyword">typedef</font> <font class="keywordtype">float</font> FLOAT32;
00450 <font class="keyword">typedef</font> <font class="keywordtype">double</font> FLOAT64;
00451
00452 <font class="keywordtype">char</font> message[256];
00453 <font class="keywordtype">int</font> nDevices;
00454 RTAUDIO_DEVICE *devices;
00455
00456 std::map<int, void *> streams;
00457
00459 <font class="keywordtype">void</font> error(RtError::TYPE type);
00460
00465 <font class="keywordtype">void</font> initialize(<font class="keywordtype">void</font>);
00466
00471 <font class="keywordtype">int</font> getDefaultInputDevice(<font class="keywordtype">void</font>);
00472
00477 <font class="keywordtype">int</font> getDefaultOutputDevice(<font class="keywordtype">void</font>);
00478
00480 <font class="keywordtype">void</font> clearDeviceInfo(RTAUDIO_DEVICE *info);
00481
00489 <font class="keywordtype">void</font> probeDeviceInfo(RTAUDIO_DEVICE *info);
00490
00497 <font class="keywordtype">bool</font> probeDeviceOpen(<font class="keywordtype">int</font> device, RTAUDIO_STREAM *stream,
00498 STREAM_MODE mode, <font class="keywordtype">int</font> channels,
00499 <font class="keywordtype">int</font> sampleRate, RTAUDIO_FORMAT format,
00500 <font class="keywordtype">int</font> *bufferSize, <font class="keywordtype">int</font> numberOfBuffers);
00501
00508 <font class="keywordtype">void</font> *verifyStream(<font class="keywordtype">int</font> streamId);
00509
00514 <font class="keywordtype">void</font> convertStreamBuffer(RTAUDIO_STREAM *stream, STREAM_MODE mode);
00515
00517 <font class="keywordtype">void</font> byteSwapBuffer(<font class="keywordtype">char</font> *buffer, <font class="keywordtype">int</font> samples, RTAUDIO_FORMAT format);
00518
00520 <font class="keywordtype">int</font> formatBytes(RTAUDIO_FORMAT format);
00521 };
00522
00523 <font class="comment">// Define the following flag to have extra information spewed to stderr.</font>
00524 <font class="comment">//#define __RTAUDIO_DEBUG__</font>
00525
00526 <font class="preprocessor">#endif</font>
</font></pre></div><HR>
<table><tr><td><img src="../images/ccrma.gif">
<td>©2001-2002 Gary P. Scavone, CCRMA, Stanford University. All Rights Reserved.<br>
Maintained by Gary P. Scavone, <a href="mailto:gary@ccrma.stanford.edu">gary@ccrma.stanford.edu</a><P>
</table>
</BODY>
</HTML>
|