1 
2 #ifndef PORTAUDIO_H
3 #define PORTAUDIO_H
4 /*
5  * $Id: portaudio.h,v 1.1 2006/06/10 21:30:51 dmazzoni Exp $
6  * PortAudio Portable Real-Time Audio Library
7  * PortAudio API Header File
8  * Latest version available at: http://www.portaudio.com/
9  *
10  * Copyright (c) 1999-2002 Ross Bencina and Phil Burk
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining
13  * a copy of this software and associated documentation files
14  * (the "Software"), to deal in the Software without restriction,
15  * including without limitation the rights to use, copy, modify, merge,
16  * publish, distribute, sublicense, and/or sell copies of the Software,
17  * and to permit persons to whom the Software is furnished to do so,
18  * subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be
21  * included in all copies or substantial portions of the Software.
22  *
23  * Any person wishing to distribute modifications to the Software is
24  * requested to send the modifications to the original developer so that
25  * they can be incorporated into the canonical version.
26  *
27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
30  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
31  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
32  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
33  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34  */
35 
36 /** @file
37  @brief The PortAudio API.
38 */
39 
40 
41 #ifdef __cplusplus
42 extern "C"
43 {
44 #endif /* __cplusplus */
45 
46 
47 /** Retrieve the release number of the currently running PortAudio build,
48  eg 1900.
49 */
50 int Pa_GetVersion( void );
51 
52 
53 /** Retrieve a textual description of the current PortAudio build,
54  eg "PortAudio V19-devel 13 October 2002".
55 */
56 const char* Pa_GetVersionText( void );
57 
58 
59 /** Error codes returned by PortAudio functions.
60  Note that with the exception of paNoError, all PaErrorCodes are negative.
61 */
62 
63 typedef int PaError;
64 typedef enum PaErrorCode
65 {
66     paNoError = 0,
67 
68     paNotInitialized = -10000,
69     paUnanticipatedHostError,
70     paInvalidChannelCount,
71     paInvalidSampleRate,
72     paInvalidDevice,
73     paInvalidFlag,
74     paSampleFormatNotSupported,
75     paBadIODeviceCombination,
76     paInsufficientMemory,
77     paBufferTooBig,
78     paBufferTooSmall,
79     paNullCallback,
80     paBadStreamPtr,
81     paTimedOut,
82     paInternalError,
83     paDeviceUnavailable,
84     paIncompatibleHostApiSpecificStreamInfo,
85     paStreamIsStopped,
86     paStreamIsNotStopped,
87     paInputOverflowed,
88     paOutputUnderflowed,
89     paHostApiNotFound,
90     paInvalidHostApi,
91     paCanNotReadFromACallbackStream,      /**< @todo review error code name */
92     paCanNotWriteToACallbackStream,       /**< @todo review error code name */
93     paCanNotReadFromAnOutputOnlyStream,   /**< @todo review error code name */
94     paCanNotWriteToAnInputOnlyStream,     /**< @todo review error code name */
95     paIncompatibleStreamHostApi,
96     paBadBufferPtr
97 } PaErrorCode;
98 
99 
100 /** Translate the supplied PortAudio error code into a human readable
101  message.
102 */
103 const char *Pa_GetErrorText( PaError errorCode );
104 
105 
106 /** Library initialization function - call this before using PortAudio.
107  This function initialises internal data structures and prepares underlying
108  host APIs for use. This function MUST be called before using any other
109  PortAudio API functions.
110 
111  If Pa_Initialize() is called multiple times, each successful
112  call must be matched with a corresponding call to Pa_Terminate().
113  Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not
114  required to be fully nested.
115 
116  Note that if Pa_Initialize() returns an error code, Pa_Terminate() should
117  NOT be called.
118 
119  @return paNoError if successful, otherwise an error code indicating the cause
120  of failure.
121 
122  @see Pa_Terminate
123 */
124 PaError Pa_Initialize( void );
125 
126 
127 /** Library termination function - call this when finished using PortAudio.
128  This function deallocates all resources allocated by PortAudio since it was
129  initializied by a call to Pa_Initialize(). In cases where Pa_Initialise() has
130  been called multiple times, each call must be matched with a corresponding call
131  to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically
132  close any PortAudio streams that are still open.
133 
134  Pa_Terminate() MUST be called before exiting a program which uses PortAudio.
135  Failure to do so may result in serious resource leaks, such as audio devices
136  not being available until the next reboot.
137 
138  @return paNoError if successful, otherwise an error code indicating the cause
139  of failure.
140 
141  @see Pa_Initialize
142 */
143 PaError Pa_Terminate( void );
144 
145 
146 
147 /** The type used to refer to audio devices. Values of this type usually
148  range from 0 to (Pa_DeviceCount-1), and may also take on the PaNoDevice
149  and paUseHostApiSpecificDeviceSpecification values.
150 
151  @see Pa_DeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification
152 */
153 typedef int PaDeviceIndex;
154 
155 
156 /** A special PaDeviceIndex value indicating that no device is available,
157  or should be used.
158 
159  @see PaDeviceIndex
160 */
161 #define paNoDevice ((PaDeviceIndex)-1)
162 
163 
164 /** A special PaDeviceIndex value indicating that the device(s) to be used
165  are specified in the host api specific stream info structure.
166 
167  @see PaDeviceIndex
168 */
169 #define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2)
170 
171 
172 /* Host API enumeration mechanism */
173 
174 /** The type used to enumerate to host APIs at runtime. Values of this type
175  range from 0 to (Pa_GetHostApiCount()-1).
176 
177  @see Pa_GetHostApiCount
178 */
179 typedef int PaHostApiIndex;
180 
181 
182 /** Retrieve the number of available host APIs. Even if a host API is
183  available it may have no devices available.
184 
185  @return A non-negative value indicating the number of available host APIs
186  or, a PaErrorCode (which are always negative) if PortAudio is not initialized
187  or an error is encountered.
188 
189  @see PaHostApiIndex
190 */
191 PaHostApiIndex Pa_GetHostApiCount( void );
192 
193 
194 /** Retrieve the index of the default host API. The default host API will be
195  the lowest common denominator host API on the current platform and is
196  unlikely to provide the best performance.
197 
198  @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1)
199  indicating the default host API index or, a PaErrorCode (which are always
200  negative) if PortAudio is not initialized or an error is encountered.
201 */
202 PaHostApiIndex Pa_GetDefaultHostApi( void );
203 
204 
205 /** Unchanging unique identifiers for each supported host API. This type
206  is used in the PaHostApiInfo structure. The values are guaranteed to be
207  unique and to never change, thus allowing code to be written that
208  conditionally uses host API specific extensions.
209 
210  New type ids will be allocated when support for a host API reaches
211  "public alpha" status, prior to that developers should use the
212  paInDevelopment type id.
213 
214  @see PaHostApiInfo
215 */
216 typedef enum PaHostApiTypeId
217 {
218     paInDevelopment=0, /* use while developing support for a new host API */
219     paDirectSound=1,
220     paMME=2,
221     paASIO=3,
222     paSoundManager=4,
223     paCoreAudio=5,
224     paOSS=7,
225     paALSA=8,
226     paAL=9,
227     paBeOS=10,
228     paWDMKS=11,
229     paJACK=12,
230 	paWASAPI=13
231 } PaHostApiTypeId;
232 
233 
234 /** A structure containing information about a particular host API. */
235 
236 typedef struct PaHostApiInfo
237 {
238     /** this is struct version 1 */
239     int structVersion;
240     /** The well known unique identifier of this host API @see PaHostApiTypeId */
241     PaHostApiTypeId type;
242     /** A textual description of the host API for display on user interfaces. */
243     const char *name;
244 
245     /**  The number of devices belonging to this host API. This field may be
246      used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate
247      all devices for this host API.
248      @see Pa_HostApiDeviceIndexToDeviceIndex
249     */
250     int deviceCount;
251 
252     /** The default input device for this host API. The value will be a
253      device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice
254      if no default input device is available.
255     */
256     PaDeviceIndex defaultInputDevice;
257 
258     /** The default output device for this host API. The value will be a
259      device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice
260      if no default output device is available.
261     */
262     PaDeviceIndex defaultOutputDevice;
263 
264 } PaHostApiInfo;
265 
266 
267 /** Retrieve a pointer to a structure containing information about a specific
268  host Api.
269 
270  @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1)
271 
272  @return A pointer to an immutable PaHostApiInfo structure describing
273  a specific host API. If the hostApi parameter is out of range or an error
274  is encountered, the function returns NULL.
275 
276  The returned structure is owned by the PortAudio implementation and must not
277  be manipulated or freed. The pointer is only guaranteed to be valid between
278  calls to Pa_Initialize() and Pa_Terminate().
279 */
280 const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi );
281 
282 
283 /** Convert a static host API unique identifier, into a runtime
284  host API index.
285 
286  @param type A unique host API identifier belonging to the PaHostApiTypeId
287  enumeration.
288 
289  @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or,
290  a PaErrorCode (which are always negative) if PortAudio is not initialized
291  or an error is encountered.
292 
293  The paHostApiNotFound error code indicates that the host API specified by the
294  type parameter is not available.
295 
296  @see PaHostApiTypeId
297 */
298 PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type );
299 
300 
301 /** Convert a host-API-specific device index to standard PortAudio device index.
302  This function may be used in conjunction with the deviceCount field of
303  PaHostApiInfo to enumerate all devices for the specified host API.
304 
305  @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1)
306 
307  @param hostApiDeviceIndex A valid per-host device index in the range
308  0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1)
309 
310  @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1)
311  or, a PaErrorCode (which are always negative) if PortAudio is not initialized
312  or an error is encountered.
313 
314  A paInvalidHostApi error code indicates that the host API index specified by
315  the hostApi parameter is out of range.
316 
317  A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter
318  is out of range.
319 
320  @see PaHostApiInfo
321 */
322 PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi,
323         int hostApiDeviceIndex );
324 
325 
326 
327 /** Structure used to return information about a host error condition.
328 */
329 typedef struct PaHostErrorInfo{
330     PaHostApiTypeId hostApiType;    /**< the host API which returned the error code */
331     long errorCode;                 /**< the error code returned */
332     const char *errorText;          /**< a textual description of the error if available, otherwise a zero-length string */
333 }PaHostErrorInfo;
334 
335 
336 /** Return information about the last host error encountered. The error
337  information returned by Pa_GetLastHostErrorInfo() will never be modified
338  asyncronously by errors occurring in other PortAudio owned threads
339  (such as the thread that manages the stream callback.)
340 
341  This function is provided as a last resort, primarily to enhance debugging
342  by providing clients with access to all available error information.
343 
344  @return A pointer to an immutable structure constaining information about
345  the host error. The values in this structure will only be valid if a
346  PortAudio function has previously returned the paUnanticipatedHostError
347  error code.
348 */
349 const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void );
350 
351 
352 
353 /* Device enumeration and capabilities */
354 
355 /** Retrieve the number of available devices. The number of available devices
356  may be zero.
357 
358  @return A non-negative value indicating the number of available devices or,
359  a PaErrorCode (which are always negative) if PortAudio is not initialized
360  or an error is encountered.
361 */
362 PaDeviceIndex Pa_GetDeviceCount( void );
363 
364 
365 /** Retrieve the index of the default input device. The result can be
366  used in the inputDevice parameter to Pa_OpenStream().
367 
368  @return The default input device index for the default host API, or paNoDevice
369  if no default input device is available or an error was encountered.
370 */
371 PaDeviceIndex Pa_GetDefaultInputDevice( void );
372 
373 
374 /** Retrieve the index of the default output device. The result can be
375  used in the outputDevice parameter to Pa_OpenStream().
376 
377  @return The default output device index for the defualt host API, or paNoDevice
378  if no default output device is available or an error was encountered.
379 
380  @note
381  On the PC, the user can specify a default device by
382  setting an environment variable. For example, to use device #1.
383 <pre>
384  set PA_RECOMMENDED_OUTPUT_DEVICE=1
385 </pre>
386  The user should first determine the available device ids by using
387  the supplied application "pa_devs".
388 */
389 PaDeviceIndex Pa_GetDefaultOutputDevice( void );
390 
391 
392 /** The type used to represent monotonic time in seconds that can be used
393  for syncronisation. The type is used for the outTime argument to the
394  PaStreamCallback and as the result of Pa_GetStreamTime().
395 
396  @see PaStreamCallback, Pa_GetStreamTime
397 */
398 typedef double PaTime;
399 
400 
401 /** A type used to specify one or more sample formats. Each value indicates
402  a possible format for sound data passed to and from the stream callback,
403  Pa_ReadStream and Pa_WriteStream.
404 
405  The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8
406  and aUInt8 are usually implemented by all implementations.
407 
408  The floating point representation (paFloat32) uses +1.0 and -1.0 as the
409  maximum and minimum respectively.
410 
411  paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
412 
413  The paNonInterleaved flag indicates that a multichannel buffer is passed
414  as a set of non-interleaved pointers.
415 
416  @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo
417  @see paFloat32, paInt16, paInt32, paInt24, paInt8
418  @see paUInt8, paCustomFormat, paNonInterleaved
419 */
420 typedef unsigned long PaSampleFormat;
421 
422 
423 #define paFloat32        ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */
424 #define paInt32          ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */
425 #define paInt24          ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */
426 #define paInt16          ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */
427 #define paInt8           ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */
428 #define paUInt8          ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */
429 #define paCustomFormat   ((PaSampleFormat) 0x00010000)/**< @see PaSampleFormat */
430 
431 #define paNonInterleaved ((PaSampleFormat) 0x80000000)
432 
433 /** A structure providing information and capabilities of PortAudio devices.
434  Devices may support input, output or both input and output.
435 */
436 typedef struct PaDeviceInfo
437 {
438     int structVersion;  /* this is struct version 2 */
439     const char *name;
440     PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/
441 
442     int maxInputChannels;
443     int maxOutputChannels;
444 
445     /* Default latency values for interactive performance. */
446     PaTime defaultLowInputLatency;
447     PaTime defaultLowOutputLatency;
448     /* Default latency values for robust non-interactive applications (eg. playing sound files). */
449     PaTime defaultHighInputLatency;
450     PaTime defaultHighOutputLatency;
451 
452     double defaultSampleRate;
453 } PaDeviceInfo;
454 
455 
456 /** Retrieve a pointer to a PaDeviceInfo structure containing information
457  about the specified device.
458  @return A pointer to an immutable PaDeviceInfo structure. If the device
459  parameter is out of range the function returns NULL.
460 
461  @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1)
462 
463  @note PortAudio manages the memory referenced by the returned pointer,
464  the client must not manipulate or free the memory. The pointer is only
465  guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate().
466 
467  @see PaDeviceInfo, PaDeviceIndex
468 */
469 const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device );
470 
471 
472 /** Parameters for one direction (input or output) of a stream.
473 */
474 typedef struct PaStreamParameters
475 {
476     /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1)
477      specifying the device to be used or the special constant
478      paUseHostApiSpecificDeviceSpecification which indicates that the actual
479      device(s) to use are specified in hostApiSpecificStreamInfo.
480      This field must not be set to paNoDevice.
481     */
482     PaDeviceIndex device;
483 
484     /** The number of channels of sound to be delivered to the
485      stream callback or accessed by Pa_ReadStream() or Pa_WriteStream().
486      It can range from 1 to the value of maxInputChannels in the
487      PaDeviceInfo record for the device specified by the device parameter.
488     */
489     int channelCount;
490 
491     /** The sample format of the buffer provided to the stream callback,
492      a_ReadStream() or Pa_WriteStream(). It may be any of the formats described
493      by the PaSampleFormat enumeration.
494     */
495     PaSampleFormat sampleFormat;
496 
497     /** The desired latency in seconds. Where practical, implementations should
498      configure their latency based on these parameters, otherwise they may
499      choose the closest viable latency instead. Unless the suggested latency
500      is greater than the absolute upper limit for the device implementations
501      should round the suggestedLatency up to the next practial value - ie to
502      provide an equal or higher latency than suggestedLatency wherever possibe.
503      Actual latency values for an open stream may be retrieved using the
504      inputLatency and outputLatency fields of the PaStreamInfo structure
505      returned by Pa_GetStreamInfo().
506      @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo
507     */
508     PaTime suggestedLatency;
509 
510     /** An optional pointer to a host api specific data structure
511      containing additional information for device setup and/or stream processing.
512      hostApiSpecificStreamInfo is never required for correct operation,
513      if not used it should be set to NULL.
514     */
515     void *hostApiSpecificStreamInfo;
516 
517 } PaStreamParameters;
518 
519 
520 /** Return code for Pa_IsFormatSupported indicating success. */
521 #define paFormatIsSupported (0)
522 
523 /** Determine whether it would be possible to open a stream with the specified
524  parameters.
525 
526  @param inputParameters A structure that describes the input parameters used to
527  open a stream. The suggestedLatency field is ignored. See PaStreamParameters
528  for a description of these parameters. inputParameters must be NULL for
529  output-only streams.
530 
531  @param outputParameters A structure that describes the output parameters used
532  to open a stream. The suggestedLatency field is ignored. See PaStreamParameters
533  for a description of these parameters. outputParameters must be NULL for
534  input-only streams.
535 
536  @param sampleRate The required sampleRate. For full-duplex streams it is the
537  sample rate for both input and output
538 
539  @return Returns 0 if the format is supported, and an error code indicating why
540  the format is not supported otherwise. The constant paFormatIsSupported is
541  provided to compare with the return value for success.
542 
543  @see paFormatIsSupported, PaStreamParameters
544 */
545 PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters,
546                               const PaStreamParameters *outputParameters,
547                               double sampleRate );
548 
549 
550 
551 /* Streaming types and functions */
552 
553 
554 /**
555  A single PaStream can provide multiple channels of real-time
556  streaming audio input and output to a client application. A stream
557  provides access to audio hardware represented by one or more
558  PaDevices. Depending on the underlying Host API, it may be possible
559  to open multiple streams using the same device, however this behavior
560  is implementation defined. Portable applications should assume that
561  a PaDevice may be simultaneously used by at most one PaStream.
562 
563  Pointers to PaStream objects are passed between PortAudio functions that
564  operate on streams.
565 
566  @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream,
567  Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive,
568  Pa_GetStreamTime, Pa_GetStreamCpuLoad
569 
570 */
571 typedef void PaStream;
572 
573 
574 /** Can be passed as the framesPerBuffer parameter to Pa_OpenStream()
575  or Pa_OpenDefaultStream() to indicate that the stream callback will
576  accept buffers of any size.
577 */
578 #define paFramesPerBufferUnspecified  (0)
579 
580 
581 /** Flags used to control the behavior of a stream. They are passed as
582  parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be
583  ORed together.
584 
585  @see Pa_OpenStream, Pa_OpenDefaultStream
586  @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput,
587   paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags
588 */
589 typedef unsigned long PaStreamFlags;
590 
591 /** @see PaStreamFlags */
592 #define   paNoFlag          ((PaStreamFlags) 0)
593 
594 /** Disable default clipping of out of range samples.
595  @see PaStreamFlags
596 */
597 #define   paClipOff         ((PaStreamFlags) 0x00000001)
598 
599 /** Disable default dithering.
600  @see PaStreamFlags
601 */
602 #define   paDitherOff       ((PaStreamFlags) 0x00000002)
603 
604 /** Flag requests that where possible a full duplex stream will not discard
605  overflowed input samples without calling the stream callback. This flag is
606  only valid for full duplex callback streams and only when used in combination
607  with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using
608  this flag incorrectly results in a paInvalidFlag error being returned from
609  Pa_OpenStream and Pa_OpenDefaultStream.
610 
611  @see PaStreamFlags, paFramesPerBufferUnspecified
612 */
613 #define   paNeverDropInput  ((PaStreamFlags) 0x00000004)
614 
615 /** Call the stream callback to fill initial output buffers, rather than the
616  default behavior of priming the buffers with zeros (silence). This flag has
617  no effect for input-only and blocking read/write streams.
618 
619  @see PaStreamFlags
620 */
621 #define   paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008)
622 
623 /** A mask specifying the platform specific bits.
624  @see PaStreamFlags
625 */
626 #define   paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000)
627 
628 /**
629  Timing information for the buffers passed to the stream callback.
630 */
631 typedef struct PaStreamCallbackTimeInfo{
632     PaTime inputBufferAdcTime;
633     PaTime currentTime;
634     PaTime outputBufferDacTime;
635 } PaStreamCallbackTimeInfo;
636 
637 
638 /**
639  Flag bit constants for the statusFlags to PaStreamCallback.
640 
641  @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow,
642  paPrimingOutput
643 */
644 typedef unsigned long PaStreamCallbackFlags;
645 
646 /** In a stream opened with paFramesPerBufferUnspecified, indicates that
647  input data is all silence (zeros) because no real data is available. In a
648  stream opened without paFramesPerBufferUnspecified, it indicates that one or
649  more zero samples have been inserted into the input buffer to compensate
650  for an input underflow.
651  @see PaStreamCallbackFlags
652 */
653 #define paInputUnderflow   ((PaStreamCallbackFlags) 0x00000001)
654 
655 /** In a stream opened with paFramesPerBufferUnspecified, indicates that data
656  prior to the first sample of the input buffer was discarded due to an
657  overflow, possibly because the stream callback is using too much CPU time.
658  Otherwise indicates that data prior to one or more samples in the
659  input buffer was discarded.
660  @see PaStreamCallbackFlags
661 */
662 #define paInputOverflow    ((PaStreamCallbackFlags) 0x00000002)
663 
664 /** Indicates that output data (or a gap) was inserted, possibly because the
665  stream callback is using too much CPU time.
666  @see PaStreamCallbackFlags
667 */
668 #define paOutputUnderflow  ((PaStreamCallbackFlags) 0x00000004)
669 
670 /** Indicates that output data will be discarded because no room is available.
671  @see PaStreamCallbackFlags
672 */
673 #define paOutputOverflow   ((PaStreamCallbackFlags) 0x00000008)
674 
675 /** Some of all of the output data will be used to prime the stream, input
676  data may be zero.
677  @see PaStreamCallbackFlags
678 */
679 #define paPrimingOutput    ((PaStreamCallbackFlags) 0x00000010)
680 
681 /**
682  Allowable return values for the PaStreamCallback.
683  @see PaStreamCallback
684 */
685 typedef enum PaStreamCallbackResult
686 {
687     paContinue=0,
688     paComplete=1,
689     paAbort=2
690 } PaStreamCallbackResult;
691 
692 
693 /**
694  Functions of type PaStreamCallback are implemented by PortAudio clients.
695  They consume, process or generate audio in response to requests from an
696  active PortAudio stream.
697 
698  @param input and @param output are arrays of interleaved samples,
699  the format, packing and number of channels used by the buffers are
700  determined by parameters to Pa_OpenStream().
701 
702  @param frameCount The number of sample frames to be processed by
703  the stream callback.
704 
705  @param timeInfo The time in seconds when the first sample of the input
706  buffer was received at the audio input, the time in seconds when the first
707  sample of the output buffer will begin being played at the audio output, and
708  the time in seconds when the stream callback was called.
709  See also Pa_GetStreamTime()
710 
711  @param statusFlags Flags indicating whether input and/or output buffers
712  have been inserted or will be dropped to overcome underflow or overflow
713  conditions.
714 
715  @param userData The value of a user supplied pointer passed to
716  Pa_OpenStream() intended for storing synthesis data etc.
717 
718  @return
719  The stream callback should return one of the values in the
720  PaStreamCallbackResult enumeration. To ensure that the callback continues
721  to be called, it should return paContinue (0). Either paComplete or paAbort
722  can be returned to finish stream processing, after either of these values is
723  returned the callback will not be called again. If paAbort is returned the
724  stream will finish as soon as possible. If paComplete is returned, the stream
725  will continue until all buffers generated by the callback have been played.
726  This may be useful in applications such as soundfile players where a specific
727  duration of output is required. However, it is not necessary to utilise this
728  mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also
729  be used to stop the stream. The callback must always fill the entire output
730  buffer irrespective of its return value.
731 
732  @see Pa_OpenStream, Pa_OpenDefaultStream
733 
734  @note With the exception of Pa_GetStreamCpuLoad() it is not permissable to call
735  PortAudio API functions from within the stream callback.
736 */
737 typedef int PaStreamCallback(
738     const void *input, void *output,
739     unsigned long frameCount,
740     const PaStreamCallbackTimeInfo* timeInfo,
741     PaStreamCallbackFlags statusFlags,
742     void *userData );
743 
744 
745 /** Opens a stream for either input, output or both.
746 
747  @param stream The address of a PaStream pointer which will receive
748  a pointer to the newly opened stream.
749 
750  @param inputParameters A structure that describes the input parameters used by
751  the opened stream. See PaStreamParameters for a description of these parameters.
752  inputParameters must be NULL for output-only streams.
753 
754  @param outputParameters A structure that describes the output parameters used by
755  the opened stream. See PaStreamParameters for a description of these parameters.
756  outputParameters must be NULL for input-only streams.
757 
758  @param sampleRate The desired sampleRate. For full-duplex streams it is the
759  sample rate for both input and output
760 
761  @param framesPerBuffer The number of frames passed to the stream callback
762  function, or the preferred block granularity for a blocking read/write stream.
763  The special value paFramesPerBufferUnspecified (0) may be used to request that
764  the stream callback will recieve an optimal (and possibly varying) number of
765  frames based on host requirements and the requested latency settings.
766  Note: With some host APIs, the use of non-zero framesPerBuffer for a callback
767  stream may introduce an additional layer of buffering which could introduce
768  additional latency. PortAudio guarantees that the additional latency
769  will be kept to the theoretical minimum however, it is strongly recommended
770  that a non-zero framesPerBuffer value only be used when your algorithm
771  requires a fixed number of frames per stream callback.
772 
773  @param streamFlags Flags which modify the behaviour of the streaming process.
774  This parameter may contain a combination of flags ORed together. Some flags may
775  only be relevant to certain buffer formats.
776 
777  @param streamCallback A pointer to a client supplied function that is responsible
778  for processing and filling input and output buffers. If this parameter is NULL
779  the stream will be opened in 'blocking read/write' mode. In blocking mode,
780  the client can receive sample data using Pa_ReadStream and write sample data
781  using Pa_WriteStream, the number of samples that may be read or written
782  without blocking is returned by Pa_GetStreamReadAvailable and
783  Pa_GetStreamWriteAvailable respectively.
784 
785  @param userData A client supplied pointer which is passed to the stream callback
786  function. It could for example, contain a pointer to instance data necessary
787  for processing the audio buffers. This parameter is ignored if streamCallback
788  is NULL.
789 
790  @return
791  Upon success Pa_OpenStream() returns paNoError and places a pointer to a
792  valid PaStream in the stream argument. The stream is inactive (stopped).
793  If a call to Pa_OpenStream() fails, a non-zero error code is returned (see
794  PaError for possible error codes) and the value of stream is invalid.
795 
796  @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream,
797  Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable
798 */
799 PaError Pa_OpenStream( PaStream** stream,
800                        const PaStreamParameters *inputParameters,
801                        const PaStreamParameters *outputParameters,
802                        double sampleRate,
803                        unsigned long framesPerBuffer,
804                        PaStreamFlags streamFlags,
805                        PaStreamCallback *streamCallback,
806                        void *userData );
807 
808 
809 /** A simplified version of Pa_OpenStream() that opens the default input
810  and/or output devices.
811 
812  @param stream The address of a PaStream pointer which will receive
813  a pointer to the newly opened stream.
814 
815  @param numInputChannels  The number of channels of sound that will be supplied
816  to the stream callback or returned by Pa_ReadStream. It can range from 1 to
817  the value of maxInputChannels in the PaDeviceInfo record for the default input
818  device. If 0 the stream is opened as an output-only stream.
819 
820  @param numOutputChannels The number of channels of sound to be delivered to the
821  stream callback or passed to Pa_WriteStream. It can range from 1 to the value
822  of maxOutputChannels in the PaDeviceInfo record for the default output dvice.
823  If 0 the stream is opened as an output-only stream.
824 
825  @param sampleFormat The sample format of both the input and output buffers
826  provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream.
827  sampleFormat may be any of the formats described by the PaSampleFormat
828  enumeration.
829 
830  @param sampleRate Same as Pa_OpenStream parameter of the same name.
831  @param framesPerBuffer Same as Pa_OpenStream parameter of the same name.
832  @param streamCallback Same as Pa_OpenStream parameter of the same name.
833  @param userData Same as Pa_OpenStream parameter of the same name.
834 
835  @return As for Pa_OpenStream
836 
837  @see Pa_OpenStream, PaStreamCallback
838 */
839 PaError Pa_OpenDefaultStream( PaStream** stream,
840                               int numInputChannels,
841                               int numOutputChannels,
842                               PaSampleFormat sampleFormat,
843                               double sampleRate,
844                               unsigned long framesPerBuffer,
845                               PaStreamCallback *streamCallback,
846                               void *userData );
847 
848 
849 /** Closes an audio stream. If the audio stream is active it
850  discards any pending buffers as if Pa_AbortStream() had been called.
851 */
852 PaError Pa_CloseStream( PaStream *stream );
853 
854 
855 /** Functions of type PaStreamFinishedCallback are implemented by PortAudio
856  clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback
857  function. Once registered they are called when the stream becomes inactive
858  (ie once a call to Pa_StopStream() will not block).
859  A stream will become inactive after the stream callback returns non-zero,
860  or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio
861  output, if the stream callback returns paComplete, or Pa_StopStream is called,
862  the stream finished callback will not be called until all generated sample data
863  has been played.
864 
865  @param userData The userData parameter supplied to Pa_OpenStream()
866 
867  @see Pa_SetStreamFinishedCallback
868 */
869 typedef void PaStreamFinishedCallback( void *userData );
870 
871 
872 /** Register a stream finished callback function which will be called when the
873  stream becomes inactive. See the description of PaStreamFinishedCallback for
874  further details about when the callback will be called.
875 
876  @param stream a pointer to a PaStream that is in the stopped state - if the
877  stream is not stopped, the stream's finished callback will remain unchanged
878  and an error code will be returned.
879 
880  @param streamFinishedCallback a pointer to a function with the same signature
881  as PaStreamFinishedCallback, that will be called when the stream becomes
882  inactive. Passing NULL for this parameter will un-register a previously
883  registered stream finished callback function.
884 
885  @return on success returns paNoError, otherwise an error code indicating the cause
886  of the error.
887 
888  @see PaStreamFinishedCallback
889 */
890 PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback );
891 
892 
893 /** Commences audio processing.
894 */
895 PaError Pa_StartStream( PaStream *stream );
896 
897 
898 /** Terminates audio processing. It waits until all pending
899  audio buffers have been played before it returns.
900 */
901 PaError Pa_StopStream( PaStream *stream );
902 
903 
904 /** Terminates audio processing immediately without waiting for pending
905  buffers to complete.
906 */
907 PaError Pa_AbortStream( PaStream *stream );
908 
909 
910 /** Determine whether the stream is stopped.
911  A stream is considered to be stopped prior to a successful call to
912  Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream.
913  If a stream callback returns a value other than paContinue the stream is NOT
914  considered to be stopped.
915 
916  @return Returns one (1) when the stream is stopped, zero (0) when
917  the stream is running or, a PaErrorCode (which are always negative) if
918  PortAudio is not initialized or an error is encountered.
919 
920  @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive
921 */
922 PaError Pa_IsStreamStopped( PaStream *stream );
923 
924 
925 /** Determine whether the stream is active.
926  A stream is active after a successful call to Pa_StartStream(), until it
927  becomes inactive either as a result of a call to Pa_StopStream() or
928  Pa_AbortStream(), or as a result of a return value other than paContinue from
929  the stream callback. In the latter case, the stream is considered inactive
930  after the last buffer has finished playing.
931 
932  @return Returns one (1) when the stream is active (ie playing or recording
933  audio), zero (0) when not playing or, a PaErrorCode (which are always negative)
934  if PortAudio is not initialized or an error is encountered.
935 
936  @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped
937 */
938 PaError Pa_IsStreamActive( PaStream *stream );
939 
940 
941 
942 /** A structure containing unchanging information about an open stream.
943  @see Pa_GetStreamInfo
944 */
945 
946 typedef struct PaStreamInfo
947 {
948     /** this is struct version 1 */
949     int structVersion;
950 
951     /** The input latency of the stream in seconds. This value provides the most
952      accurate estimate of input latency available to the implementation. It may
953      differ significantly from the suggestedLatency value passed to Pa_OpenStream().
954      The value of this field will be zero (0.) for output-only streams.
955      @see PaTime
956     */
957     PaTime inputLatency;
958 
959     /** The output latency of the stream in seconds. This value provides the most
960      accurate estimate of output latency available to the implementation. It may
961      differ significantly from the suggestedLatency value passed to Pa_OpenStream().
962      The value of this field will be zero (0.) for input-only streams.
963      @see PaTime
964     */
965     PaTime outputLatency;
966 
967     /** The sample rate of the stream in Hertz (samples per second). In cases
968      where the hardware sample rate is inaccurate and PortAudio is aware of it,
969      the value of this field may be different from the sampleRate parameter
970      passed to Pa_OpenStream(). If information about the actual hardware sample
971      rate is not available, this field will have the same value as the sampleRate
972      parameter passed to Pa_OpenStream().
973     */
974     double sampleRate;
975 
976 } PaStreamInfo;
977 
978 
979 /** Retrieve a pointer to a PaStreamInfo structure containing information
980  about the specified stream.
981  @return A pointer to an immutable PaStreamInfo structure. If the stream
982  parameter invalid, or an error is encountered, the function returns NULL.
983 
984  @param stream A pointer to an open stream previously created with Pa_OpenStream.
985 
986  @note PortAudio manages the memory referenced by the returned pointer,
987  the client must not manipulate or free the memory. The pointer is only
988  guaranteed to be valid until the specified stream is closed.
989 
990  @see PaStreamInfo
991 */
992 const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream );
993 
994 
995 /** Determine the current time for the stream according to the same clock used
996  to generate buffer timestamps. This time may be used for syncronising other
997  events to the audio stream, for example synchronizing audio to MIDI.
998 
999  @return The stream's current time in seconds, or 0 if an error occurred.
1000 
1001  @see PaTime, PaStreamCallback
1002 */
1003 PaTime Pa_GetStreamTime( PaStream *stream );
1004 
1005 
1006 /** Retrieve CPU usage information for the specified stream.
1007  The "CPU Load" is a fraction of total CPU time consumed by a callback stream's
1008  audio processing routines including, but not limited to the client supplied
1009  stream callback. This function does not work with blocking read/write streams.
1010 
1011  This function may be called from the stream callback function or the
1012  application.
1013 
1014  @return
1015  A floating point value, typically between 0.0 and 1.0, where 1.0 indicates
1016  that the stream callback is consuming the maximum number of CPU cycles possible
1017  to maintain real-time operation. A value of 0.5 would imply that PortAudio and
1018  the stream callback was consuming roughly 50% of the available CPU time. The
1019  return value may exceed 1.0. A value of 0.0 will always be returned for a
1020  blocking read/write stream, or if an error occurrs.
1021 */
1022 double Pa_GetStreamCpuLoad( PaStream* stream );
1023 
1024 
1025 /** Read samples from an input stream. The function doesn't return until
1026  the entire buffer has been filled - this may involve waiting for the operating
1027  system to supply the data.
1028 
1029  @param stream A pointer to an open stream previously created with Pa_OpenStream.
1030 
1031  @param buffer A pointer to a buffer of sample frames. The buffer contains
1032  samples in the format specified by the inputParameters->sampleFormat field
1033  used to open the stream, and the number of channels specified by
1034  inputParameters->numChannels. If non-interleaved samples were requested,
1035  buffer is a pointer to the first element of an array of non-interleaved
1036  buffer pointers, one for each channel.
1037 
1038  @param frames The number of frames to be read into buffer. This parameter
1039  is not constrained to a specific range, however high performance applications
1040  will want to match this parameter to the framesPerBuffer parameter used
1041  when opening the stream.
1042 
1043  @return On success PaNoError will be returned, or PaInputOverflowed if input
1044  data was discarded by PortAudio after the previous call and before this call.
1045 */
1046 PaError Pa_ReadStream( PaStream* stream,
1047                        void *buffer,
1048                        unsigned long frames );
1049 
1050 
1051 /** Write samples to an output stream. This function doesn't return until the
1052  entire buffer has been consumed - this may involve waiting for the operating
1053  system to consume the data.
1054 
1055  @param stream A pointer to an open stream previously created with Pa_OpenStream.
1056 
1057  @param buffer A pointer to a buffer of sample frames. The buffer contains
1058  samples in the format specified by the outputParameters->sampleFormat field
1059  used to open the stream, and the number of channels specified by
1060  outputParameters->numChannels. If non-interleaved samples were requested,
1061  buffer is a pointer to the first element of an array of non-interleaved
1062  buffer pointers, one for each channel.
1063 
1064  @param frames The number of frames to be written from buffer. This parameter
1065  is not constrained to a specific range, however high performance applications
1066  will want to match this parameter to the framesPerBuffer parameter used
1067  when opening the stream.
1068 
1069  @return On success PaNoError will be returned, or paOutputUnderflowed if
1070  additional output data was inserted after the previous call and before this
1071  call.
1072 */
1073 PaError Pa_WriteStream( PaStream* stream,
1074                         const void *buffer,
1075                         unsigned long frames );
1076 
1077 
1078 /** Retrieve the number of frames that can be read from the stream without
1079  waiting.
1080 
1081  @return Returns a non-negative value representing the maximum number of frames
1082  that can be read from the stream without blocking or busy waiting or, a
1083  PaErrorCode (which are always negative) if PortAudio is not initialized or an
1084  error is encountered.
1085 */
1086 signed long Pa_GetStreamReadAvailable( PaStream* stream );
1087 
1088 
1089 /** Retrieve the number of frames that can be written to the stream without
1090  waiting.
1091 
1092  @return Returns a non-negative value representing the maximum number of frames
1093  that can be written to the stream without blocking or busy waiting or, a
1094  PaErrorCode (which are always negative) if PortAudio is not initialized or an
1095  error is encountered.
1096 */
1097 signed long Pa_GetStreamWriteAvailable( PaStream* stream );
1098 
1099 
1100 /* Miscellaneous utilities */
1101 
1102 
1103 /** Retrieve the size of a given sample format in bytes.
1104 
1105  @return The size in bytes of a single sample in the specified format,
1106  or paSampleFormatNotSupported if the format is not supported.
1107 */
1108 PaError Pa_GetSampleSize( PaSampleFormat format );
1109 
1110 
1111 /** Put the caller to sleep for at least 'msec' milliseconds. This function is
1112  provided only as a convenience for authors of portable code (such as the tests
1113  and examples in the PortAudio distribution.)
1114 
1115  The function may sleep longer than requested so don't rely on this for accurate
1116  musical timing.
1117 */
1118 void Pa_Sleep( long msec );
1119 
1120 
1121 
1122 #ifdef __cplusplus
1123 }
1124 #endif /* __cplusplus */
1125 #endif /* PORTAUDIO_H */
1126