| @@ -1,466 +1,6 @@ | |||
| // NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio | |||
| #if defined(PORTAUDIO_18) | |||
| # include "portaudio18.h" | |||
| #else | |||
| # include "portaudio19.h" | |||
| #endif | |||
| #ifndef PORT_AUDIO_H | |||
| #define PORT_AUDIO_H | |||
| #ifdef __cplusplus | |||
| extern "C" | |||
| { | |||
| #endif /* __cplusplus */ | |||
| /* | |||
| * $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $ | |||
| * PortAudio Portable Real-Time Audio Library | |||
| * PortAudio API Header File | |||
| * Latest version available at: http://www.audiomulch.com/portaudio/ | |||
| * | |||
| * Copyright (c) 1999-2000 Ross Bencina and Phil Burk | |||
| * | |||
| * Permission is hereby granted, free of charge, to any person obtaining | |||
| * a copy of this software and associated documentation files | |||
| * (the "Software"), to deal in the Software without restriction, | |||
| * including without limitation the rights to use, copy, modify, merge, | |||
| * publish, distribute, sublicense, and/or sell copies of the Software, | |||
| * and to permit persons to whom the Software is furnished to do so, | |||
| * subject to the following conditions: | |||
| * | |||
| * The above copyright notice and this permission notice shall be | |||
| * included in all copies or substantial portions of the Software. | |||
| * | |||
| * Any person wishing to distribute modifications to the Software is | |||
| * requested to send the modifications to the original developer so that | |||
| * they can be incorporated into the canonical version. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
| * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |||
| * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||
| * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||
| * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| * | |||
| */ | |||
| typedef int PaError; | |||
| typedef enum { | |||
| paNoError = 0, | |||
| paHostError = -10000, | |||
| paInvalidChannelCount, | |||
| paInvalidSampleRate, | |||
| paInvalidDeviceId, | |||
| paInvalidFlag, | |||
| paSampleFormatNotSupported, | |||
| paBadIODeviceCombination, | |||
| paInsufficientMemory, | |||
| paBufferTooBig, | |||
| paBufferTooSmall, | |||
| paNullCallback, | |||
| paBadStreamPtr, | |||
| paTimedOut, | |||
| paInternalError, | |||
| paDeviceUnavailable | |||
| } PaErrorNum; | |||
| /* | |||
| Pa_Initialize() is the library initialisation function - call this before | |||
| using the library. | |||
| */ | |||
| PaError Pa_Initialize( void ); | |||
| /* | |||
| Pa_Terminate() is the library termination function - call this after | |||
| using the library. | |||
| */ | |||
| PaError Pa_Terminate( void ); | |||
| /* | |||
| Pa_GetHostError() returns a host specific error code. | |||
| This can be called after receiving a PortAudio error code of paHostError. | |||
| */ | |||
| long Pa_GetHostError( void ); | |||
| /* | |||
| Pa_GetErrorText() translates the supplied PortAudio error number | |||
| into a human readable message. | |||
| */ | |||
| const char *Pa_GetErrorText( PaError errnum ); | |||
| /* | |||
| Sample formats | |||
| These are formats used to pass sound data between the callback and the | |||
| stream. Each device has a "native" format which may be used when optimum | |||
| efficiency or control over conversion is required. | |||
| Formats marked "always available" are supported (emulated) by all | |||
| PortAudio implementations. | |||
| The floating point representation (paFloat32) uses +1.0 and -1.0 as the | |||
| maximum and minimum respectively. | |||
| paUInt8 is an unsigned 8 bit format where 128 is considered "ground" | |||
| */ | |||
| typedef unsigned long PaSampleFormat; | |||
| #define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/ | |||
| #define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/ | |||
| #define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/ | |||
| #define paInt24 ((PaSampleFormat) (1<<3)) | |||
| #define paPackedInt24 ((PaSampleFormat) (1<<4)) | |||
| #define paInt8 ((PaSampleFormat) (1<<5)) | |||
| #define paUInt8 ((PaSampleFormat) (1<<6)) | |||
| #define paCustomFormat ((PaSampleFormat) (1<<16)) | |||
| /* | |||
| Device enumeration mechanism. | |||
| Device ids range from 0 to Pa_CountDevices()-1. | |||
| Devices may support input, output or both. | |||
| */ | |||
| typedef int PaDeviceID; | |||
| #define paNoDevice -1 | |||
| int Pa_CountDevices( void ); | |||
| typedef struct | |||
| { | |||
| int structVersion; | |||
| const char *name; | |||
| int maxInputChannels; | |||
| int maxOutputChannels; | |||
| /* Number of discrete rates, or -1 if range supported. */ | |||
| int numSampleRates; | |||
| /* Array of supported sample rates, or {min,max} if range supported. */ | |||
| const double *sampleRates; | |||
| PaSampleFormat nativeSampleFormats; | |||
| } | |||
| PaDeviceInfo; | |||
| /* | |||
| Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the | |||
| default device ids for input and output respectively, or paNoDevice if | |||
| no device is available. | |||
| The result can be passed to Pa_OpenStream(). | |||
| On the PC, the user can specify a default device by | |||
| setting an environment variable. For example, to use device #1. | |||
| set PA_RECOMMENDED_OUTPUT_DEVICE=1 | |||
| The user should first determine the available device ids by using | |||
| the supplied application "pa_devs". | |||
| */ | |||
| PaDeviceID Pa_GetDefaultInputDeviceID( void ); | |||
| PaDeviceID Pa_GetDefaultOutputDeviceID( void ); | |||
| /* | |||
| Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure | |||
| for the device specified. | |||
| If the device parameter is out of range the function returns NULL. | |||
| PortAudio manages the memory referenced by the returned pointer, the client | |||
| must not manipulate or free the memory. The pointer is only guaranteed to be | |||
| valid between calls to Pa_Initialize() and Pa_Terminate(). | |||
| */ | |||
| const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device ); | |||
| /* | |||
| PaTimestamp is used to represent a continuous sample clock with arbitrary | |||
| start time that can be used for syncronization. The type is used for the | |||
| outTime argument to the PortAudioCallback and as the result of Pa_StreamTime() | |||
| */ | |||
| typedef double PaTimestamp; | |||
| /* | |||
| PortAudioCallback is implemented by PortAudio clients. | |||
| inputBuffer and outputBuffer are arrays of interleaved samples, | |||
| the format, packing and number of channels used by the buffers are | |||
| determined by parameters to Pa_OpenStream() (see below). | |||
| framesPerBuffer is the number of sample frames to be processed by the callback. | |||
| outTime is the time in samples when the buffer(s) processed by | |||
| this callback will begin being played at the audio output. | |||
| See also Pa_StreamTime() | |||
| userData is the value of a user supplied pointer passed to Pa_OpenStream() | |||
| intended for storing synthesis data etc. | |||
| return value: | |||
| The callback can return a non-zero value to stop the stream. This may be | |||
| useful in applications such as soundfile players where a specific duration | |||
| of output is required. However, it is not necessary to utilise this mechanism | |||
| as StopStream() will also terminate the stream. A callback returning a | |||
| non-zero value must fill the entire outputBuffer. | |||
| NOTE: None of the other stream functions may be called from within the | |||
| callback function except for Pa_GetCPULoad(). | |||
| */ | |||
| typedef int (PortAudioCallback)( | |||
| void *inputBuffer, void *outputBuffer, | |||
| unsigned long framesPerBuffer, | |||
| PaTimestamp outTime, void *userData ); | |||
| /* | |||
| Stream flags | |||
| These flags may be supplied (ored together) in the streamFlags argument to | |||
| the Pa_OpenStream() function. | |||
| */ | |||
| #define paNoFlag (0) | |||
| #define paClipOff (1<<0) /* disable default clipping of out of range samples */ | |||
| #define paDitherOff (1<<1) /* disable default dithering */ | |||
| #define paPlatformSpecificFlags (0x00010000) | |||
| typedef unsigned long PaStreamFlags; | |||
| /* | |||
| A single PortAudioStream provides multiple channels of real-time | |||
| input and output audio streaming to a client application. | |||
| Pointers to PortAudioStream objects are passed between PortAudio functions. | |||
| */ | |||
| typedef void PortAudioStream; | |||
| #define PaStream PortAudioStream | |||
| /* | |||
| Pa_OpenStream() opens a stream for either input, output or both. | |||
| stream is the address of a PortAudioStream pointer which will receive | |||
| a pointer to the newly opened stream. | |||
| inputDevice is the id of the device used for input (see PaDeviceID above.) | |||
| inputDevice may be paNoDevice to indicate that an input device is not required. | |||
| numInputChannels is the number of channels of sound to be delivered to the | |||
| callback. It can range from 1 to the value of maxInputChannels in the | |||
| PaDeviceInfo record for the device specified by the inputDevice parameter. | |||
| If inputDevice is paNoDevice numInputChannels is ignored. | |||
| inputSampleFormat is the sample format of inputBuffer provided to the callback | |||
| function. inputSampleFormat may be any of the formats described by the | |||
| PaSampleFormat enumeration (see above). PortAudio guarantees support for | |||
| the device's native formats (nativeSampleFormats in the device info record) | |||
| and additionally 16 and 32 bit integer and 32 bit floating point formats. | |||
| Support for other formats is implementation defined. | |||
| inputDriverInfo is a pointer to an optional driver specific data structure | |||
| containing additional information for device setup or stream processing. | |||
| inputDriverInfo is never required for correct operation. If not used | |||
| inputDriverInfo should be NULL. | |||
| outputDevice is the id of the device used for output (see PaDeviceID above.) | |||
| outputDevice may be paNoDevice to indicate that an output device is not required. | |||
| numOutputChannels is the number of channels of sound to be supplied by the | |||
| callback. See the definition of numInputChannels above for more details. | |||
| outputSampleFormat is the sample format of the outputBuffer filled by the | |||
| callback function. See the definition of inputSampleFormat above for more | |||
| details. | |||
| outputDriverInfo is a pointer to an optional driver specific data structure | |||
| containing additional information for device setup or stream processing. | |||
| outputDriverInfo is never required for correct operation. If not used | |||
| outputDriverInfo should be NULL. | |||
| sampleRate is the desired sampleRate. For full-duplex streams it is the | |||
| sample rate for both input and output | |||
| framesPerBuffer is the length in sample frames of all internal sample buffers | |||
| used for communication with platform specific audio routines. Wherever | |||
| possible this corresponds to the framesPerBuffer parameter passed to the | |||
| callback function. | |||
| numberOfBuffers is the number of buffers used for multibuffered communication | |||
| with the platform specific audio routines. If you pass zero, then an optimum | |||
| value will be chosen for you internally. This parameter is provided only | |||
| as a guide - and does not imply that an implementation must use multibuffered | |||
| i/o when reliable double buffering is available (such as SndPlayDoubleBuffer() | |||
| on the Macintosh.) | |||
| streamFlags may contain a combination of flags ORed together. | |||
| These flags modify the behaviour of the streaming process. Some flags may only | |||
| be relevant to certain buffer formats. | |||
| callback is a pointer to a client supplied function that is responsible | |||
| for processing and filling input and output buffers (see above for details.) | |||
| userData is a client supplied pointer which is passed to the callback | |||
| function. It could for example, contain a pointer to instance data necessary | |||
| for processing the audio buffers. | |||
| return value: | |||
| Upon success Pa_OpenStream() returns PaNoError and places a pointer to a | |||
| valid PortAudioStream in the stream argument. The stream is inactive (stopped). | |||
| If a call to Pa_OpenStream() fails a non-zero error code is returned (see | |||
| PaError above) and the value of stream is invalid. | |||
| */ | |||
| PaError Pa_OpenStream( PortAudioStream** stream, | |||
| PaDeviceID inputDevice, | |||
| int numInputChannels, | |||
| PaSampleFormat inputSampleFormat, | |||
| void *inputDriverInfo, | |||
| PaDeviceID outputDevice, | |||
| int numOutputChannels, | |||
| PaSampleFormat outputSampleFormat, | |||
| void *outputDriverInfo, | |||
| double sampleRate, | |||
| unsigned long framesPerBuffer, | |||
| unsigned long numberOfBuffers, | |||
| PaStreamFlags streamFlags, | |||
| PortAudioCallback *callback, | |||
| void *userData ); | |||
| /* | |||
| Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens | |||
| the default input and/or output devices. Most parameters have identical meaning | |||
| to their Pa_OpenStream() counterparts, with the following exceptions: | |||
| If either numInputChannels or numOutputChannels is 0 the respective device | |||
| is not opened. This has the same effect as passing paNoDevice in the device | |||
| arguments to Pa_OpenStream(). | |||
| sampleFormat applies to both the input and output buffers. | |||
| */ | |||
| PaError Pa_OpenDefaultStream( PortAudioStream** stream, | |||
| int numInputChannels, | |||
| int numOutputChannels, | |||
| PaSampleFormat sampleFormat, | |||
| double sampleRate, | |||
| unsigned long framesPerBuffer, | |||
| unsigned long numberOfBuffers, | |||
| PortAudioCallback *callback, | |||
| void *userData ); | |||
| /* | |||
| Pa_CloseStream() closes an audio stream, flushing any pending buffers. | |||
| */ | |||
| PaError Pa_CloseStream( PortAudioStream* ); | |||
| /* | |||
| Pa_StartStream() and Pa_StopStream() begin and terminate audio processing. | |||
| Pa_StopStream() waits until all pending audio buffers have been played. | |||
| Pa_AbortStream() stops playing immediately without waiting for pending | |||
| buffers to complete. | |||
| */ | |||
| PaError Pa_StartStream( PortAudioStream *stream ); | |||
| PaError Pa_StopStream( PortAudioStream *stream ); | |||
| PaError Pa_AbortStream( PortAudioStream *stream ); | |||
| /* | |||
| Pa_StreamActive() returns one (1) when the stream is active (ie playing | |||
| or recording audio), zero (0) when not playing, or a negative error number | |||
| if the stream is invalid. | |||
| The stream is active between calls to Pa_StartStream() and Pa_StopStream(), | |||
| but may also become inactive if the callback returns a non-zero value. | |||
| In the latter case, the stream is considered inactive after the last | |||
| buffer has finished playing. | |||
| */ | |||
| PaError Pa_StreamActive( PortAudioStream *stream ); | |||
| /* | |||
| Pa_StreamTime() returns the current output time in samples for the stream. | |||
| This time may be used as a time reference (for example synchronizing audio to | |||
| MIDI). | |||
| */ | |||
| PaTimestamp Pa_StreamTime( PortAudioStream *stream ); | |||
| /* | |||
| Pa_GetCPULoad() returns the CPU Load for the stream. | |||
| The "CPU Load" is a fraction of total CPU time consumed by the stream's | |||
| audio processing routines including, but not limited to the client supplied | |||
| callback. | |||
| A value of 0.5 would imply that PortAudio and the sound generating | |||
| callback was consuming roughly 50% of the available CPU time. | |||
| This function may be called from the callback function or the application. | |||
| */ | |||
| double Pa_GetCPULoad( PortAudioStream* stream ); | |||
| /* | |||
| Pa_GetMinNumBuffers() returns the minimum number of buffers required by | |||
| the current host based on minimum latency. | |||
| On the PC, for the DirectSound implementation, latency can be optionally set | |||
| by user by setting an environment variable. | |||
| For example, to set latency to 200 msec, put: | |||
| set PA_MIN_LATENCY_MSEC=200 | |||
| in the AUTOEXEC.BAT file and reboot. | |||
| If the environment variable is not set, then the latency will be determined | |||
| based on the OS. Windows NT has higher latency than Win95. | |||
| */ | |||
| int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate ); | |||
| /* | |||
| Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds. | |||
| You may sleep longer than the requested time so don't rely on this for | |||
| accurate musical timing. | |||
| Pa_Sleep() is provided as a convenience for authors of portable code (such as | |||
| the tests and examples in the PortAudio distribution.) | |||
| */ | |||
| void Pa_Sleep( long msec ); | |||
| /* | |||
| Pa_GetSampleSize() returns the size in bytes of a single sample in the | |||
| supplied PaSampleFormat, or paSampleFormatNotSupported if the format is | |||
| no supported. | |||
| */ | |||
| PaError Pa_GetSampleSize( PaSampleFormat format ); | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif /* __cplusplus */ | |||
| #endif /* PORT_AUDIO_H */ | |||