1 |
// NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio
|
2 |
|
3 |
|
4 |
#ifndef PORT_AUDIO_H
|
5 |
#define PORT_AUDIO_H
|
6 |
|
7 |
#ifdef __cplusplus
|
8 |
extern "C"
|
9 |
{
|
10 |
#endif /* __cplusplus */
|
11 |
|
12 |
/*
|
13 |
* $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $
|
14 |
* PortAudio Portable Real-Time Audio Library
|
15 |
* PortAudio API Header File
|
16 |
* Latest version available at: http://www.audiomulch.com/portaudio/
|
17 |
*
|
18 |
* Copyright (c) 1999-2000 Ross Bencina and Phil Burk
|
19 |
*
|
20 |
* Permission is hereby granted, free of charge, to any person obtaining
|
21 |
* a copy of this software and associated documentation files
|
22 |
* (the "Software"), to deal in the Software without restriction,
|
23 |
* including without limitation the rights to use, copy, modify, merge,
|
24 |
* publish, distribute, sublicense, and/or sell copies of the Software,
|
25 |
* and to permit persons to whom the Software is furnished to do so,
|
26 |
* subject to the following conditions:
|
27 |
*
|
28 |
* The above copyright notice and this permission notice shall be
|
29 |
* included in all copies or substantial portions of the Software.
|
30 |
*
|
31 |
* Any person wishing to distribute modifications to the Software is
|
32 |
* requested to send the modifications to the original developer so that
|
33 |
* they can be incorporated into the canonical version.
|
34 |
*
|
35 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
36 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
37 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
38 |
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
39 |
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
40 |
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
41 |
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
42 |
*
|
43 |
*/
|
44 |
|
45 |
typedef int PaError;
|
46 |
typedef enum {
|
47 |
paNoError = 0,
|
48 |
|
49 |
paHostError = -10000,
|
50 |
paInvalidChannelCount,
|
51 |
paInvalidSampleRate,
|
52 |
paInvalidDeviceId,
|
53 |
paInvalidFlag,
|
54 |
paSampleFormatNotSupported,
|
55 |
paBadIODeviceCombination,
|
56 |
paInsufficientMemory,
|
57 |
paBufferTooBig,
|
58 |
paBufferTooSmall,
|
59 |
paNullCallback,
|
60 |
paBadStreamPtr,
|
61 |
paTimedOut,
|
62 |
paInternalError,
|
63 |
paDeviceUnavailable
|
64 |
} PaErrorNum;
|
65 |
|
66 |
/*
|
67 |
Pa_Initialize() is the library initialisation function - call this before
|
68 |
using the library.
|
69 |
|
70 |
*/
|
71 |
|
72 |
PaError Pa_Initialize( void );
|
73 |
|
74 |
/*
|
75 |
Pa_Terminate() is the library termination function - call this after
|
76 |
using the library.
|
77 |
|
78 |
*/
|
79 |
|
80 |
PaError Pa_Terminate( void );
|
81 |
|
82 |
/*
|
83 |
Pa_GetHostError() returns a host specific error code.
|
84 |
This can be called after receiving a PortAudio error code of paHostError.
|
85 |
|
86 |
*/
|
87 |
|
88 |
long Pa_GetHostError( void );
|
89 |
|
90 |
/*
|
91 |
Pa_GetErrorText() translates the supplied PortAudio error number
|
92 |
into a human readable message.
|
93 |
|
94 |
*/
|
95 |
|
96 |
const char *Pa_GetErrorText( PaError errnum );
|
97 |
|
98 |
/*
|
99 |
Sample formats
|
100 |
|
101 |
These are formats used to pass sound data between the callback and the
|
102 |
stream. Each device has a "native" format which may be used when optimum
|
103 |
efficiency or control over conversion is required.
|
104 |
|
105 |
Formats marked "always available" are supported (emulated) by all
|
106 |
PortAudio implementations.
|
107 |
|
108 |
The floating point representation (paFloat32) uses +1.0 and -1.0 as the
|
109 |
maximum and minimum respectively.
|
110 |
|
111 |
paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
|
112 |
|
113 |
*/
|
114 |
|
115 |
typedef unsigned long PaSampleFormat;
|
116 |
#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/
|
117 |
#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/
|
118 |
#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/
|
119 |
#define paInt24 ((PaSampleFormat) (1<<3))
|
120 |
#define paPackedInt24 ((PaSampleFormat) (1<<4))
|
121 |
#define paInt8 ((PaSampleFormat) (1<<5))
|
122 |
#define paUInt8 ((PaSampleFormat) (1<<6))
|
123 |
#define paCustomFormat ((PaSampleFormat) (1<<16))
|
124 |
|
125 |
/*
|
126 |
Device enumeration mechanism.
|
127 |
|
128 |
Device ids range from 0 to Pa_CountDevices()-1.
|
129 |
|
130 |
Devices may support input, output or both.
|
131 |
|
132 |
*/
|
133 |
|
134 |
typedef int PaDeviceID;
|
135 |
#define paNoDevice -1
|
136 |
|
137 |
int Pa_CountDevices( void );
|
138 |
|
139 |
typedef struct
|
140 |
{
|
141 |
int structVersion;
|
142 |
const char *name;
|
143 |
int maxInputChannels;
|
144 |
int maxOutputChannels;
|
145 |
/* Number of discrete rates, or -1 if range supported. */
|
146 |
int numSampleRates;
|
147 |
/* Array of supported sample rates, or {min,max} if range supported. */
|
148 |
const double *sampleRates;
|
149 |
PaSampleFormat nativeSampleFormats;
|
150 |
}
|
151 |
PaDeviceInfo;
|
152 |
|
153 |
/*
|
154 |
Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the
|
155 |
default device ids for input and output respectively, or paNoDevice if
|
156 |
no device is available.
|
157 |
The result can be passed to Pa_OpenStream().
|
158 |
|
159 |
On the PC, the user can specify a default device by
|
160 |
setting an environment variable. For example, to use device #1.
|
161 |
|
162 |
set PA_RECOMMENDED_OUTPUT_DEVICE=1
|
163 |
|
164 |
The user should first determine the available device ids by using
|
165 |
the supplied application "pa_devs".
|
166 |
|
167 |
*/
|
168 |
|
169 |
PaDeviceID Pa_GetDefaultInputDeviceID( void );
|
170 |
PaDeviceID Pa_GetDefaultOutputDeviceID( void );
|
171 |
|
172 |
|
173 |
|
174 |
/*
|
175 |
Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure
|
176 |
for the device specified.
|
177 |
If the device parameter is out of range the function returns NULL.
|
178 |
|
179 |
PortAudio manages the memory referenced by the returned pointer, the client
|
180 |
must not manipulate or free the memory. The pointer is only guaranteed to be
|
181 |
valid between calls to Pa_Initialize() and Pa_Terminate().
|
182 |
|
183 |
*/
|
184 |
|
185 |
const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device );
|
186 |
|
187 |
/*
|
188 |
PaTimestamp is used to represent a continuous sample clock with arbitrary
|
189 |
start time that can be used for syncronization. The type is used for the
|
190 |
outTime argument to the PortAudioCallback and as the result of Pa_StreamTime()
|
191 |
|
192 |
*/
|
193 |
|
194 |
typedef double PaTimestamp;
|
195 |
|
196 |
/*
|
197 |
PortAudioCallback is implemented by PortAudio clients.
|
198 |
|
199 |
inputBuffer and outputBuffer are arrays of interleaved samples,
|
200 |
the format, packing and number of channels used by the buffers are
|
201 |
determined by parameters to Pa_OpenStream() (see below).
|
202 |
|
203 |
framesPerBuffer is the number of sample frames to be processed by the callback.
|
204 |
|
205 |
outTime is the time in samples when the buffer(s) processed by
|
206 |
this callback will begin being played at the audio output.
|
207 |
See also Pa_StreamTime()
|
208 |
|
209 |
userData is the value of a user supplied pointer passed to Pa_OpenStream()
|
210 |
intended for storing synthesis data etc.
|
211 |
|
212 |
return value:
|
213 |
The callback can return a non-zero value to stop the stream. This may be
|
214 |
useful in applications such as soundfile players where a specific duration
|
215 |
of output is required. However, it is not necessary to utilise this mechanism
|
216 |
as StopStream() will also terminate the stream. A callback returning a
|
217 |
non-zero value must fill the entire outputBuffer.
|
218 |
|
219 |
NOTE: None of the other stream functions may be called from within the
|
220 |
callback function except for Pa_GetCPULoad().
|
221 |
|
222 |
*/
|
223 |
|
224 |
typedef int (PortAudioCallback)(
|
225 |
void *inputBuffer, void *outputBuffer,
|
226 |
unsigned long framesPerBuffer,
|
227 |
PaTimestamp outTime, void *userData );
|
228 |
|
229 |
|
230 |
/*
|
231 |
Stream flags
|
232 |
|
233 |
These flags may be supplied (ored together) in the streamFlags argument to
|
234 |
the Pa_OpenStream() function.
|
235 |
|
236 |
*/
|
237 |
|
238 |
#define paNoFlag (0)
|
239 |
#define paClipOff (1<<0) /* disable default clipping of out of range samples */
|
240 |
#define paDitherOff (1<<1) /* disable default dithering */
|
241 |
#define paPlatformSpecificFlags (0x00010000)
|
242 |
typedef unsigned long PaStreamFlags;
|
243 |
|
244 |
/*
|
245 |
A single PortAudioStream provides multiple channels of real-time
|
246 |
input and output audio streaming to a client application.
|
247 |
Pointers to PortAudioStream objects are passed between PortAudio functions.
|
248 |
*/
|
249 |
|
250 |
typedef void PortAudioStream;
|
251 |
#define PaStream PortAudioStream
|
252 |
|
253 |
/*
|
254 |
Pa_OpenStream() opens a stream for either input, output or both.
|
255 |
|
256 |
stream is the address of a PortAudioStream pointer which will receive
|
257 |
a pointer to the newly opened stream.
|
258 |
|
259 |
inputDevice is the id of the device used for input (see PaDeviceID above.)
|
260 |
inputDevice may be paNoDevice to indicate that an input device is not required.
|
261 |
|
262 |
numInputChannels is the number of channels of sound to be delivered to the
|
263 |
callback. It can range from 1 to the value of maxInputChannels in the
|
264 |
PaDeviceInfo record for the device specified by the inputDevice parameter.
|
265 |
If inputDevice is paNoDevice numInputChannels is ignored.
|
266 |
|
267 |
inputSampleFormat is the sample format of inputBuffer provided to the callback
|
268 |
function. inputSampleFormat may be any of the formats described by the
|
269 |
PaSampleFormat enumeration (see above). PortAudio guarantees support for
|
270 |
the device's native formats (nativeSampleFormats in the device info record)
|
271 |
and additionally 16 and 32 bit integer and 32 bit floating point formats.
|
272 |
Support for other formats is implementation defined.
|
273 |
|
274 |
inputDriverInfo is a pointer to an optional driver specific data structure
|
275 |
containing additional information for device setup or stream processing.
|
276 |
inputDriverInfo is never required for correct operation. If not used
|
277 |
inputDriverInfo should be NULL.
|
278 |
|
279 |
outputDevice is the id of the device used for output (see PaDeviceID above.)
|
280 |
outputDevice may be paNoDevice to indicate that an output device is not required.
|
281 |
|
282 |
numOutputChannels is the number of channels of sound to be supplied by the
|
283 |
callback. See the definition of numInputChannels above for more details.
|
284 |
|
285 |
outputSampleFormat is the sample format of the outputBuffer filled by the
|
286 |
callback function. See the definition of inputSampleFormat above for more
|
287 |
details.
|
288 |
|
289 |
outputDriverInfo is a pointer to an optional driver specific data structure
|
290 |
containing additional information for device setup or stream processing.
|
291 |
outputDriverInfo is never required for correct operation. If not used
|
292 |
outputDriverInfo should be NULL.
|
293 |
|
294 |
sampleRate is the desired sampleRate. For full-duplex streams it is the
|
295 |
sample rate for both input and output
|
296 |
|
297 |
framesPerBuffer is the length in sample frames of all internal sample buffers
|
298 |
used for communication with platform specific audio routines. Wherever
|
299 |
possible this corresponds to the framesPerBuffer parameter passed to the
|
300 |
callback function.
|
301 |
|
302 |
numberOfBuffers is the number of buffers used for multibuffered communication
|
303 |
with the platform specific audio routines. If you pass zero, then an optimum
|
304 |
value will be chosen for you internally. This parameter is provided only
|
305 |
as a guide - and does not imply that an implementation must use multibuffered
|
306 |
i/o when reliable double buffering is available (such as SndPlayDoubleBuffer()
|
307 |
on the Macintosh.)
|
308 |
|
309 |
streamFlags may contain a combination of flags ORed together.
|
310 |
These flags modify the behaviour of the streaming process. Some flags may only
|
311 |
be relevant to certain buffer formats.
|
312 |
|
313 |
callback is a pointer to a client supplied function that is responsible
|
314 |
for processing and filling input and output buffers (see above for details.)
|
315 |
|
316 |
userData is a client supplied pointer which is passed to the callback
|
317 |
function. It could for example, contain a pointer to instance data necessary
|
318 |
for processing the audio buffers.
|
319 |
|
320 |
return value:
|
321 |
Upon success Pa_OpenStream() returns PaNoError and places a pointer to a
|
322 |
valid PortAudioStream in the stream argument. The stream is inactive (stopped).
|
323 |
If a call to Pa_OpenStream() fails a non-zero error code is returned (see
|
324 |
PaError above) and the value of stream is invalid.
|
325 |
|
326 |
*/
|
327 |
|
328 |
PaError Pa_OpenStream( PortAudioStream** stream,
|
329 |
PaDeviceID inputDevice,
|
330 |
int numInputChannels,
|
331 |
PaSampleFormat inputSampleFormat,
|
332 |
void *inputDriverInfo,
|
333 |
PaDeviceID outputDevice,
|
334 |
int numOutputChannels,
|
335 |
PaSampleFormat outputSampleFormat,
|
336 |
void *outputDriverInfo,
|
337 |
double sampleRate,
|
338 |
unsigned long framesPerBuffer,
|
339 |
unsigned long numberOfBuffers,
|
340 |
PaStreamFlags streamFlags,
|
341 |
PortAudioCallback *callback,
|
342 |
void *userData );
|
343 |
|
344 |
|
345 |
/*
|
346 |
Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens
|
347 |
the default input and/or output devices. Most parameters have identical meaning
|
348 |
to their Pa_OpenStream() counterparts, with the following exceptions:
|
349 |
|
350 |
If either numInputChannels or numOutputChannels is 0 the respective device
|
351 |
is not opened. This has the same effect as passing paNoDevice in the device
|
352 |
arguments to Pa_OpenStream().
|
353 |
|
354 |
sampleFormat applies to both the input and output buffers.
|
355 |
|
356 |
*/
|
357 |
|
358 |
PaError Pa_OpenDefaultStream( PortAudioStream** stream,
|
359 |
int numInputChannels,
|
360 |
int numOutputChannels,
|
361 |
PaSampleFormat sampleFormat,
|
362 |
double sampleRate,
|
363 |
unsigned long framesPerBuffer,
|
364 |
unsigned long numberOfBuffers,
|
365 |
PortAudioCallback *callback,
|
366 |
void *userData );
|
367 |
|
368 |
/*
|
369 |
Pa_CloseStream() closes an audio stream, flushing any pending buffers.
|
370 |
|
371 |
*/
|
372 |
|
373 |
PaError Pa_CloseStream( PortAudioStream* );
|
374 |
|
375 |
/*
|
376 |
Pa_StartStream() and Pa_StopStream() begin and terminate audio processing.
|
377 |
Pa_StopStream() waits until all pending audio buffers have been played.
|
378 |
Pa_AbortStream() stops playing immediately without waiting for pending
|
379 |
buffers to complete.
|
380 |
|
381 |
*/
|
382 |
|
383 |
PaError Pa_StartStream( PortAudioStream *stream );
|
384 |
|
385 |
PaError Pa_StopStream( PortAudioStream *stream );
|
386 |
|
387 |
PaError Pa_AbortStream( PortAudioStream *stream );
|
388 |
|
389 |
/*
|
390 |
Pa_StreamActive() returns one (1) when the stream is active (ie playing
|
391 |
or recording audio), zero (0) when not playing, or a negative error number
|
392 |
if the stream is invalid.
|
393 |
The stream is active between calls to Pa_StartStream() and Pa_StopStream(),
|
394 |
but may also become inactive if the callback returns a non-zero value.
|
395 |
In the latter case, the stream is considered inactive after the last
|
396 |
buffer has finished playing.
|
397 |
|
398 |
*/
|
399 |
|
400 |
PaError Pa_StreamActive( PortAudioStream *stream );
|
401 |
|
402 |
/*
|
403 |
Pa_StreamTime() returns the current output time in samples for the stream.
|
404 |
This time may be used as a time reference (for example synchronizing audio to
|
405 |
MIDI).
|
406 |
|
407 |
*/
|
408 |
|
409 |
PaTimestamp Pa_StreamTime( PortAudioStream *stream );
|
410 |
|
411 |
/*
|
412 |
Pa_GetCPULoad() returns the CPU Load for the stream.
|
413 |
The "CPU Load" is a fraction of total CPU time consumed by the stream's
|
414 |
audio processing routines including, but not limited to the client supplied
|
415 |
callback.
|
416 |
A value of 0.5 would imply that PortAudio and the sound generating
|
417 |
callback was consuming roughly 50% of the available CPU time.
|
418 |
This function may be called from the callback function or the application.
|
419 |
|
420 |
*/
|
421 |
|
422 |
double Pa_GetCPULoad( PortAudioStream* stream );
|
423 |
|
424 |
/*
|
425 |
Pa_GetMinNumBuffers() returns the minimum number of buffers required by
|
426 |
the current host based on minimum latency.
|
427 |
On the PC, for the DirectSound implementation, latency can be optionally set
|
428 |
by user by setting an environment variable.
|
429 |
For example, to set latency to 200 msec, put:
|
430 |
|
431 |
set PA_MIN_LATENCY_MSEC=200
|
432 |
|
433 |
in the AUTOEXEC.BAT file and reboot.
|
434 |
If the environment variable is not set, then the latency will be determined
|
435 |
based on the OS. Windows NT has higher latency than Win95.
|
436 |
|
437 |
*/
|
438 |
|
439 |
int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate );
|
440 |
|
441 |
/*
|
442 |
Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds.
|
443 |
You may sleep longer than the requested time so don't rely on this for
|
444 |
accurate musical timing.
|
445 |
|
446 |
Pa_Sleep() is provided as a convenience for authors of portable code (such as
|
447 |
the tests and examples in the PortAudio distribution.)
|
448 |
|
449 |
*/
|
450 |
|
451 |
void Pa_Sleep( long msec );
|
452 |
|
453 |
/*
|
454 |
Pa_GetSampleSize() returns the size in bytes of a single sample in the
|
455 |
supplied PaSampleFormat, or paSampleFormatNotSupported if the format is
|
456 |
no supported.
|
457 |
|
458 |
*/
|
459 |
|
460 |
PaError Pa_GetSampleSize( PaSampleFormat format );
|
461 |
|
462 |
|
463 |
#ifdef __cplusplus
|
464 |
}
|
465 |
#endif /* __cplusplus */
|
466 |
#endif /* PORT_AUDIO_H */
|