Release 3.0 tarball
[rtaudio.git] / doc / html / RtAudio_8h-source.html
1 <HTML>
2 <HEAD>
3 <TITLE>The RtAudio Tutorial</TITLE>
4 <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
5 </HEAD>
6 <BODY BGCOLOR="#FFFFFF">
7 <CENTER>
8 <a class="qindex" href="index.html">Tutorial</a> &nbsp; <a class="qindex" href="annotated.html">Class/Enum List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </CENTER>
9 <HR>
10 <!-- Generated by Doxygen 1.3.4 -->
11 <h1>RtAudio.h</h1><div class="fragment"><pre>00001 <span class="comment">/************************************************************************/</span>
12 00038 <span class="comment">/************************************************************************/</span>
13 00039 
14 00040 <span class="comment">// RtAudio: Version 3.0, 11 March 2004</span>
15 00041 
16 00042 <span class="preprocessor">#ifndef __RTAUDIO_H</span>
17 00043 <span class="preprocessor"></span><span class="preprocessor">#define __RTAUDIO_H</span>
18 00044 <span class="preprocessor"></span>
19 00045 <span class="preprocessor">#include "RtError.h"</span>
20 00046 <span class="preprocessor">#include &lt;string&gt;</span>
21 00047 <span class="preprocessor">#include &lt;vector&gt;</span>
22 00048 
23 00049 <span class="comment">// Operating system dependent thread functionality.</span>
24 00050 <span class="preprocessor">#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)</span>
25 00051 <span class="preprocessor"></span><span class="preprocessor">  #include &lt;windows.h&gt;</span>
26 00052 <span class="preprocessor">  #include &lt;process.h&gt;</span>
27 00053 
28 00054   <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ThreadHandle;
29 00055   <span class="keyword">typedef</span> CRITICAL_SECTION StreamMutex;
30 00056 
31 00057 <span class="preprocessor">#else // Various unix flavors with pthread support.</span>
32 00058 <span class="preprocessor"></span><span class="preprocessor">  #include &lt;pthread.h&gt;</span>
33 00059 
34 00060   <span class="keyword">typedef</span> pthread_t ThreadHandle;
35 00061   <span class="keyword">typedef</span> pthread_mutex_t StreamMutex;
36 00062 
37 00063 <span class="preprocessor">#endif</span>
38 00064 <span class="preprocessor"></span>
39 00065 <span class="comment">// This global structure type is used to pass callback information</span>
40 00066 <span class="comment">// between the private RtAudio stream structure and global callback</span>
41 00067 <span class="comment">// handling functions.</span>
42 00068 <span class="keyword">struct </span>CallbackInfo {
43 00069   <span class="keywordtype">void</span> *object;    <span class="comment">// Used as a "this" pointer.</span>
44 00070   ThreadHandle thread;
45 00071   <span class="keywordtype">bool</span> usingCallback;
46 00072   <span class="keywordtype">void</span> *callback;
47 00073   <span class="keywordtype">void</span> *userData;
48 00074   <span class="keywordtype">void</span> *apiInfo;   <span class="comment">// void pointer for API specific callback information</span>
49 00075 
50 00076   <span class="comment">// Default constructor.</span>
51 00077   CallbackInfo()
52 00078     :object(0), usingCallback(false), callback(0),
53 00079      userData(0), apiInfo(0) {}
54 00080 };
55 00081 
56 00082 <span class="comment">// Support for signed integers and floats.  Audio data fed to/from</span>
57 00083 <span class="comment">// the tickStream() routine is assumed to ALWAYS be in host</span>
58 00084 <span class="comment">// byte order.  The internal routines will automatically take care of</span>
59 00085 <span class="comment">// any necessary byte-swapping between the host format and the</span>
60 00086 <span class="comment">// soundcard.  Thus, endian-ness is not a concern in the following</span>
61 00087 <span class="comment">// format definitions.</span>
62 00088 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> RtAudioFormat;
63 00089 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT8 = 0x1;    
64 00090 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT16 = 0x2;   
65 00091 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT24 = 0x4;   
66 00092 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_SINT32 = 0x8;   
67 00093 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_FLOAT32 = 0x10; 
68 00094 <span class="keyword">static</span> <span class="keyword">const</span> RtAudioFormat RTAUDIO_FLOAT64 = 0x20; 
69 00096 <span class="keyword">typedef</span> int (*RtAudioCallback)(<span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> bufferSize, <span class="keywordtype">void</span> *userData);
70 00097 
71 <a name="l00099"></a><a class="code" href="structRtAudioDeviceInfo.html">00099</a> <span class="keyword">struct </span><a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> {
72 <a name="l00100"></a><a class="code" href="structRtAudioDeviceInfo.html#o0">00100</a>   std::string <a class="code" href="structRtAudioDeviceInfo.html#o0">name</a>;      
73 <a name="l00101"></a><a class="code" href="structRtAudioDeviceInfo.html#o1">00101</a>   <span class="keywordtype">bool</span> <a class="code" href="structRtAudioDeviceInfo.html#o1">probed</a>;          
74 <a name="l00102"></a><a class="code" href="structRtAudioDeviceInfo.html#o2">00102</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o2">outputChannels</a>;   
75 <a name="l00103"></a><a class="code" href="structRtAudioDeviceInfo.html#o3">00103</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o3">inputChannels</a>;    
76 <a name="l00104"></a><a class="code" href="structRtAudioDeviceInfo.html#o4">00104</a>   <span class="keywordtype">int</span> <a class="code" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a>;   
77 <a name="l00105"></a><a class="code" href="structRtAudioDeviceInfo.html#o5">00105</a>   <span class="keywordtype">bool</span> <a class="code" href="structRtAudioDeviceInfo.html#o5">isDefault</a>;       
78 <a name="l00106"></a><a class="code" href="structRtAudioDeviceInfo.html#o6">00106</a>   std::vector&lt;int&gt; <a class="code" href="structRtAudioDeviceInfo.html#o6">sampleRates</a>; 
79 <a name="l00107"></a><a class="code" href="structRtAudioDeviceInfo.html#o7">00107</a>   RtAudioFormat <a class="code" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a>;  
80 00109   <span class="comment">// Default constructor.</span>
81 00110   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a>()
82 00111     :<a class="code" href="structRtAudioDeviceInfo.html#o1">probed</a>(false), <a class="code" href="structRtAudioDeviceInfo.html#o2">outputChannels</a>(0), <a class="code" href="structRtAudioDeviceInfo.html#o3">inputChannels</a>(0),
83 00112        <a class="code" href="structRtAudioDeviceInfo.html#o4">duplexChannels</a>(0), <a class="code" href="structRtAudioDeviceInfo.html#o5">isDefault</a>(false), <a class="code" href="structRtAudioDeviceInfo.html#o7">nativeFormats</a>(0) {}
84 00113 };
85 00114 
86 00115 <span class="comment">// **************************************************************** //</span>
87 00116 <span class="comment">//</span>
88 00117 <span class="comment">// RtApi class declaration.</span>
89 00118 <span class="comment">//</span>
90 00119 <span class="comment">// Note that RtApi is an abstract base class and cannot be</span>
91 00120 <span class="comment">// explicitly instantiated.  The class RtAudio will create an</span>
92 00121 <span class="comment">// instance of an RtApi subclass (RtApiOss, RtApiAlsa,</span>
93 00122 <span class="comment">// RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio).</span>
94 00123 <span class="comment">//</span>
95 00124 <span class="comment">// **************************************************************** //</span>
96 00125 
97 00126 <span class="keyword">class </span>RtApi
98 00127 {
99 00128 <span class="keyword">public</span>:
100 00129 
101 00130   RtApi();
102 00131   <span class="keyword">virtual</span> ~RtApi();
103 00132   <span class="keywordtype">void</span> openStream( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
104 00133                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
105 00134                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
106 00135                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
107 00136   <span class="keyword">virtual</span> <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData ) = 0;
108 00137   <span class="keyword">virtual</span> <span class="keywordtype">void</span> cancelStreamCallback() = 0;
109 00138   <span class="keywordtype">int</span> getDeviceCount(<span class="keywordtype">void</span>);
110 00139   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> getDeviceInfo( <span class="keywordtype">int</span> device );
111 00140   <span class="keywordtype">char</span> * <span class="keyword">const</span> getStreamBuffer();
112 00141   <span class="keyword">virtual</span> <span class="keywordtype">void</span> tickStream() = 0;
113 00142   <span class="keyword">virtual</span> <span class="keywordtype">void</span> closeStream();
114 00143   <span class="keyword">virtual</span> <span class="keywordtype">void</span> startStream() = 0;
115 00144   <span class="keyword">virtual</span> <span class="keywordtype">void</span> stopStream() = 0;
116 00145   <span class="keyword">virtual</span> <span class="keywordtype">void</span> abortStream() = 0;
117 00146 
118 00147 <span class="keyword">protected</span>:
119 00148 
120 00149   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MAX_SAMPLE_RATES;
121 00150   <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SAMPLE_RATES[];
122 00151 
123 00152   <span class="keyword">enum</span> { FAILURE, SUCCESS };
124 00153 
125 00154   <span class="keyword">enum</span> StreamMode {
126 00155     OUTPUT,
127 00156     INPUT,
128 00157     DUPLEX,
129 00158     UNINITIALIZED = -75
130 00159   };
131 00160 
132 00161   <span class="keyword">enum</span> StreamState {
133 00162     STREAM_STOPPED,
134 00163     STREAM_RUNNING
135 00164   };
136 00165 
137 00166   <span class="comment">// A protected structure for audio streams.</span>
138 00167   <span class="keyword">struct </span>RtApiStream {
139 00168     <span class="keywordtype">int</span> device[2];          <span class="comment">// Playback and record, respectively.</span>
140 00169     <span class="keywordtype">void</span> *apiHandle;        <span class="comment">// void pointer for API specific stream handle information</span>
141 00170     StreamMode mode;         <span class="comment">// OUTPUT, INPUT, or DUPLEX.</span>
142 00171     StreamState state;       <span class="comment">// STOPPED or RUNNING</span>
143 00172     <span class="keywordtype">char</span> *userBuffer;
144 00173     <span class="keywordtype">char</span> *deviceBuffer;
145 00174     <span class="keywordtype">bool</span> doConvertBuffer[2]; <span class="comment">// Playback and record, respectively.</span>
146 00175     <span class="keywordtype">bool</span> deInterleave[2];    <span class="comment">// Playback and record, respectively.</span>
147 00176     <span class="keywordtype">bool</span> doByteSwap[2];      <span class="comment">// Playback and record, respectively.</span>
148 00177     <span class="keywordtype">int</span> sampleRate;
149 00178     <span class="keywordtype">int</span> bufferSize;
150 00179     <span class="keywordtype">int</span> nBuffers;
151 00180     <span class="keywordtype">int</span> nUserChannels[2];    <span class="comment">// Playback and record, respectively.</span>
152 00181     <span class="keywordtype">int</span> nDeviceChannels[2];  <span class="comment">// Playback and record channels, respectively.</span>
153 00182     RtAudioFormat userFormat;
154 00183     RtAudioFormat deviceFormat[2]; <span class="comment">// Playback and record, respectively.</span>
155 00184     StreamMutex mutex;
156 00185     CallbackInfo callbackInfo;
157 00186 
158 00187     RtApiStream()
159 00188       :apiHandle(0), userBuffer(0), deviceBuffer(0) {}
160 00189     <span class="comment">//      :apiHandle(0), mode(UNINITIALIZED), state(STREAM_STOPPED),</span>
161 00190     <span class="comment">//       userBuffer(0), deviceBuffer(0) {}</span>
162 00191   };
163 00192 
164 00193   <span class="comment">// A protected device structure for audio devices.</span>
165 00194   <span class="keyword">struct </span>RtApiDevice {
166 00195     std::string name;      
167 00196     <span class="keywordtype">bool</span> probed;           
168 00197     <span class="keywordtype">void</span> *apiDeviceId;     <span class="comment">// void pointer for API specific device information</span>
169 00198     <span class="keywordtype">int</span> maxOutputChannels; 
170 00199     <span class="keywordtype">int</span> maxInputChannels;  
171 00200     <span class="keywordtype">int</span> maxDuplexChannels; 
172 00201     <span class="keywordtype">int</span> minOutputChannels; 
173 00202     <span class="keywordtype">int</span> minInputChannels;  
174 00203     <span class="keywordtype">int</span> minDuplexChannels; 
175 00204     <span class="keywordtype">bool</span> hasDuplexSupport; 
176 00205     <span class="keywordtype">bool</span> isDefault;        
177 00206     std::vector&lt;int&gt; sampleRates; 
178 00207     RtAudioFormat nativeFormats;  
179 00209     <span class="comment">// Default constructor.</span>
180 00210     RtApiDevice()
181 00211       :probed(false), apiDeviceId(0), maxOutputChannels(0), maxInputChannels(0),
182 00212        maxDuplexChannels(0), minOutputChannels(0), minInputChannels(0),
183 00213        minDuplexChannels(0), isDefault(false), nativeFormats(0) {}
184 00214   };
185 00215 
186 00216   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> Int16;
187 00217   <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> Int32;
188 00218   <span class="keyword">typedef</span> <span class="keywordtype">float</span> Float32;
189 00219   <span class="keyword">typedef</span> <span class="keywordtype">double</span> Float64;
190 00220 
191 00221   <span class="keywordtype">char</span> message_[256];
192 00222   <span class="keywordtype">int</span> nDevices_;
193 00223   std::vector&lt;RtApiDevice&gt; devices_;
194 00224   RtApiStream stream_;
195 00225 
196 00230   <span class="keyword">virtual</span> <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>) = 0;
197 00231 
198 00240   <span class="keyword">virtual</span> <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
199 00241 
200 00250   <span class="keyword">virtual</span> <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
201 00251                                 <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
202 00252                                 <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
203 00253 
204 00258   <span class="keyword">virtual</span> <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
205 00259 
206 00264   <span class="keyword">virtual</span> <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
207 00265 
208 00267   <span class="keywordtype">void</span> clearDeviceInfo( RtApiDevice *info );
209 00268 
210 00270   <span class="keywordtype">void</span> clearStreamInfo();
211 00271 
212 00273   <span class="keywordtype">void</span> error( RtError::Type type );
213 00274 
214 00279   <span class="keywordtype">void</span> verifyStream();
215 00280 
216 00285   <span class="keywordtype">void</span> convertStreamBuffer( StreamMode mode );
217 00286 
218 00288   <span class="keywordtype">void</span> byteSwapBuffer( <span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> samples, RtAudioFormat format );
219 00289 
220 00291   <span class="keywordtype">int</span> formatBytes( RtAudioFormat format );
221 00292 };
222 00293 
223 00294 
224 00295 <span class="comment">// **************************************************************** //</span>
225 00296 <span class="comment">//</span>
226 00297 <span class="comment">// RtAudio class declaration.</span>
227 00298 <span class="comment">//</span>
228 00299 <span class="comment">// RtAudio is a "controller" used to select an available audio i/o</span>
229 00300 <span class="comment">// interface.  It presents a common API for the user to call but all</span>
230 00301 <span class="comment">// functionality is implemented by the class RtAudioApi and its</span>
231 00302 <span class="comment">// subclasses.  RtAudio creates an instance of an RtAudioApi subclass</span>
232 00303 <span class="comment">// based on the user's API choice.  If no choice is made, RtAudio</span>
233 00304 <span class="comment">// attempts to make a "logical" API selection.</span>
234 00305 <span class="comment">//</span>
235 00306 <span class="comment">// **************************************************************** //</span>
236 00307 
237 <a name="l00308"></a><a class="code" href="classRtAudio.html">00308</a> <span class="keyword">class </span><a class="code" href="classRtAudio.html">RtAudio</a>
238 00309 {
239 00310 <span class="keyword">public</span>:
240 00311 
241 <a name="l00313"></a><a class="code" href="classRtAudio.html#w8">00313</a>   <span class="keyword">enum</span> <a class="code" href="classRtAudio.html#w8">RtAudioApi</a> {
242 00314     <a class="code" href="classRtAudio.html#w8w0">UNSPECIFIED</a>,    
243 00315     <a class="code" href="classRtAudio.html#w8w1">LINUX_ALSA</a>,     
244 00316     <a class="code" href="classRtAudio.html#w8w2">LINUX_OSS</a>,      
245 00317     <a class="code" href="classRtAudio.html#w8w3">LINUX_JACK</a>,     
246 00318     <a class="code" href="classRtAudio.html#w8w4">MACOSX_CORE</a>,    
247 00319     <a class="code" href="classRtAudio.html#w8w5">IRIX_AL</a>,        
248 00320     <a class="code" href="classRtAudio.html#w8w6">WINDOWS_ASIO</a>,   
249 00321     <a class="code" href="classRtAudio.html#w8w7">WINDOWS_DS</a>      
250 00322   };
251 00323 
252 00325 
253 00335   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( RtAudioApi api=UNSPECIFIED );
254 00336 
255 00338 
256 00349   <a class="code" href="classRtAudio.html#a0">RtAudio</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
257 00350            <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
258 00351            RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
259 00352            <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers, RtAudioApi api=UNSPECIFIED );
260 00353 
261 00355 
262 00359   <a class="code" href="classRtAudio.html#a2">~RtAudio</a>();
263 00360 
264 00362 
265 00388   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a3">openStream</a>( <span class="keywordtype">int</span> outputDevice, <span class="keywordtype">int</span> outputChannels,
266 00389                    <span class="keywordtype">int</span> inputDevice, <span class="keywordtype">int</span> inputChannels,
267 00390                    RtAudioFormat format, <span class="keywordtype">int</span> sampleRate,
268 00391                    <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
269 00392 
270 00394 
271 <a name="l00413"></a><a class="code" href="classRtAudio.html#a4">00413</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a4">setStreamCallback</a>(RtAudioCallback callback, <span class="keywordtype">void</span> *userData) { rtapi_-&gt;setStreamCallback( callback, userData ); };
272 00414 
273 00416 
274 <a name="l00423"></a><a class="code" href="classRtAudio.html#a5">00423</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a5">cancelStreamCallback</a>() { rtapi_-&gt;cancelStreamCallback(); };
275 00424 
276 <a name="l00426"></a><a class="code" href="classRtAudio.html#a6">00426</a>   <span class="keywordtype">int</span> <a class="code" href="classRtAudio.html#a6">getDeviceCount</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceCount(); };
277 00427 
278 00429 
279 <a name="l00437"></a><a class="code" href="classRtAudio.html#a7">00437</a>   <a class="code" href="structRtAudioDeviceInfo.html">RtAudioDeviceInfo</a> <a class="code" href="classRtAudio.html#a7">getDeviceInfo</a>(<span class="keywordtype">int</span> device) { <span class="keywordflow">return</span> rtapi_-&gt;getDeviceInfo( device ); };
280 00438 
281 00440 
282 <a name="l00445"></a><a class="code" href="classRtAudio.html#a8">00445</a>   <span class="keywordtype">char</span> * <span class="keyword">const</span> <a class="code" href="classRtAudio.html#a8">getStreamBuffer</a>() { <span class="keywordflow">return</span> rtapi_-&gt;getStreamBuffer(); };
283 00446 
284 00448 
285 <a name="l00453"></a><a class="code" href="classRtAudio.html#a9">00453</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a9">tickStream</a>() { rtapi_-&gt;tickStream(); };
286 00454 
287 00456 
288 <a name="l00460"></a><a class="code" href="classRtAudio.html#a10">00460</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a10">closeStream</a>()  { rtapi_-&gt;closeStream(); };
289 00461 
290 00463 
291 <a name="l00467"></a><a class="code" href="classRtAudio.html#a11">00467</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a11">startStream</a>() { rtapi_-&gt;startStream(); };
292 00468 
293 00470 
294 <a name="l00474"></a><a class="code" href="classRtAudio.html#a12">00474</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a12">stopStream</a>() { rtapi_-&gt;stopStream(); };
295 00475 
296 00477 
297 <a name="l00481"></a><a class="code" href="classRtAudio.html#a13">00481</a>   <span class="keywordtype">void</span> <a class="code" href="classRtAudio.html#a13">abortStream</a>() { rtapi_-&gt;abortStream(); };
298 00482 
299 00483 
300 00484  <span class="keyword">protected</span>:
301 00485 
302 00486   <span class="keywordtype">void</span> initialize( RtAudioApi api );
303 00487 
304 00488   RtApi *rtapi_;
305 00489 };
306 00490 
307 00491 
308 00492 <span class="comment">// RtApi Subclass prototypes.</span>
309 00493 
310 00494 <span class="preprocessor">#if defined(__LINUX_ALSA__)</span>
311 00495 <span class="preprocessor"></span>
312 00496 <span class="keyword">class </span>RtApiAlsa: <span class="keyword">public</span> RtApi
313 00497 {
314 00498 <span class="keyword">public</span>:
315 00499 
316 00500   RtApiAlsa();
317 00501   ~RtApiAlsa();
318 00502   <span class="keywordtype">void</span> tickStream();
319 00503   <span class="keywordtype">void</span> closeStream();
320 00504   <span class="keywordtype">void</span> startStream();
321 00505   <span class="keywordtype">void</span> stopStream();
322 00506   <span class="keywordtype">void</span> abortStream();
323 00507   <span class="keywordtype">int</span> streamWillBlock();
324 00508   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
325 00509   <span class="keywordtype">void</span> cancelStreamCallback();
326 00510 
327 00511   <span class="keyword">private</span>:
328 00512 
329 00513   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
330 00514   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
331 00515   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
332 00516                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
333 00517                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
334 00518 };
335 00519 
336 00520 <span class="preprocessor">#endif</span>
337 00521 <span class="preprocessor"></span>
338 00522 <span class="preprocessor">#if defined(__LINUX_JACK__)</span>
339 00523 <span class="preprocessor"></span>
340 00524 <span class="keyword">class </span>RtApiJack: <span class="keyword">public</span> RtApi
341 00525 {
342 00526 <span class="keyword">public</span>:
343 00527 
344 00528   RtApiJack();
345 00529   ~RtApiJack();
346 00530   <span class="keywordtype">void</span> tickStream();
347 00531   <span class="keywordtype">void</span> closeStream();
348 00532   <span class="keywordtype">void</span> startStream();
349 00533   <span class="keywordtype">void</span> stopStream();
350 00534   <span class="keywordtype">void</span> abortStream();
351 00535   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
352 00536   <span class="keywordtype">void</span> cancelStreamCallback();
353 00537   <span class="comment">// This function is intended for internal use only.  It must be</span>
354 00538   <span class="comment">// public because it is called by the internal callback handler,</span>
355 00539   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
356 00540   <span class="comment">// will most likely produce highly undesireable results!</span>
357 00541   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nframes );
358 00542 
359 00543   <span class="keyword">private</span>:
360 00544 
361 00545   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
362 00546   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
363 00547   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
364 00548                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
365 00549                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
366 00550 };
367 00551 
368 00552 <span class="preprocessor">#endif</span>
369 00553 <span class="preprocessor"></span>
370 00554 <span class="preprocessor">#if defined(__LINUX_OSS__)</span>
371 00555 <span class="preprocessor"></span>
372 00556 <span class="keyword">class </span>RtApiOss: <span class="keyword">public</span> RtApi
373 00557 {
374 00558 <span class="keyword">public</span>:
375 00559 
376 00560   RtApiOss();
377 00561   ~RtApiOss();
378 00562   <span class="keywordtype">void</span> tickStream();
379 00563   <span class="keywordtype">void</span> closeStream();
380 00564   <span class="keywordtype">void</span> startStream();
381 00565   <span class="keywordtype">void</span> stopStream();
382 00566   <span class="keywordtype">void</span> abortStream();
383 00567   <span class="keywordtype">int</span> streamWillBlock();
384 00568   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
385 00569   <span class="keywordtype">void</span> cancelStreamCallback();
386 00570 
387 00571   <span class="keyword">private</span>:
388 00572 
389 00573   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
390 00574   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
391 00575   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
392 00576                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
393 00577                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
394 00578 };
395 00579 
396 00580 <span class="preprocessor">#endif</span>
397 00581 <span class="preprocessor"></span>
398 00582 <span class="preprocessor">#if defined(__MACOSX_CORE__)</span>
399 00583 <span class="preprocessor"></span>
400 00584 <span class="preprocessor">#include &lt;CoreAudio/AudioHardware.h&gt;</span>
401 00585 
402 00586 <span class="keyword">class </span>RtApiCore: <span class="keyword">public</span> RtApi
403 00587 {
404 00588 <span class="keyword">public</span>:
405 00589 
406 00590   RtApiCore();
407 00591   ~RtApiCore();
408 00592   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
409 00593   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
410 00594   <span class="keywordtype">void</span> tickStream();
411 00595   <span class="keywordtype">void</span> closeStream();
412 00596   <span class="keywordtype">void</span> startStream();
413 00597   <span class="keywordtype">void</span> stopStream();
414 00598   <span class="keywordtype">void</span> abortStream();
415 00599   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
416 00600   <span class="keywordtype">void</span> cancelStreamCallback();
417 00601 
418 00602   <span class="comment">// This function is intended for internal use only.  It must be</span>
419 00603   <span class="comment">// public because it is called by the internal callback handler,</span>
420 00604   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
421 00605   <span class="comment">// will most likely produce highly undesireable results!</span>
422 00606   <span class="keywordtype">void</span> callbackEvent( AudioDeviceID deviceId, <span class="keywordtype">void</span> *inData, <span class="keywordtype">void</span> *outData );
423 00607 
424 00608   <span class="keyword">private</span>:
425 00609 
426 00610   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
427 00611   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
428 00612   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
429 00613                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
430 00614                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
431 00615 };
432 00616 
433 00617 <span class="preprocessor">#endif</span>
434 00618 <span class="preprocessor"></span>
435 00619 <span class="preprocessor">#if defined(__WINDOWS_DS__)</span>
436 00620 <span class="preprocessor"></span>
437 00621 <span class="keyword">class </span>RtApiDs: <span class="keyword">public</span> RtApi
438 00622 {
439 00623 <span class="keyword">public</span>:
440 00624 
441 00625   RtApiDs();
442 00626   ~RtApiDs();
443 00627   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
444 00628   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
445 00629   <span class="keywordtype">void</span> tickStream();
446 00630   <span class="keywordtype">void</span> closeStream();
447 00631   <span class="keywordtype">void</span> startStream();
448 00632   <span class="keywordtype">void</span> stopStream();
449 00633   <span class="keywordtype">void</span> abortStream();
450 00634   <span class="keywordtype">int</span> streamWillBlock();
451 00635   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
452 00636   <span class="keywordtype">void</span> cancelStreamCallback();
453 00637 
454 00638   <span class="keyword">private</span>:
455 00639 
456 00640   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
457 00641   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
458 00642   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
459 00643                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
460 00644                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
461 00645 };
462 00646 
463 00647 <span class="preprocessor">#endif</span>
464 00648 <span class="preprocessor"></span>
465 00649 <span class="preprocessor">#if defined(__WINDOWS_ASIO__)</span>
466 00650 <span class="preprocessor"></span>
467 00651 <span class="keyword">class </span>RtApiAsio: <span class="keyword">public</span> RtApi
468 00652 {
469 00653 <span class="keyword">public</span>:
470 00654 
471 00655   RtApiAsio();
472 00656   ~RtApiAsio();
473 00657   <span class="keywordtype">void</span> tickStream();
474 00658   <span class="keywordtype">void</span> closeStream();
475 00659   <span class="keywordtype">void</span> startStream();
476 00660   <span class="keywordtype">void</span> stopStream();
477 00661   <span class="keywordtype">void</span> abortStream();
478 00662   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
479 00663   <span class="keywordtype">void</span> cancelStreamCallback();
480 00664 
481 00665   <span class="comment">// This function is intended for internal use only.  It must be</span>
482 00666   <span class="comment">// public because it is called by the internal callback handler,</span>
483 00667   <span class="comment">// which is not a member of RtAudio.  External use of this function</span>
484 00668   <span class="comment">// will most likely produce highly undesireable results!</span>
485 00669   <span class="keywordtype">void</span> callbackEvent( <span class="keywordtype">long</span> bufferIndex );
486 00670 
487 00671   <span class="keyword">private</span>:
488 00672 
489 00673   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
490 00674   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
491 00675   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
492 00676                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
493 00677                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
494 00678 };
495 00679 
496 00680 <span class="preprocessor">#endif</span>
497 00681 <span class="preprocessor"></span>
498 00682 <span class="preprocessor">#if defined(__IRIX_AL__)</span>
499 00683 <span class="preprocessor"></span>
500 00684 <span class="keyword">class </span>RtApiAl: <span class="keyword">public</span> RtApi
501 00685 {
502 00686 <span class="keyword">public</span>:
503 00687 
504 00688   RtApiAl();
505 00689   ~RtApiAl();
506 00690   <span class="keywordtype">int</span> getDefaultOutputDevice(<span class="keywordtype">void</span>);
507 00691   <span class="keywordtype">int</span> getDefaultInputDevice(<span class="keywordtype">void</span>);
508 00692   <span class="keywordtype">void</span> tickStream();
509 00693   <span class="keywordtype">void</span> closeStream();
510 00694   <span class="keywordtype">void</span> startStream();
511 00695   <span class="keywordtype">void</span> stopStream();
512 00696   <span class="keywordtype">void</span> abortStream();
513 00697   <span class="keywordtype">int</span> streamWillBlock();
514 00698   <span class="keywordtype">void</span> setStreamCallback( RtAudioCallback callback, <span class="keywordtype">void</span> *userData );
515 00699   <span class="keywordtype">void</span> cancelStreamCallback();
516 00700 
517 00701   <span class="keyword">private</span>:
518 00702 
519 00703   <span class="keywordtype">void</span> initialize(<span class="keywordtype">void</span>);
520 00704   <span class="keywordtype">void</span> probeDeviceInfo( RtApiDevice *info );
521 00705   <span class="keywordtype">bool</span> probeDeviceOpen( <span class="keywordtype">int</span> device, StreamMode mode, <span class="keywordtype">int</span> channels, 
522 00706                         <span class="keywordtype">int</span> sampleRate, RtAudioFormat format,
523 00707                         <span class="keywordtype">int</span> *bufferSize, <span class="keywordtype">int</span> numberOfBuffers );
524 00708 };
525 00709 
526 00710 <span class="preprocessor">#endif</span>
527 00711 <span class="preprocessor"></span>
528 00712 <span class="comment">// Define the following flag to have extra information spewed to stderr.</span>
529 00713 <span class="comment">//#define __RTAUDIO_DEBUG__</span>
530 00714 
531 00715 <span class="preprocessor">#endif</span>
532 </pre></div><HR>
533
534 <table><tr><td><img src="../images/mcgill.gif" width=165></td>
535   <td>&copy;2001-2004 Gary P. Scavone, McGill University. All Rights Reserved.<br>
536   Maintained by Gary P. Scavone, <a href="mailto:gary@music.mcgill.ca">gary@music.mcgill.ca</a></td></tr>
537 </table>
538
539 </BODY>
540 </HTML>